From 74684234cf389986cac45b72862f95d7c0648084 Mon Sep 17 00:00:00 2001 From: Greg Gauthier Date: Wed, 12 Mar 2025 20:50:48 +0000 Subject: [PATCH] initial commit --- .gitignore | 1 + README.md | 5 + modules/CMakeCache.txt | 469 +++ .../CMakeFiles/3.28.3/CMakeCCompiler.cmake | 74 + .../CMakeFiles/3.28.3/CMakeCXXCompiler.cmake | 85 + .../3.28.3/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 15968 bytes .../3.28.3/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 15992 bytes modules/CMakeFiles/3.28.3/CMakeSystem.cmake | 15 + .../3.28.3/CompilerIdC/CMakeCCompilerId.c | 880 ++++ modules/CMakeFiles/3.28.3/CompilerIdC/a.out | Bin 0 -> 16088 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 869 ++++ modules/CMakeFiles/3.28.3/CompilerIdCXX/a.out | Bin 0 -> 16096 bytes modules/CMakeFiles/CMakeConfigureLog.yaml | 531 +++ .../CMakeDirectoryInformation.cmake | 16 + modules/CMakeFiles/Makefile.cmake | 157 + modules/CMakeFiles/Makefile2 | 504 +++ modules/CMakeFiles/TargetDirectories.txt | 70 + modules/CMakeFiles/cmake.check_cache | 1 + modules/CMakeFiles/progress.marks | 1 + modules/CMakeLists.txt | 61 + modules/Makefile | 329 ++ modules/api/CMakeLists.txt | 58 + modules/api/c++/CMakeLists.txt | 58 + modules/api/c++/call.example/CMakeLists.txt | 93 + modules/api/c++/call.example/HelloWorld.rex | 44 + modules/api/c++/call.example/Makefile.unix | 54 + modules/api/c++/call.example/Makefile.windows | 100 + modules/api/c++/call.example/backward.fnc | 70 + modules/api/c++/call.example/readme.txt | 85 + .../api/c++/call.example/runRexxProgram.cpp | 233 ++ .../api/c++/call.example/stackOverflow.cpp | 242 ++ .../c++/call.example/tooRecursiveTrapped.rex | 55 + .../call.example/tooRecursiveUnhandled.rex | 49 + modules/api/c++/external/CMakeLists.txt | 122 + modules/api/c++/external/Makefile.unix | 70 + modules/api/c++/external/Makefile.windows | 66 + modules/api/c++/external/external_methods.cpp | 133 + .../external/external_methods_routines.cpp | 77 + .../api/c++/external/external_routines.cpp | 120 + modules/api/c++/external/readme.txt | 116 + .../api/c++/external/useExternalMethods.rex | 77 + .../external/useExternalMethodsRoutines.rex | 47 + .../api/c++/external/useExternalRoutines.rex | 64 + .../api/c++/external/useExternalRoutines2.rex | 60 + modules/api/c++/readme.txt | 69 + modules/api/classic/CMakeLists.txt | 59 + modules/api/classic/unix/CMakeCache.txt | 382 ++ .../CMakeFiles/3.28.3/CMakeCCompiler.cmake | 74 + .../CMakeFiles/3.28.3/CMakeCXXCompiler.cmake | 85 + .../3.28.3/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 15968 bytes .../3.28.3/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 15992 bytes .../unix/CMakeFiles/3.28.3/CMakeSystem.cmake | 15 + .../3.28.3/CompilerIdC/CMakeCCompilerId.c | 880 ++++ .../unix/CMakeFiles/3.28.3/CompilerIdC/a.out | Bin 0 -> 16088 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 869 ++++ .../CMakeFiles/3.28.3/CompilerIdCXX/a.out | Bin 0 -> 16096 bytes .../unix/CMakeFiles/CMakeConfigureLog.yaml | 531 +++ .../CMakeDirectoryInformation.cmake | 16 + .../classic/unix/CMakeFiles/Makefile.cmake | 130 + modules/api/classic/unix/CMakeFiles/Makefile2 | 112 + .../unix/CMakeFiles/TargetDirectories.txt | 7 + .../classic/unix/CMakeFiles/cmake.check_cache | 1 + .../classic/unix/CMakeFiles/progress.marks | 1 + .../CMakeFiles/rexxapi1.dir/DependInfo.cmake | 23 + .../unix/CMakeFiles/rexxapi1.dir/build.make | 110 + .../CMakeFiles/rexxapi1.dir/cmake_clean.cmake | 11 + .../rexxapi1.dir/compiler_depend.make | 2 + .../rexxapi1.dir/compiler_depend.ts | 2 + .../unix/CMakeFiles/rexxapi1.dir/depend.make | 2 + .../unix/CMakeFiles/rexxapi1.dir/flags.make | 10 + .../unix/CMakeFiles/rexxapi1.dir/link.txt | 1 + .../CMakeFiles/rexxapi1.dir/progress.make | 3 + modules/api/classic/unix/CMakeLists.txt | 60 + modules/api/classic/unix/Makefile | 230 ++ modules/api/classic/unix/callrexx.README | 64 + .../api/classic/unix/callrexx/CMakeLists.txt | 103 + .../api/classic/unix/callrexx/Makefile.unix | 55 + .../api/classic/unix/callrexx/callrexx1.cpp | 476 +++ modules/api/classic/unix/callrexx/callrexx2.c | 522 +++ .../api/classic/unix/callrexx/del_macro.rex | 54 + modules/api/classic/unix/callrexx/example.rex | 55 + .../api/classic/unix/callrexx/load_macro.rex | 54 + modules/api/classic/unix/callrexx/macros.rex | 52 + .../api/classic/unix/callrexx/startrx1.rex | 57 + .../api/classic/unix/callrexx/startrx2.rex | 65 + .../api/classic/unix/callrexx/startrx3.rex | 67 + modules/api/classic/unix/cmake_install.cmake | 123 + modules/api/classic/unix/rexxapi.README | 66 + .../api/classic/unix/rexxapi1/CMakeLists.txt | 70 + modules/api/classic/unix/rexxapi1/Makefile | 55 + .../api/classic/unix/rexxapi1/Makefile.apple | 55 + .../api/classic/unix/rexxapi1/Makefile.linux | 55 + .../api/classic/unix/rexxapi1/apitest1.rex | 79 + .../api/classic/unix/rexxapi1/librexxapi1.so | Bin 0 -> 15000 bytes modules/api/classic/unix/rexxapi1/readme.txt | 20 + modules/api/classic/unix/rexxapi1/rexxapi1.c | 269 ++ modules/api/classic/unix/rexxapi1/rexxapi1.o | Bin 0 -> 4568 bytes .../api/classic/unix/rexxapi2/CMakeLists.txt | 66 + .../api/classic/unix/rexxapi2/Makefile.apple | 55 + .../api/classic/unix/rexxapi2/Makefile.linux | 55 + .../api/classic/unix/rexxapi2/apitest2.rex | 65 + modules/api/classic/unix/rexxapi2/readme.txt | 20 + modules/api/classic/unix/rexxapi2/rexxapi2.c | 224 + .../api/classic/unix/rexxapi3/CMakeLists.txt | 66 + .../api/classic/unix/rexxapi3/Makefile.apple | 55 + .../api/classic/unix/rexxapi3/Makefile.linux | 55 + .../api/classic/unix/rexxapi3/apitest3.rex | 67 + modules/api/classic/unix/rexxapi3/readme.txt | 20 + modules/api/classic/unix/rexxapi3/rexxapi3.c | 368 ++ modules/api/classic/unix/trexx | 47 + modules/api/classic/windows/CMakeLists.txt | 62 + .../classic/windows/callrxnt/CMakeLists.txt | 68 + .../api/classic/windows/callrxnt/backward.fnc | 58 + .../api/classic/windows/callrxnt/callrxnt.c | 102 + .../api/classic/windows/callrxnt/callrxnt.ico | Bin 0 -> 766 bytes .../api/classic/windows/callrxnt/callrxnt.mak | 65 + .../classic/windows/callrxwn/CMakeLists.txt | 68 + .../api/classic/windows/callrxwn/backward.fnc | 58 + .../api/classic/windows/callrxwn/callrxwn.c | 265 ++ .../api/classic/windows/callrxwn/callrxwn.h | 54 + .../api/classic/windows/callrxwn/callrxwn.ico | Bin 0 -> 766 bytes .../api/classic/windows/callrxwn/callrxwn.mak | 75 + .../api/classic/windows/callrxwn/callrxwn.rc | 51 + modules/api/classic/windows/readme.txt | 134 + .../classic/windows/rexxapi1/CMakeLists.txt | 68 + .../api/classic/windows/rexxapi1/apitest1.rex | 56 + .../api/classic/windows/rexxapi1/rexxapi1.c | 246 ++ .../api/classic/windows/rexxapi1/rexxapi1.def | 7 + .../api/classic/windows/rexxapi1/rexxapi1.mak | 61 + .../classic/windows/rexxapi2/CMakeLists.txt | 68 + .../api/classic/windows/rexxapi2/apitest2.rex | 73 + .../api/classic/windows/rexxapi2/rexxapi2.c | 207 + .../api/classic/windows/rexxapi2/rexxapi2.def | 5 + .../api/classic/windows/rexxapi2/rexxapi2.mak | 62 + .../classic/windows/rexxapi3/CMakeLists.txt | 68 + .../api/classic/windows/rexxapi3/apitest3.rex | 65 + .../api/classic/windows/rexxapi3/rexxapi3.c | 347 ++ .../api/classic/windows/rexxapi3/rexxapi3.def | 6 + .../api/classic/windows/rexxapi3/rexxapi3.mak | 60 + .../classic/windows/rexxexit/CMakeLists.txt | 67 + .../api/classic/windows/rexxexit/rexxexit.c | 168 + .../api/classic/windows/rexxexit/rexxexit.ico | Bin 0 -> 766 bytes .../api/classic/windows/rexxexit/rexxexit.mak | 63 + .../api/classic/windows/rexxexit/testRexxExit | 77 + modules/api/readme.txt | 54 + .../CMakeDirectoryInformation.cmake | 16 + modules/c++/CMakeFiles/progress.marks | 1 + modules/c++/Makefile | 189 + .../CMakeDirectoryInformation.cmake | 16 + .../call.example/CMakeFiles/progress.marks | 1 + .../runRexxProgram.dir/DependInfo.cmake | 23 + .../CMakeFiles/runRexxProgram.dir/build.make | 110 + .../runRexxProgram.dir/cmake_clean.cmake | 11 + .../runRexxProgram.dir/compiler_depend.make | 2 + .../runRexxProgram.dir/compiler_depend.ts | 2 + .../CMakeFiles/runRexxProgram.dir/depend.make | 2 + .../CMakeFiles/runRexxProgram.dir/flags.make | 10 + .../CMakeFiles/runRexxProgram.dir/link.txt | 1 + .../runRexxProgram.dir/progress.make | 3 + .../stackOverflow.dir/DependInfo.cmake | 23 + .../CMakeFiles/stackOverflow.dir/build.make | 110 + .../stackOverflow.dir/cmake_clean.cmake | 11 + .../stackOverflow.dir/compiler_depend.make | 2 + .../stackOverflow.dir/compiler_depend.ts | 2 + .../CMakeFiles/stackOverflow.dir/depend.make | 2 + .../CMakeFiles/stackOverflow.dir/flags.make | 10 + .../CMakeFiles/stackOverflow.dir/link.txt | 1 + .../stackOverflow.dir/progress.make | 3 + modules/c++/call.example/Makefile | 273 ++ modules/c++/call.example/cmake_install.cmake | 180 + modules/c++/cmake_install.cmake | 63 + .../CMakeDirectoryInformation.cmake | 16 + .../external_methods.dir/DependInfo.cmake | 23 + .../external_methods.dir/build.make | 110 + .../external_methods.dir/cmake_clean.cmake | 11 + .../external_methods.dir/compiler_depend.make | 2 + .../external_methods.dir/compiler_depend.ts | 2 + .../external_methods.dir/depend.make | 2 + .../external_methods.dir/flags.make | 10 + .../CMakeFiles/external_methods.dir/link.txt | 1 + .../external_methods.dir/progress.make | 3 + .../DependInfo.cmake | 23 + .../external_methods_routines.dir/build.make | 110 + .../cmake_clean.cmake | 11 + .../compiler_depend.make | 2 + .../compiler_depend.ts | 2 + .../external_methods_routines.dir/depend.make | 2 + .../external_methods_routines.dir/flags.make | 10 + .../external_methods_routines.dir/link.txt | 1 + .../progress.make | 3 + .../external_routines.dir/DependInfo.cmake | 23 + .../external_routines.dir/build.make | 110 + .../external_routines.dir/cmake_clean.cmake | 11 + .../compiler_depend.make | 2 + .../external_routines.dir/compiler_depend.ts | 2 + .../external_routines.dir/depend.make | 2 + .../external_routines.dir/flags.make | 10 + .../CMakeFiles/external_routines.dir/link.txt | 1 + .../external_routines.dir/progress.make | 3 + .../c++/external/CMakeFiles/progress.marks | 1 + modules/c++/external/Makefile | 315 ++ modules/c++/external/cmake_install.cmake | 216 + .../CMakeDirectoryInformation.cmake | 16 + modules/classic/CMakeFiles/progress.marks | 1 + modules/classic/Makefile | 189 + modules/classic/cmake_install.cmake | 50 + .../CMakeDirectoryInformation.cmake | 16 + .../classic/unix/CMakeFiles/progress.marks | 1 + modules/classic/unix/Makefile | 189 + .../CMakeDirectoryInformation.cmake | 16 + .../CMakeFiles/callrexx1.dir/DependInfo.cmake | 23 + .../CMakeFiles/callrexx1.dir/build.make | 110 + .../callrexx1.dir/cmake_clean.cmake | 11 + .../callrexx1.dir/compiler_depend.make | 2 + .../callrexx1.dir/compiler_depend.ts | 2 + .../CMakeFiles/callrexx1.dir/depend.make | 2 + .../CMakeFiles/callrexx1.dir/flags.make | 10 + .../CMakeFiles/callrexx1.dir/link.txt | 1 + .../CMakeFiles/callrexx1.dir/progress.make | 3 + .../CMakeFiles/callrexx2.dir/DependInfo.cmake | 23 + .../CMakeFiles/callrexx2.dir/build.make | 110 + .../callrexx2.dir/cmake_clean.cmake | 11 + .../callrexx2.dir/compiler_depend.make | 2 + .../callrexx2.dir/compiler_depend.ts | 2 + .../CMakeFiles/callrexx2.dir/depend.make | 2 + .../CMakeFiles/callrexx2.dir/flags.make | 10 + .../CMakeFiles/callrexx2.dir/link.txt | 1 + .../CMakeFiles/callrexx2.dir/progress.make | 3 + .../unix/callrexx/CMakeFiles/progress.marks | 1 + modules/classic/unix/callrexx/Makefile | 273 ++ .../classic/unix/callrexx/cmake_install.cmake | 139 + modules/classic/unix/cmake_install.cmake | 68 + .../CMakeDirectoryInformation.cmake | 16 + .../unix/rexxapi1/CMakeFiles/progress.marks | 1 + .../CMakeFiles/rexxapi1.dir/DependInfo.cmake | 23 + .../CMakeFiles/rexxapi1.dir/build.make | 110 + .../CMakeFiles/rexxapi1.dir/cmake_clean.cmake | 11 + .../rexxapi1.dir/compiler_depend.make | 2 + .../rexxapi1.dir/compiler_depend.ts | 2 + .../CMakeFiles/rexxapi1.dir/depend.make | 2 + .../CMakeFiles/rexxapi1.dir/flags.make | 10 + .../rexxapi1/CMakeFiles/rexxapi1.dir/link.txt | 1 + .../CMakeFiles/rexxapi1.dir/progress.make | 3 + modules/classic/unix/rexxapi1/Makefile | 231 ++ .../classic/unix/rexxapi1/cmake_install.cmake | 113 + .../CMakeDirectoryInformation.cmake | 16 + .../unix/rexxapi2/CMakeFiles/progress.marks | 1 + .../CMakeFiles/rexxapi2.dir/DependInfo.cmake | 23 + .../CMakeFiles/rexxapi2.dir/build.make | 110 + .../CMakeFiles/rexxapi2.dir/cmake_clean.cmake | 11 + .../rexxapi2.dir/compiler_depend.make | 2 + .../rexxapi2.dir/compiler_depend.ts | 2 + .../CMakeFiles/rexxapi2.dir/depend.make | 2 + .../CMakeFiles/rexxapi2.dir/flags.make | 10 + .../rexxapi2/CMakeFiles/rexxapi2.dir/link.txt | 1 + .../CMakeFiles/rexxapi2.dir/progress.make | 3 + modules/classic/unix/rexxapi2/Makefile | 231 ++ .../classic/unix/rexxapi2/cmake_install.cmake | 100 + .../CMakeDirectoryInformation.cmake | 16 + .../unix/rexxapi3/CMakeFiles/progress.marks | 1 + .../CMakeFiles/rexxapi3.dir/DependInfo.cmake | 23 + .../CMakeFiles/rexxapi3.dir/build.make | 110 + .../CMakeFiles/rexxapi3.dir/cmake_clean.cmake | 11 + .../rexxapi3.dir/compiler_depend.make | 2 + .../rexxapi3.dir/compiler_depend.ts | 2 + .../CMakeFiles/rexxapi3.dir/depend.make | 2 + .../CMakeFiles/rexxapi3.dir/flags.make | 10 + .../rexxapi3/CMakeFiles/rexxapi3.dir/link.txt | 1 + .../CMakeFiles/rexxapi3.dir/progress.make | 3 + modules/classic/unix/rexxapi3/Makefile | 231 ++ .../classic/unix/rexxapi3/cmake_install.cmake | 100 + modules/cmake_install.cmake | 73 + modules/windows/0ReadMe.first | 81 + modules/windows/CMakeLists.txt | 56 + modules/windows/misc/fileDrop.ReadMe | 18 + modules/windows/misc/fileDrop.empty | 0 modules/windows/misc/fileDrop.input | 14 + modules/windows/misc/fileDrop.rex | 164 + modules/windows/ole/ReadMe.first | 17 + modules/windows/ole/adsi/adsi1.rex | 58 + modules/windows/ole/adsi/adsi2.rex | 77 + modules/windows/ole/adsi/adsi3.rex | 65 + modules/windows/ole/adsi/adsi4.rex | 56 + modules/windows/ole/adsi/adsi5.rex | 57 + modules/windows/ole/adsi/adsi6.rex | 74 + modules/windows/ole/adsi/adsi7.rex | 81 + modules/windows/ole/adsi/adsi8.rex | 60 + modules/windows/ole/apps/AOO_scalc_chart.rex | 138 + .../windows/ole/apps/AOO_simpress_present.rex | 124 + .../ole/apps/AOO_swriter_paragraphs.rex | 115 + .../windows/ole/apps/AOO_swriter_table.rex | 181 + modules/windows/ole/apps/Lotus123.rex | 132 + modules/windows/ole/apps/LotusNotes_mail.rex | 91 + modules/windows/ole/apps/LotusWordPro.rex | 80 + .../ole/apps/LotusWordPro_clickHereFields.mwp | Bin 0 -> 18388 bytes .../ole/apps/LotusWordPro_clickHereFields.rex | 91 + modules/windows/ole/apps/MSAccessDemo.rex | 207 + .../ole/apps/MSAccessDemo_32bit_only.rex | 307 ++ .../windows/ole/apps/MSAccess_contacts.rex | 93 + modules/windows/ole/apps/MSExcel.rex | 120 + modules/windows/ole/apps/MSExcel_cURL.rex | 88 + .../ole/apps/MSExcel_usingRexxArray.rex | 95 + .../ole/apps/MSInternetExplorer_events.rex | 94 + .../apps/MSInternetExplorer_getMethods.rex | 60 + .../ole/apps/MSInternetExplorer_navigate.rex | 75 + .../ole/apps/MSInternetExplorer_search.rex | 159 + .../apps/MSInternetExplorer_stockPrice.rex | 100 + modules/windows/ole/apps/MSOutlook.rex | 72 + .../ole/apps/MSOutlook_monitorInbox.rex | 147 + .../windows/ole/apps/MSPowerPoint_layouts.rex | 83 + .../windows/ole/apps/MSPowerPoint_present.rex | 91 + .../windows/ole/apps/MSWord_createModify.rex | 162 + modules/windows/ole/apps/MSWord_useStyles.rex | 98 + .../ole/apps/ScriptingFileSystemObject.rex | 90 + .../ShellApplication_listSystemFolders.rex | 99 + modules/windows/ole/apps/WScriptNetwork.rex | 68 + modules/windows/ole/apps/WScriptShell.rex | 68 + modules/windows/ole/apps/oleUtils.frm | 435 ++ modules/windows/ole/methinfo/main.rex | 57 + modules/windows/ole/methinfo/methinfo.cls | 71 + modules/windows/ole/oleinfo/createOleInfo.rex | 175 + .../windows/ole/oleinfo/getOleConstants.rex | 182 + modules/windows/ole/oleinfo/listProgIds.rex | 123 + modules/windows/ole/oleinfo/oleinfo.cls | 297 ++ modules/windows/ole/oleinfo/oleinfo.css | 195 + .../windows/ole/oleinfo/oleinfo.properties | 51 + modules/windows/ole/oleinfo/oleinfo2html.frm | 992 +++++ modules/windows/ole/oleinfo/readme.txt | 149 + .../windows/ole/oleinfo/reg_classids4ole.cls | 367 ++ modules/windows/ole/oleinfo/test.rex | 113 + modules/windows/ole/wmi/accounts.rex | 64 + modules/windows/ole/wmi/osinfo.rex | 238 ++ modules/windows/ole/wmi/process.rex | 61 + modules/windows/ole/wmi/services.rex | 163 + modules/windows/oodialog/AnimalGame.rex | 290 ++ modules/windows/oodialog/GUI_Template.rex | 382 ++ modules/windows/oodialog/bmp/bigpiece.bmp | Bin 0 -> 8118 bytes modules/windows/oodialog/bmp/blank.bmp | Bin 0 -> 18238 bytes modules/windows/oodialog/bmp/blanks.bmp | Bin 0 -> 2002 bytes modules/windows/oodialog/bmp/cake.bmp | Bin 0 -> 30970 bytes modules/windows/oodialog/bmp/cake1.bmp | Bin 0 -> 30970 bytes modules/windows/oodialog/bmp/cake10.bmp | Bin 0 -> 30970 bytes modules/windows/oodialog/bmp/cake11.bmp | Bin 0 -> 30970 bytes modules/windows/oodialog/bmp/cake2.bmp | Bin 0 -> 30970 bytes modules/windows/oodialog/bmp/cake3.bmp | Bin 0 -> 30970 bytes modules/windows/oodialog/bmp/cake4.bmp | Bin 0 -> 30970 bytes modules/windows/oodialog/bmp/cake5.bmp | Bin 0 -> 30970 bytes modules/windows/oodialog/bmp/cake6.bmp | Bin 0 -> 30970 bytes modules/windows/oodialog/bmp/cake7.bmp | Bin 0 -> 30970 bytes modules/windows/oodialog/bmp/cake8.bmp | Bin 0 -> 30970 bytes modules/windows/oodialog/bmp/cake9.bmp | Bin 0 -> 30970 bytes modules/windows/oodialog/bmp/cakepiec.bmp | Bin 0 -> 878 bytes modules/windows/oodialog/bmp/chihuahu.bmp | Bin 0 -> 28134 bytes modules/windows/oodialog/bmp/eleph2.bmp | Bin 0 -> 28134 bytes modules/windows/oodialog/bmp/fork.bmp | Bin 0 -> 1350 bytes modules/windows/oodialog/bmp/goat.bmp | Bin 0 -> 28134 bytes modules/windows/oodialog/bmp/handfkle.bmp | Bin 0 -> 918 bytes modules/windows/oodialog/bmp/handfkri.bmp | Bin 0 -> 918 bytes modules/windows/oodialog/bmp/handleft.bmp | Bin 0 -> 918 bytes modules/windows/oodialog/bmp/handrite.bmp | Bin 0 -> 918 bytes modules/windows/oodialog/bmp/horse.bmp | Bin 0 -> 28134 bytes modules/windows/oodialog/bmp/install.bmp | Bin 0 -> 56278 bytes modules/windows/oodialog/bmp/install2.bmp | Bin 0 -> 55318 bytes modules/windows/oodialog/bmp/kanguru.bmp | Bin 0 -> 36046 bytes modules/windows/oodialog/bmp/moose.bmp | Bin 0 -> 28134 bytes .../oodialog/bmp/oodStandardDialogs.ico | Bin 0 -> 161361 bytes .../oodialog/bmp/oodStandardRoutines.ico | Bin 0 -> 157580 bytes modules/windows/oodialog/bmp/phileat.bmp | Bin 0 -> 18238 bytes modules/windows/oodialog/bmp/phileat2.bmp | Bin 0 -> 18238 bytes modules/windows/oodialog/bmp/phileata.bmp | Bin 0 -> 18238 bytes modules/windows/oodialog/bmp/philouch.bmp | Bin 0 -> 18238 bytes modules/windows/oodialog/bmp/philphil.bmp | Bin 0 -> 18238 bytes modules/windows/oodialog/bmp/philslep.bmp | Bin 0 -> 18238 bytes modules/windows/oodialog/bmp/philtest.bmp | Bin 0 -> 18238 bytes modules/windows/oodialog/bmp/philwait.bmp | Bin 0 -> 18238 bytes modules/windows/oodialog/bmp/rhinoce.bmp | Bin 0 -> 28134 bytes modules/windows/oodialog/bmp/s2anim.bmp | Bin 0 -> 13238 bytes modules/windows/oodialog/bmp/s2arch.bmp | Bin 0 -> 13238 bytes modules/windows/oodialog/bmp/s2backg.bmp | Bin 0 -> 289958 bytes modules/windows/oodialog/bmp/s2input.bmp | Bin 0 -> 13238 bytes modules/windows/oodialog/bmp/s2jack.bmp | Bin 0 -> 13238 bytes modules/windows/oodialog/bmp/s2list.bmp | Bin 0 -> 13390 bytes modules/windows/oodialog/bmp/s2mov.bmp | Bin 0 -> 13238 bytes modules/windows/oodialog/bmp/s2philf.bmp | Bin 0 -> 13238 bytes modules/windows/oodialog/bmp/s2prog.bmp | Bin 0 -> 13390 bytes modules/windows/oodialog/bmp/s2prop.bmp | Bin 0 -> 13390 bytes modules/windows/oodialog/bmp/s2scroll.bmp | Bin 0 -> 13238 bytes modules/windows/oodialog/bmp/s2tree.bmp | Bin 0 -> 13390 bytes modules/windows/oodialog/bmp/s2walker.bmp | Bin 0 -> 13238 bytes modules/windows/oodialog/bmp/sealion.bmp | Bin 0 -> 28134 bytes modules/windows/oodialog/bmp/tiger.bmp | Bin 0 -> 28134 bytes modules/windows/oodialog/bmp/wlkfig1.bmp | Bin 0 -> 9718 bytes modules/windows/oodialog/bmp/wlkfig2.bmp | Bin 0 -> 9718 bytes modules/windows/oodialog/bmp/wlkfig3.bmp | Bin 0 -> 9718 bytes modules/windows/oodialog/bmp/wlkfig4.bmp | Bin 0 -> 9718 bytes modules/windows/oodialog/bmp/wlkfig5.bmp | Bin 0 -> 9718 bytes modules/windows/oodialog/bmp/wlkfig6.bmp | Bin 0 -> 9718 bytes modules/windows/oodialog/bmp/wlkfig7.bmp | Bin 0 -> 9718 bytes modules/windows/oodialog/bmp/wlkfig8.bmp | Bin 0 -> 9718 bytes modules/windows/oodialog/calculator.rex | 299 ++ .../controls/ComboBox/comboBoxTypes.h | 51 + .../controls/ComboBox/comboBoxTypes.rc | 63 + .../controls/ComboBox/comboBoxTypes.rex | 194 + .../controls/ListBox/incrementalSearch.rex | 257 ++ .../oodialog/controls/ListView/ReadMe.txt | 69 + .../controls/ListView/columnClickListView.rex | 98 + .../controls/ListView/columnIcons.rex | 223 + .../controls/ListView/customDrawListview.rex | 267 ++ .../controls/ListView/rc/columnIcons.dll | Bin 0 -> 94720 bytes .../controls/ListView/rc/columnIcons.h | 50 + .../controls/ListView/rc/columnIcons.rc | 65 + .../controls/ListView/rc/columnIcons_16.bmp | Bin 0 -> 30774 bytes .../controls/ListView/rc/columnIcons_32.bmp | Bin 0 -> 61494 bytes .../controls/ListView/rc/customDrawListView.h | 43 + .../ListView/rc/customDrawListView.rc | 52 + .../oodialog/controls/ListView/rc/res.mak | 50 + .../ListView/subitem.editing/ReadMe.txt | 77 + .../subitem.editing/dropDownComboBox.rex | 271 ++ .../subitem.editing/dropDownListComboBox.rex | 262 ++ .../ListView/subitem.editing/editControl.rex | 254 ++ .../ListView/subitem.editing/importList.h | 56 + .../ListView/subitem.editing/importList.rc | 82 + .../ListView/subitem.editing/importList.rex | 615 +++ .../oodialog/controls/PaidHolidays.rex | 251 ++ modules/windows/oodialog/controls/ReadMe.txt | 83 + .../controls/ToolBar/customizeToolBar.rex | 312 ++ .../controls/ToolBar/rc/ToolBar11IL.bmp | Bin 0 -> 19062 bytes .../controls/ToolBar/rc/customizeToolBar.dll | Bin 0 -> 21504 bytes .../controls/ToolBar/rc/customizeToolBar.h | 58 + .../controls/ToolBar/rc/customizeToolBar.rc | 57 + .../oodialog/controls/ToolBar/rc/res.mak | 55 + .../oodialog/controls/ToolBar/rc/toolBar.dll | Bin 0 -> 2048 bytes .../oodialog/controls/ToolBar/rc/toolBar.h | 47 + .../oodialog/controls/ToolBar/rc/toolBar.rc | 52 + .../oodialog/controls/ToolBar/toolBar.rex | 126 + .../oodialog/controls/ToolTip/ReadMe.txt | 80 + .../controls/ToolTip/comboBoxToolTip.h | 54 + .../controls/ToolTip/comboBoxToolTip.rc | 55 + .../controls/ToolTip/comboBoxToolTip.rex | 663 +++ .../controls/ToolTip/customPositionToolTip.h | 44 + .../controls/ToolTip/customPositionToolTip.rc | 53 + .../ToolTip/customPositionToolTip.rex | 202 + .../controls/ToolTip/manageControlTool.h | 44 + .../controls/ToolTip/manageControlTool.rc | 53 + .../controls/ToolTip/manageControlTool.rex | 293 ++ .../oodialog/controls/ToolTip/musicNote.ico | Bin 0 -> 51881 bytes .../oodialog/controls/ToolTip/toolTip.rex | 327 ++ .../TreeView/rc/treeViewCustomDraw.bmp | Bin 0 -> 502 bytes .../controls/TreeView/rc/treeViewCustomDraw.h | 53 + .../TreeView/rc/treeViewCustomDraw.rc | 77 + .../controls/TreeView/treeViewCustomDraw.inp | 105 + .../controls/TreeView/treeViewCustomDraw.rex | 850 ++++ .../controls/TreeView/treeViewCustomDrawI.inp | 10 + .../windows/oodialog/controls/fiscalReports.h | 52 + .../oodialog/controls/fiscalReports.rc | 60 + .../oodialog/controls/fiscalReports.rex | 741 ++++ .../windows/oodialog/controls/paidHolidays.h | 44 + .../windows/oodialog/controls/paidHolidays.rc | 53 + modules/windows/oodialog/controls/upDown.h | 60 + modules/windows/oodialog/controls/upDown.rc | 76 + modules/windows/oodialog/controls/upDown.rex | 592 +++ .../windows/oodialog/controls/userStringDTP.h | 54 + .../oodialog/controls/userStringDTP.hlp | 77 + .../oodialog/controls/userStringDTP.rc | 76 + .../oodialog/controls/userStringDTP.rex | 646 +++ modules/windows/oodialog/editrex.rex | 185 + modules/windows/oodialog/examples/ReadMe.txt | 96 + .../windows/oodialog/examples/addManyRows.rex | 609 +++ .../oodialog/examples/browsePrinters.rex | 220 + .../oodialog/examples/fileNameDialog_demo.rex | 225 ++ modules/windows/oodialog/examples/genGUID.rex | 75 + .../windows/oodialog/examples/imageButton.rex | 513 +++ .../oodialog/examples/openSaveFileDemo.rex | 538 +++ .../oodialog/examples/publicRoutines_demo.rex | 377 ++ .../oodialog/examples/resources/CheckIn.bmp | Bin 0 -> 4150 bytes .../examples/resources/ClosePalette.bmp | Bin 0 -> 4150 bytes .../examples/resources/CodeReview.bmp | Bin 0 -> 4150 bytes .../oodialog/examples/resources/Default.bmp | Bin 0 -> 8518 bytes .../oodialog/examples/resources/Disabled.bmp | Bin 0 -> 8518 bytes .../oodialog/examples/resources/Hot.bmp | Bin 0 -> 8518 bytes .../oodialog/examples/resources/LinkToWeb.bmp | Bin 0 -> 4150 bytes .../examples/resources/LockModule.bmp | Bin 0 -> 4150 bytes .../examples/resources/LockProject.bmp | Bin 0 -> 4150 bytes .../oodialog/examples/resources/Normal.bmp | Bin 0 -> 8518 bytes .../examples/resources/ProjectReview.bmp | Bin 0 -> 4150 bytes .../oodialog/examples/resources/Pushed.bmp | Bin 0 -> 8518 bytes .../oodialog/examples/resources/SaveAll.bmp | Bin 0 -> 4150 bytes .../examples/resources/SaveModule.bmp | Bin 0 -> 4150 bytes .../examples/resources/SaveProject.bmp | Bin 0 -> 4150 bytes .../examples/resources/SplitModule.bmp | Bin 0 -> 4150 bytes .../oodialog/examples/resources/Update.bmp | Bin 0 -> 4150 bytes .../oodialog/examples/resources/addManyRows.h | 69 + .../examples/resources/addManyRows.rc | 106 + .../oodialog/examples/resources/genGUID.h | 43 + .../oodialog/examples/resources/genGUID.rc | 51 + .../oodialog/examples/resources/imageButton.h | 45 + .../examples/resources/imageButton.rc | 53 + .../oodialog/examples/resources/osfDialogs.h | 65 + .../oodialog/examples/resources/osfDialogs.rc | 80 + .../examples/resources/saveFileWithFilter.h | 54 + .../examples/resources/saveFileWithFilter.rc | 79 + .../oodialog/examples/resources/useTools.h | 51 + .../oodialog/examples/saveFileWithFilter.rex | 408 ++ .../oodialog/examples/simpleFolderBrowse.rex | 135 + .../windows/oodialog/examples/stopWatch.rex | 189 + .../windows/oodialog/examples/useTools.rex | 360 ++ modules/windows/oodialog/ftyperex.rex | 181 + .../windows/oodialog/menus/BinaryMenuBar.rex | 141 + modules/windows/oodialog/menus/ContextMenu.h | 58 + modules/windows/oodialog/menus/ContextMenu.rc | 68 + .../windows/oodialog/menus/ContextMenu.rex | 726 ++++ .../windows/oodialog/menus/ScriptMenuBar.h | 72 + .../windows/oodialog/menus/ScriptMenuBar.rc | 105 + .../windows/oodialog/menus/ScriptMenuBar.rex | 196 + .../windows/oodialog/menus/UserMenuBar.bmp | Bin 0 -> 57078 bytes modules/windows/oodialog/menus/UserMenuBar.h | 111 + modules/windows/oodialog/menus/UserMenuBar.rc | 184 + .../windows/oodialog/menus/UserMenuBar.rex | 575 +++ modules/windows/oodialog/mouse/dragNdrop.h | 45 + modules/windows/oodialog/mouse/dragNdrop.rc | 59 + modules/windows/oodialog/mouse/dragNdrop.rex | 515 +++ modules/windows/oodialog/mouse/dragging.cur | Bin 0 -> 4286 bytes modules/windows/oodialog/mouse/mouseWheel.h | 52 + modules/windows/oodialog/mouse/mouseWheel.rc | 74 + modules/windows/oodialog/mouse/mouseWheel.rex | 761 ++++ modules/windows/oodialog/mouse/nflPlayers.txt | 113 + modules/windows/oodialog/oleinfo/help.txt | 164 + modules/windows/oodialog/oleinfo/icons.bmp | Bin 0 -> 601 bytes modules/windows/oodialog/oleinfo/oleinfo.rc | 116 + modules/windows/oodialog/oleinfo/oleinfo.rex | 654 +++ modules/windows/oodialog/ooDraw.h | 50 + .../oodialog/ooRexxTry/doc/ooRexxTry.pdf | Bin 0 -> 20963 bytes .../windows/oodialog/ooRexxTry/ooRexxTry.rex | 983 +++++ modules/windows/oodialog/oobandit.rex | 428 ++ modules/windows/oodialog/oobmpvu.rex | 114 + .../windows/oodialog/oodStandardDialogs.rex | 232 ++ .../windows/oodialog/oodStandardRoutines.rex | 330 ++ modules/windows/oodialog/oodpbar.rex | 186 + modules/windows/oodialog/oodraw.rex | 721 ++++ modules/windows/oodialog/oograph.rex | 237 ++ modules/windows/oodialog/oophil.ico | Bin 0 -> 766 bytes modules/windows/oodialog/oophil.rex | 430 ++ modules/windows/oodialog/oovideo.rex | 168 + modules/windows/oodialog/oowalk2.rex | 293 ++ modules/windows/oodialog/oowalker.rex | 285 ++ .../PropertySheetDemo.rex | 633 +++ .../propertysheet.tabControls/TabDemo.rex | 952 +++++ .../TabOwnerDemo.rex | 786 ++++ .../propertysheet.tabControls/UserTabDemo.rex | 666 +++ .../oodListViews.rex | 1031 +++++ .../rc/PropertySheetDemo.dll | Bin 0 -> 4608 bytes .../rc/PropertySheetDemo.h | 78 + .../rc/PropertySheetDemo.rc | 138 + .../rc/TabOwnerDemo.dll | Bin 0 -> 4608 bytes .../rc/TabOwnerDemo.h | 77 + .../rc/TabOwnerDemo.rc | 135 + .../rc/TabOwnerDemoListView.bmp | Bin 0 -> 2102 bytes .../rc/TabOwnerDemoTab.bmp | Bin 0 -> 7734 bytes .../rc/TabOwnerDemoTreeView.bmp | Bin 0 -> 11894 bytes .../rc/UserTabDemo.h | 159 + .../rc/UserTabDemo.rc | 305 ++ .../rc/oodListViews.h | 61 + .../rc/oodListViews.rc | 97 + .../rc/oodListViews1.bmp | Bin 0 -> 502 bytes .../rc/oodListViews2.bmp | Bin 0 -> 1142 bytes .../rc/propertySheetDemoListView.bmp | Bin 0 -> 2102 bytes .../rc/propertySheetDemoTab.bmp | Bin 0 -> 7734 bytes .../rc/propertySheetDemoTreeView.bmp | Bin 0 -> 11894 bytes .../rc/ticketWizard.h | 95 + .../rc/ticketWizard.rc | 70 + .../rc/ticketWizardMovie.bmp | Bin 0 -> 43798 bytes .../rc/ticketWizardRexxLA.bmp | Bin 0 -> 154542 bytes .../rc/ticketWizardTheater.bmp | Bin 0 -> 9658 bytes .../rc/ticketWizardTicket.bmp | Bin 0 -> 17398 bytes .../ticketWizard.rex | 1275 ++++++ modules/windows/oodialog/rc/AnimalGame.h | 67 + modules/windows/oodialog/rc/AnimalGame.rc | 111 + modules/windows/oodialog/rc/calculator.rc | 117 + modules/windows/oodialog/rc/exercise.rc | 66 + modules/windows/oodialog/rc/ldvideo.h | 56 + modules/windows/oodialog/rc/ldvideo.rc | 81 + .../windows/oodialog/rc/oodStandardDialogs.h | 69 + .../windows/oodialog/rc/oodStandardDialogs.rc | 95 + modules/windows/oodialog/rc/oodpbar.rc | 76 + modules/windows/oodialog/rc/oophil1.rc | 70 + modules/windows/oodialog/rc/oophil2.rc | 75 + modules/windows/oodialog/rc/sample.rc | 63 + modules/windows/oodialog/rc/walker.h | 55 + modules/windows/oodialog/rc/walker.rc | 71 + modules/windows/oodialog/res/AnimalGame.dll | Bin 0 -> 264192 bytes modules/windows/oodialog/res/oowalk2.dll | Bin 0 -> 80384 bytes modules/windows/oodialog/res/res.mak | 71 + .../DialogAreaU/dlgAreaUDemo.h | 51 + .../DialogAreaU/dlgAreaUDemo.rex | 101 + .../DialogAreaU/dlgAreaUDemoThree.rex | 282 ++ .../DialogAreaU/dlgAreaUDemoTwo.rex | 194 + .../oodialog/resizableDialogs/ReadMe.txt | 20 + .../ResizingAdmin/PropertySheetDemo.rex | 922 +++++ .../ResizingAdmin/TabDemo.rex | 1294 ++++++ .../ResizingAdmin/augmentedResize.rex | 306 ++ .../ResizingAdmin/basicResize.rex | 66 + .../ResizingAdmin/gbStationary.rex | 244 ++ .../ResizingAdmin/rc/PropertySheetDemo.dll | Bin 0 -> 4608 bytes .../ResizingAdmin/rc/PropertySheetDemo.h | 83 + .../ResizingAdmin/rc/PropertySheetDemo.rc | 137 + .../ResizingAdmin/rc/basicResize.h | 50 + .../ResizingAdmin/rc/basicResize.rc | 62 + .../ResizingAdmin/rc/gbStationary.h | 50 + .../ResizingAdmin/rc/gbStationary.rc | 61 + .../rc/propertySheetDemoListView.bmp | Bin 0 -> 2102 bytes .../ResizingAdmin/rc/propertySheetDemoTab.bmp | Bin 0 -> 7734 bytes .../rc/propertySheetDemoTreeView.bmp | Bin 0 -> 11894 bytes modules/windows/oodialog/sample.rex | 143 + modules/windows/oodialog/samplesSetup.rex | 60 + .../windows/oodialog/simple/ChangeFont.rex | 127 + modules/windows/oodialog/simple/ReadMe.txt | 63 + .../oodialog/simple/SimpleMonthCalendar.h | 44 + .../oodialog/simple/SimpleMonthCalendar.rc | 53 + .../oodialog/simple/SimpleMonthCalendar.rex | 84 + .../windows/oodialog/simple/SimpleUpDown.rex | 81 + modules/windows/oodialog/sysinfo/sysInfo.h | 40 + modules/windows/oodialog/sysinfo/sysinfo.rc | 56 + modules/windows/oodialog/sysinfo/sysinfo.rex | 219 + modules/windows/oodialog/tutorial/add.bmp | Bin 0 -> 3046 bytes .../windows/oodialog/tutorial/drawing1.rex | 93 + .../windows/oodialog/tutorial/drawing2.rex | 152 + .../windows/oodialog/tutorial/drawing3.rex | 137 + .../windows/oodialog/tutorial/drawing4.rex | 112 + .../windows/oodialog/tutorial/drawing5.rex | 153 + modules/windows/oodialog/tutorial/drawings.rc | 60 + modules/windows/oodialog/tutorial/employe1.rc | 69 + .../windows/oodialog/tutorial/employe1.rex | 58 + modules/windows/oodialog/tutorial/employe2.rc | 70 + .../windows/oodialog/tutorial/employe2.rex | 72 + modules/windows/oodialog/tutorial/employe3.rc | 72 + .../windows/oodialog/tutorial/employe3.rex | 75 + modules/windows/oodialog/tutorial/employe4.rc | 72 + .../windows/oodialog/tutorial/employe4.rex | 76 + .../oodialog/tutorial/employe4validate.rex | 84 + modules/windows/oodialog/tutorial/employe5.rc | 83 + .../windows/oodialog/tutorial/employe5.rex | 127 + modules/windows/oodialog/tutorial/employe6.rc | 83 + .../windows/oodialog/tutorial/employe6.rex | 164 + modules/windows/oodialog/tutorial/employe7.h | 63 + modules/windows/oodialog/tutorial/employe7.rc | 108 + .../windows/oodialog/tutorial/employe7.rex | 196 + modules/windows/oodialog/tutorial/employe8.rc | 72 + .../windows/oodialog/tutorial/employe8.rex | 231 ++ .../windows/oodialog/tutorial/employe9.rex | 197 + .../oodialog/tutorial/employe9menuDyn.rex | 239 ++ .../oodialog/tutorial/employee10menuRc.rex | 300 ++ .../windows/oodialog/tutorial/employee11tab.h | 82 + .../oodialog/tutorial/employee11tab.rc | 136 + .../oodialog/tutorial/employee11tab.rex | 1058 +++++ modules/windows/oodialog/tutorial/logo.bmp | Bin 0 -> 165078 bytes .../windows/oodialog/tutorial/textScroll.rc | 66 + .../windows/oodialog/tutorial/textScroll.rex | 81 + modules/windows/oodialog/userGuide/ReadMe.txt | 49 + .../exercises/Exercise02/HelloWorld.rex | 67 + .../userGuide/exercises/Exercise02/WoW.rex | 69 + .../userGuide/exercises/Exercise02/WoW2.rex | 94 + .../exercises/Exercise03/Startup.rex | 63 + .../userGuide/exercises/Exercise03/Wow3.rex | 192 + .../exercises/Exercise03/WowData.rex | 97 + .../exercises/Exercise03/WowModel.rex | 84 + .../exercises/Exercise03/WowView.rex | 111 + .../Exercise04/CustomerModelData.rex | 143 + .../exercises/Exercise04/CustomerView.h | 64 + .../exercises/Exercise04/CustomerView.rc | 80 + .../exercises/Exercise04/CustomerView.rex | 324 ++ .../Exercise04/Extras/DlgData/ASimpleDialog.h | 44 + .../Extras/DlgData/ASimpleDialog.rc | 57 + .../Extras/DlgData/ASimpleDialog.rex | 121 + .../Extras/DlgData/ASimpleDialog2.rex | 125 + .../Extras/DlgData/res/ASimpleDialog.dll | Bin 0 -> 2048 bytes .../Exercise04/Extras/DlgData/res/res.mak | 50 + .../exercises/Exercise04/Extras/ReadMe.txt | 49 + .../exercises/Exercise04/Startup.rex | 64 + .../exercises/Exercise05/ProductModelData.rex | 169 + .../exercises/Exercise05/ProductView.h | 67 + .../exercises/Exercise05/ProductView.rc | 102 + .../exercises/Exercise05/ProductView.rex | 480 +++ .../exercises/Exercise05/Startup.rex | 57 + .../Exercise05/Support/NumberOnlyEditEx.cls | 526 +++ .../exercises/Exercise05/res/ProductIcon.bmp | Bin 0 -> 268234 bytes .../exercises/Exercise05/res/ProductView.dll | Bin 0 -> 271360 bytes .../exercises/Exercise05/res/res.mak | 50 + .../Exercise06/Customer/CustomerListView.h | 48 + .../Exercise06/Customer/CustomerListView.rc | 73 + .../Exercise06/Customer/CustomerListView.rex | 250 ++ .../Exercise06/Customer/CustomerModelData.rex | 142 + .../Exercise06/Customer/CustomerView.h | 63 + .../Exercise06/Customer/CustomerView.rc | 85 + .../Exercise06/Customer/CustomerView.rex | 366 ++ .../Exercise06/Customer/StartupCustomer.rex | 60 + .../Customer/StartupCustomerList.rex | 57 + .../Exercise06/Customer/bmp/CustList.bmp | Bin 0 -> 2166 bytes .../Exercise06/Customer/bmp/CustList.ico | Bin 0 -> 2686 bytes .../Exercise06/Customer/bmp/Customer.ico | Bin 0 -> 2686 bytes .../Exercise06/Extras/Popups/OffsetPopups.rex | 286 ++ .../Exercise06/Extras/Popups/Popups.rex | 221 + .../exercises/Exercise06/Extras/ReadMe.txt | 49 + .../Exercise06/Order/OrderFormView.h | 53 + .../Exercise06/Order/OrderFormView.rc | 98 + .../Exercise06/Order/OrderFormView.rex | 188 + .../Exercise06/Order/OrderListView.h | 48 + .../Exercise06/Order/OrderListView.rc | 73 + .../Exercise06/Order/OrderListView.rex | 250 ++ .../Exercise06/Order/OrderModelData.rex | 139 + .../exercises/Exercise06/Order/OrderView.h | 51 + .../exercises/Exercise06/Order/OrderView.rc | 87 + .../exercises/Exercise06/Order/OrderView.rex | 174 + .../Exercise06/Order/StartupOrder.rex | 54 + .../Exercise06/Order/StartupOrderForm.rex | 54 + .../Exercise06/Order/StartupOrderList.rex | 54 + .../Exercise06/Order/bmp/OrderForm.bmp | Bin 0 -> 2166 bytes .../Exercise06/Order/bmp/OrderForm.ico | Bin 0 -> 2686 bytes .../Exercise06/Order/bmp/OrderList.bmp | Bin 0 -> 16438 bytes .../Exercise06/Order/bmp/OrderList.ico | Bin 0 -> 2686 bytes .../Exercise06/OrderMgr/OrderMgrView.h | 57 + .../Exercise06/OrderMgr/OrderMgrView.rc | 96 + .../Exercise06/OrderMgr/OrderMgrView.rex | 333 ++ .../Exercise06/OrderMgr/RequiresList.rex | 58 + .../Exercise06/Product/ProductListView.h | 48 + .../Exercise06/Product/ProductListView.rc | 76 + .../Exercise06/Product/ProductListView.rex | 237 ++ .../Exercise06/Product/ProductModelData.rex | 171 + .../Exercise06/Product/ProductView.h | 69 + .../Exercise06/Product/ProductView.rc | 124 + .../Exercise06/Product/ProductView.rex | 499 +++ .../Exercise06/Product/StartupProduct.rex | 62 + .../Exercise06/Product/StartupProductList.rex | 57 + .../Exercise06/Product/res/ProdList.bmp | Bin 0 -> 2166 bytes .../Exercise06/Product/res/ProdList.ico | Bin 0 -> 2686 bytes .../Exercise06/Product/res/Product.ico | Bin 0 -> 1406 bytes .../Exercise06/Product/res/ProductIcon.bmp | Bin 0 -> 268234 bytes .../Exercise06/Product/res/ProductView.dll | Bin 0 -> 272896 bytes .../exercises/Exercise06/Product/res/res.mak | 50 + .../exercises/Exercise06/Startup.rex | 63 + .../Exercise06/Support/NumberOnlyEditEx.cls | 526 +++ .../Exercise07/Customer/CustomerFile.txt | 6 + .../Exercise07/Customer/CustomerListView.h | 48 + .../Exercise07/Customer/CustomerListView.rc | 73 + .../Exercise07/Customer/CustomerListView.rex | 254 ++ .../Customer/CustomerModelsData.rex | 241 ++ .../Exercise07/Customer/CustomerView.h | 63 + .../Exercise07/Customer/CustomerView.rc | 85 + .../Exercise07/Customer/CustomerView.rex | 339 ++ .../Exercise07/Customer/bmp/CustList.BMP | Bin 0 -> 2166 bytes .../Exercise07/Customer/bmp/CustList.ico | Bin 0 -> 2686 bytes .../Exercise07/Customer/bmp/Customer.ico | Bin 0 -> 2686 bytes .../Exercise07/Extras/Person/PersonFile.txt | 6 + .../Extras/Person/PersonModelData.rex | 195 + .../Exercise07/Extras/Person/PersonView.h | 48 + .../Exercise07/Extras/Person/PersonView.rc | 73 + .../Exercise07/Extras/Person/PersonView.rex | 143 + .../exercises/Exercise07/Extras/ReadMe.txt | 49 + .../Exercise07/Extras/Wow4/WowData.rex | 151 + .../Exercise07/Extras/Wow4/WowFile.txt | 27 + .../Exercise07/Extras/Wow4/WowModel.rex | 128 + .../Exercise07/Extras/Wow4/WowView.rex | 139 + .../Exercise07/Order/OrderFormView.h | 65 + .../Exercise07/Order/OrderFormView.rc | 99 + .../Exercise07/Order/OrderFormView.rex | 421 ++ .../Exercise07/Order/OrderHeadersFile.txt | 6 + .../Exercise07/Order/OrderLinesFile.txt | 13 + .../Exercise07/Order/OrderListView.h | 48 + .../Exercise07/Order/OrderListView.rc | 73 + .../Exercise07/Order/OrderListView.rex | 251 ++ .../Exercise07/Order/OrderModelsData.rex | 501 +++ .../exercises/Exercise07/Order/OrderView.h | 57 + .../exercises/Exercise07/Order/OrderView.rc | 101 + .../exercises/Exercise07/Order/OrderView.rex | 296 ++ .../Exercise07/Order/bmp/OrderForm.bmp | Bin 0 -> 2166 bytes .../Exercise07/Order/bmp/OrderForm.ico | Bin 0 -> 2686 bytes .../Exercise07/Order/bmp/OrderList.bmp | Bin 0 -> 16438 bytes .../Exercise07/Order/bmp/OrderList.ico | Bin 0 -> 2686 bytes .../Exercise07/OrderMgr/OrderMgrView.h | 59 + .../Exercise07/OrderMgr/OrderMgrView.rc | 98 + .../Exercise07/OrderMgr/OrderMgrView.rex | 399 ++ .../Exercise07/OrderMgr/RequiresList.rex | 62 + .../Exercise07/Product/ProductFile.txt | 7 + .../Exercise07/Product/ProductListView.h | 48 + .../Exercise07/Product/ProductListView.rc | 76 + .../Exercise07/Product/ProductListView.rex | 249 ++ .../Exercise07/Product/ProductModelsData.rex | 265 ++ .../Exercise07/Product/ProductView.h | 69 + .../Exercise07/Product/ProductView.rc | 124 + .../Exercise07/Product/ProductView.rex | 492 +++ .../Exercise07/Product/res/ProdList.BMP | Bin 0 -> 2166 bytes .../Exercise07/Product/res/ProdList.ico | Bin 0 -> 2686 bytes .../Exercise07/Product/res/Product.ico | Bin 0 -> 1406 bytes .../Exercise07/Product/res/ProductIcon.bmp | Bin 0 -> 268234 bytes .../Exercise07/Product/res/ProductView.dll | Bin 0 -> 272896 bytes .../exercises/Exercise07/Product/res/res.mak | 50 + .../exercises/Exercise07/RequiresList.rex | 84 + .../exercises/Exercise07/Startup.rex | 74 + .../Exercise07/Support/GenericFile.rex | 271 ++ .../Exercise07/Support/MessageSender.h | 14 + .../Exercise07/Support/MessageSender.rc | 35 + .../Exercise07/Support/MessageSender.rex | 559 +++ .../exercises/Exercise07/Support/Model.rex | 186 + .../Exercise07/Support/NumberOnlyEditEx.cls | 526 +++ .../Exercise07/Support/ObjectMgr.rex | 302 ++ .../exercises/Exercise07/Support/RcView.rex | 143 + .../exercises/Exercise07/Support/ResView.rex | 145 + .../exercises/Exercise07/Support/UdView.rex | 140 + .../exercises/Exercise07/Support/ViewMgr.rex | 122 + .../Exercise08/Customer/CustomerFile.txt | 6 + .../Exercise08/Customer/CustomerListView.h | 48 + .../Exercise08/Customer/CustomerListView.rc | 73 + .../Exercise08/Customer/CustomerListView.rex | 260 ++ .../Customer/CustomerModelsData.rex | 242 ++ .../Exercise08/Customer/CustomerView.h | 63 + .../Exercise08/Customer/CustomerView.rc | 85 + .../Exercise08/Customer/CustomerView.rex | 352 ++ .../Exercise08/Customer/bmp/CustList.BMP | Bin 0 -> 2166 bytes .../Exercise08/Customer/bmp/CustList.ico | Bin 0 -> 2686 bytes .../Exercise08/Customer/bmp/Customer.cur | Bin 0 -> 2686 bytes .../Exercise08/Customer/bmp/Customer.ico | Bin 0 -> 2686 bytes .../Exercise08/Extras/Person/PersonFile.txt | 6 + .../Extras/Person/PersonModelData.rex | 195 + .../Exercise08/Extras/Person/PersonView.h | 48 + .../Exercise08/Extras/Person/PersonView.rc | 73 + .../Exercise08/Extras/Person/PersonView.rex | 146 + .../exercises/Exercise08/Extras/ReadMe.txt | 49 + .../Exercise08/Order/OrderFormView.h | 33 + .../Exercise08/Order/OrderFormView.rc | 99 + .../Exercise08/Order/OrderFormView.rex | 953 +++++ .../Exercise08/Order/OrderHeadersFile.txt | 6 + .../Exercise08/Order/OrderLinesFile.txt | 13 + .../Exercise08/Order/OrderListView.h | 48 + .../Exercise08/Order/OrderListView.rc | 73 + .../Exercise08/Order/OrderListView.rex | 255 ++ .../Exercise08/Order/OrderModelsData.rex | 517 +++ .../exercises/Exercise08/Order/OrderView.h | 57 + .../exercises/Exercise08/Order/OrderView.rc | 101 + .../exercises/Exercise08/Order/OrderView.rex | 283 ++ .../Exercise08/Order/bmp/OrderForm.bmp | Bin 0 -> 2166 bytes .../Exercise08/Order/bmp/OrderForm.ico | Bin 0 -> 2686 bytes .../Exercise08/Order/bmp/OrderList.bmp | Bin 0 -> 16438 bytes .../Exercise08/Order/bmp/OrderList.ico | Bin 0 -> 2686 bytes .../Exercise08/OrderMgr/OrderMgrView.h | 59 + .../Exercise08/OrderMgr/OrderMgrView.rc | 98 + .../Exercise08/OrderMgr/OrderMgrView.rex | 411 ++ .../Exercise08/OrderMgr/RequiresList.rex | 64 + .../Exercise08/Product/ProductFile.txt | 7 + .../Exercise08/Product/ProductListView.h | 48 + .../Exercise08/Product/ProductListView.rc | 76 + .../Exercise08/Product/ProductListView.rex | 255 ++ .../Exercise08/Product/ProductModelsData.rex | 266 ++ .../Exercise08/Product/ProductView.h | 69 + .../Exercise08/Product/ProductView.rc | 124 + .../Exercise08/Product/ProductView.rex | 501 +++ .../Exercise08/Product/res/ProdList.BMP | Bin 0 -> 2166 bytes .../Exercise08/Product/res/ProdList.ico | Bin 0 -> 2686 bytes .../Exercise08/Product/res/Product.cur | Bin 0 -> 1406 bytes .../Exercise08/Product/res/Product.ico | Bin 0 -> 1406 bytes .../Exercise08/Product/res/ProductIcon.bmp | Bin 0 -> 268234 bytes .../Exercise08/Product/res/ProductView.dll | Bin 0 -> 272896 bytes .../exercises/Exercise08/Product/res/res.mak | 50 + .../exercises/Exercise08/RequiresList.rex | 87 + .../exercises/Exercise08/Startup.rex | 81 + .../Exercise08/Support/Component.rex | 118 + .../exercises/Exercise08/Support/DragMgr.rex | 352 ++ .../exercises/Exercise08/Support/EventMgr.rex | 134 + .../Exercise08/Support/GenericFile.rex | 274 ++ .../Exercise08/Support/MessageSender.h | 14 + .../Exercise08/Support/MessageSender.rc | 35 + .../Exercise08/Support/MessageSender.rex | 590 +++ .../exercises/Exercise08/Support/Model.rex | 187 + .../Exercise08/Support/NumberOnlyEditEx.cls | 526 +++ .../Exercise08/Support/ObjectMgr.rex | 352 ++ .../exercises/Exercise08/Support/View.rex | 363 ++ .../exercises/Exercise08/Support/ViewMgr.rex | 122 + modules/windows/oodialog/wav/byebye.wav | Bin 0 -> 44056 bytes modules/windows/oodialog/wav/cancel.wav | Bin 0 -> 77238 bytes modules/windows/oodialog/wav/clap.wav | Bin 0 -> 86250 bytes modules/windows/oodialog/wav/elephant.wav | Bin 0 -> 75412 bytes modules/windows/oodialog/wav/goat.wav | Bin 0 -> 79610 bytes modules/windows/oodialog/wav/gotcha.wav | Bin 0 -> 100490 bytes modules/windows/oodialog/wav/guess.wav | Bin 0 -> 68882 bytes modules/windows/oodialog/wav/help.wav | Bin 0 -> 32828 bytes modules/windows/oodialog/wav/horse.wav | Bin 0 -> 94058 bytes modules/windows/oodialog/wav/inst.wav | Bin 0 -> 34806 bytes modules/windows/oodialog/wav/jackpot.wav | Bin 0 -> 65670 bytes modules/windows/oodialog/wav/moose.wav | Bin 0 -> 62840 bytes modules/windows/oodialog/wav/nope.wav | Bin 0 -> 14884 bytes modules/windows/oodialog/wav/philcake.wav | Bin 0 -> 97534 bytes modules/windows/oodialog/wav/phileat.wav | Bin 0 -> 131128 bytes modules/windows/oodialog/wav/philhelp.wav | Bin 0 -> 80762 bytes modules/windows/oodialog/wav/philouch.wav | Bin 0 -> 43950 bytes modules/windows/oodialog/wav/philslep.wav | Bin 0 -> 84580 bytes modules/windows/oodialog/wav/philstop.wav | Bin 0 -> 104592 bytes modules/windows/oodialog/wav/philstrt.wav | Bin 0 -> 81976 bytes modules/windows/oodialog/wav/philwait.wav | Bin 0 -> 79024 bytes modules/windows/oodialog/wav/readme.txt | 50 + modules/windows/oodialog/wav/rhino.wav | Bin 0 -> 62322 bytes modules/windows/oodialog/wav/sample.wav | Bin 0 -> 180678 bytes modules/windows/oodialog/wav/sealion.wav | Bin 0 -> 77240 bytes modules/windows/oodialog/wav/start.wav | Bin 0 -> 64528 bytes modules/windows/oodialog/wav/take.wav | Bin 0 -> 88264 bytes modules/windows/oodialog/wav/tiger.wav | Bin 0 -> 68562 bytes modules/windows/oodialog/wav/whistle.wav | Bin 0 -> 78710 bytes modules/windows/oodialog/wav/yourgood.wav | Bin 0 -> 63160 bytes .../windows/oodialog/winsystem/deskicon.rex | 99 + .../windows/oodialog/winsystem/desktop.rex | 66 + .../oodialog/winsystem/displayAnyMenu.rex | 189 + .../oodialog/winsystem/displayWindowTree.rex | 275 ++ .../windows/oodialog/winsystem/eventlog.rex | 529 +++ .../oodialog/winsystem/getTheWindow.rex | 199 + .../windows/oodialog/winsystem/menuCalc.rex | 183 + .../oodialog/winsystem/menuNotepad.rex | 109 + .../windows/oodialog/winsystem/quickCalc.rex | 221 + .../oodialog/winsystem/quickShowAllMenus.rex | 94 + .../windows/oodialog/winsystem/registry.rex | 196 + .../windows/oodialog/winsystem/usewmgr.rex | 431 ++ .../oodialog/winsystem/winSystemDlgs.h | 52 + .../oodialog/winsystem/winSystemDlgs.rc | 87 + .../oodialog/winsystem/windowsSystem.frm | 917 +++++ .../oodialog/winsystem/writeWithNotepad.rex | 186 + modules/windows/rexutils/drives.rex | 253 ++ projects/mvs/dasducb.rex | 15 + projects/mvs/who.rex | 16 + projects/oorexx/1plus1.rex | 2 + projects/oorexx/address-test.rex | 7 + projects/oorexx/contacts.rdbx | 0 projects/oorexx/dist.rex | 56 + projects/oorexx/drawbox.rex | 23 + projects/oorexx/experiment.rex | 17 + projects/oorexx/hello.rex | 41 + projects/oorexx/minimal_ncurses.rex | 16 + projects/oorexx/mouse_thing.rex | 22 + projects/oorexx/move_demo.rex | 16 + projects/oorexx/ncurses_test.rex | 22 + projects/oorexx/probe_orxncurses.rex | 19 + projects/oorexx/rexxcurl.rexx | 13 + projects/oorexx/stuff.rex | 21 + projects/oorexx/test.rex | 4 + projects/oorexx/test_getrexxpackage.rex | 14 + projects/oorexx/test_init.rex | 23 + projects/oorexx/test_orxncurses.rex | 26 + projects/oorexx/test_rxfuncadd.rex | 18 + projects/oorexx/text-attrs.rex | 26 + projects/text/jabberwocky.txt | 38 + samples/mvs/addcmds.rex | 161 + samples/mvs/alist.rex | 389 ++ samples/mvs/blox.rex | 214 + samples/mvs/cmds.rex | 194 + samples/mvs/cpuid.rex | 129 + samples/mvs/free.clist | 10 + samples/mvs/gettrid.rex | 60 + samples/mvs/gotdsn.clist | 29 + samples/mvs/iplinfo.rex | 3586 +++++++++++++++++ samples/mvs/jobcards.rex | 242 ++ samples/mvs/post.rex | 408 ++ samples/mvs/redit.rex | 161 + samples/mvs/testducb.rex | 18 + samples/mvs/testvtoc.rex | 30 + samples/mvs/xedit.rex | 75 + samples/oorexx/Enumeration.cls | 158 + samples/oorexx/arithmeticEvaluation.rex | 338 ++ samples/oorexx/arrayCallback.rex | 84 + samples/oorexx/ccreply.rex | 65 + samples/oorexx/complex.cls | 210 + samples/oorexx/concurrency.rex | 111 + samples/oorexx/constrained.rex | 80 + samples/oorexx/delegation.rex | 105 + samples/oorexx/distance.rex | 90 + samples/oorexx/dynamicMethod.rex | 89 + samples/oorexx/factor.rex | 70 + samples/oorexx/getOoRexxDocs.rex | 164 + samples/oorexx/getmail-pop3.rexx | 92 + samples/oorexx/getright.rexx | 100 + samples/oorexx/greply.rex | 86 + samples/oorexx/guess.rex | 174 + samples/oorexx/httppost.rexx | 80 + samples/oorexx/interface.rex | 106 + samples/oorexx/ktguard.rex | 72 + samples/oorexx/makestring.rex | 226 ++ samples/oorexx/month.rex | 77 + samples/oorexx/omdbcurl.orx | 70 + samples/oorexx/philfork.rex | 137 + samples/oorexx/pipe.cls | 1078 +++++ samples/oorexx/properties.rex | 184 + samples/oorexx/qdate.rex | 139 + samples/oorexx/qtime.rex | 147 + samples/oorexx/readme.txt | 97 + samples/oorexx/rexxcps.rex | 143 + samples/oorexx/rexxtry.rex | 257 ++ samples/oorexx/scclient.rex | 42 + samples/oorexx/scp.rexx | 121 + samples/oorexx/scserver.rex | 98 + samples/oorexx/semcls.cls | 263 ++ samples/oorexx/sendmail-smtp.conf | 4 + samples/oorexx/sendmail-smtp.rexx | 123 + samples/oorexx/sfclient.rex | 44 + samples/oorexx/sfserver.rex | 96 + samples/oorexx/singleLinkedList.rex | 191 + samples/oorexx/sortComposite.rex | 142 + samples/oorexx/sscclient.rex | 94 + samples/oorexx/stack.rex | 87 + samples/oorexx/synchronousConcurrency.rex | 142 + samples/oorexx/testcurl.rexx | 77 + samples/oorexx/timezone.rex | 176 + samples/oorexx/treeDirectory.cls | 605 +++ samples/oorexx/treeTraversal.rex | 158 + samples/oorexx/upload.rexx | 88 + samples/oorexx/usecomp.rex | 71 + samples/oorexx/usepipe.rex | 128 + samples/oorexx/usesingleton.rex | 80 + samples/oorexx/usetree.rex | 72 + 1012 files changed, 116081 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 modules/CMakeCache.txt create mode 100644 modules/CMakeFiles/3.28.3/CMakeCCompiler.cmake create mode 100644 modules/CMakeFiles/3.28.3/CMakeCXXCompiler.cmake create mode 100755 modules/CMakeFiles/3.28.3/CMakeDetermineCompilerABI_C.bin create mode 100755 modules/CMakeFiles/3.28.3/CMakeDetermineCompilerABI_CXX.bin create mode 100644 modules/CMakeFiles/3.28.3/CMakeSystem.cmake create mode 100644 modules/CMakeFiles/3.28.3/CompilerIdC/CMakeCCompilerId.c create mode 100755 modules/CMakeFiles/3.28.3/CompilerIdC/a.out create mode 100644 modules/CMakeFiles/3.28.3/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 modules/CMakeFiles/3.28.3/CompilerIdCXX/a.out create mode 100644 modules/CMakeFiles/CMakeConfigureLog.yaml create mode 100644 modules/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 modules/CMakeFiles/Makefile.cmake create mode 100644 modules/CMakeFiles/Makefile2 create mode 100644 modules/CMakeFiles/TargetDirectories.txt create mode 100644 modules/CMakeFiles/cmake.check_cache create mode 100644 modules/CMakeFiles/progress.marks create mode 100644 modules/CMakeLists.txt create mode 100644 modules/Makefile create mode 100644 modules/api/CMakeLists.txt create mode 100644 modules/api/c++/CMakeLists.txt create mode 100644 modules/api/c++/call.example/CMakeLists.txt create mode 100644 modules/api/c++/call.example/HelloWorld.rex create mode 100644 modules/api/c++/call.example/Makefile.unix create mode 100644 modules/api/c++/call.example/Makefile.windows create mode 100644 modules/api/c++/call.example/backward.fnc create mode 100644 modules/api/c++/call.example/readme.txt create mode 100644 modules/api/c++/call.example/runRexxProgram.cpp create mode 100644 modules/api/c++/call.example/stackOverflow.cpp create mode 100644 modules/api/c++/call.example/tooRecursiveTrapped.rex create mode 100644 modules/api/c++/call.example/tooRecursiveUnhandled.rex create mode 100644 modules/api/c++/external/CMakeLists.txt create mode 100644 modules/api/c++/external/Makefile.unix create mode 100644 modules/api/c++/external/Makefile.windows create mode 100644 modules/api/c++/external/external_methods.cpp create mode 100644 modules/api/c++/external/external_methods_routines.cpp create mode 100644 modules/api/c++/external/external_routines.cpp create mode 100644 modules/api/c++/external/readme.txt create mode 100755 modules/api/c++/external/useExternalMethods.rex create mode 100755 modules/api/c++/external/useExternalMethodsRoutines.rex create mode 100755 modules/api/c++/external/useExternalRoutines.rex create mode 100755 modules/api/c++/external/useExternalRoutines2.rex create mode 100644 modules/api/c++/readme.txt create mode 100644 modules/api/classic/CMakeLists.txt create mode 100644 modules/api/classic/unix/CMakeCache.txt create mode 100644 modules/api/classic/unix/CMakeFiles/3.28.3/CMakeCCompiler.cmake create mode 100644 modules/api/classic/unix/CMakeFiles/3.28.3/CMakeCXXCompiler.cmake create mode 100755 modules/api/classic/unix/CMakeFiles/3.28.3/CMakeDetermineCompilerABI_C.bin create mode 100755 modules/api/classic/unix/CMakeFiles/3.28.3/CMakeDetermineCompilerABI_CXX.bin create mode 100644 modules/api/classic/unix/CMakeFiles/3.28.3/CMakeSystem.cmake create mode 100644 modules/api/classic/unix/CMakeFiles/3.28.3/CompilerIdC/CMakeCCompilerId.c create mode 100755 modules/api/classic/unix/CMakeFiles/3.28.3/CompilerIdC/a.out create mode 100644 modules/api/classic/unix/CMakeFiles/3.28.3/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 modules/api/classic/unix/CMakeFiles/3.28.3/CompilerIdCXX/a.out create mode 100644 modules/api/classic/unix/CMakeFiles/CMakeConfigureLog.yaml create mode 100644 modules/api/classic/unix/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 modules/api/classic/unix/CMakeFiles/Makefile.cmake create mode 100644 modules/api/classic/unix/CMakeFiles/Makefile2 create mode 100644 modules/api/classic/unix/CMakeFiles/TargetDirectories.txt create mode 100644 modules/api/classic/unix/CMakeFiles/cmake.check_cache create mode 100644 modules/api/classic/unix/CMakeFiles/progress.marks create mode 100644 modules/api/classic/unix/CMakeFiles/rexxapi1.dir/DependInfo.cmake create mode 100644 modules/api/classic/unix/CMakeFiles/rexxapi1.dir/build.make create mode 100644 modules/api/classic/unix/CMakeFiles/rexxapi1.dir/cmake_clean.cmake create mode 100644 modules/api/classic/unix/CMakeFiles/rexxapi1.dir/compiler_depend.make create mode 100644 modules/api/classic/unix/CMakeFiles/rexxapi1.dir/compiler_depend.ts create mode 100644 modules/api/classic/unix/CMakeFiles/rexxapi1.dir/depend.make create mode 100644 modules/api/classic/unix/CMakeFiles/rexxapi1.dir/flags.make create mode 100644 modules/api/classic/unix/CMakeFiles/rexxapi1.dir/link.txt create mode 100644 modules/api/classic/unix/CMakeFiles/rexxapi1.dir/progress.make create mode 100644 modules/api/classic/unix/CMakeLists.txt create mode 100644 modules/api/classic/unix/Makefile create mode 100644 modules/api/classic/unix/callrexx.README create mode 100644 modules/api/classic/unix/callrexx/CMakeLists.txt create mode 100644 modules/api/classic/unix/callrexx/Makefile.unix create mode 100644 modules/api/classic/unix/callrexx/callrexx1.cpp create mode 100644 modules/api/classic/unix/callrexx/callrexx2.c create mode 100755 modules/api/classic/unix/callrexx/del_macro.rex create mode 100755 modules/api/classic/unix/callrexx/example.rex create mode 100755 modules/api/classic/unix/callrexx/load_macro.rex create mode 100755 modules/api/classic/unix/callrexx/macros.rex create mode 100755 modules/api/classic/unix/callrexx/startrx1.rex create mode 100755 modules/api/classic/unix/callrexx/startrx2.rex create mode 100755 modules/api/classic/unix/callrexx/startrx3.rex create mode 100644 modules/api/classic/unix/cmake_install.cmake create mode 100644 modules/api/classic/unix/rexxapi.README create mode 100644 modules/api/classic/unix/rexxapi1/CMakeLists.txt create mode 100644 modules/api/classic/unix/rexxapi1/Makefile create mode 100644 modules/api/classic/unix/rexxapi1/Makefile.apple create mode 100644 modules/api/classic/unix/rexxapi1/Makefile.linux create mode 100755 modules/api/classic/unix/rexxapi1/apitest1.rex create mode 100755 modules/api/classic/unix/rexxapi1/librexxapi1.so create mode 100644 modules/api/classic/unix/rexxapi1/readme.txt create mode 100644 modules/api/classic/unix/rexxapi1/rexxapi1.c create mode 100644 modules/api/classic/unix/rexxapi1/rexxapi1.o create mode 100644 modules/api/classic/unix/rexxapi2/CMakeLists.txt create mode 100644 modules/api/classic/unix/rexxapi2/Makefile.apple create mode 100644 modules/api/classic/unix/rexxapi2/Makefile.linux create mode 100755 modules/api/classic/unix/rexxapi2/apitest2.rex create mode 100644 modules/api/classic/unix/rexxapi2/readme.txt create mode 100644 modules/api/classic/unix/rexxapi2/rexxapi2.c create mode 100644 modules/api/classic/unix/rexxapi3/CMakeLists.txt create mode 100644 modules/api/classic/unix/rexxapi3/Makefile.apple create mode 100644 modules/api/classic/unix/rexxapi3/Makefile.linux create mode 100755 modules/api/classic/unix/rexxapi3/apitest3.rex create mode 100644 modules/api/classic/unix/rexxapi3/readme.txt create mode 100644 modules/api/classic/unix/rexxapi3/rexxapi3.c create mode 100644 modules/api/classic/unix/trexx create mode 100644 modules/api/classic/windows/CMakeLists.txt create mode 100644 modules/api/classic/windows/callrxnt/CMakeLists.txt create mode 100644 modules/api/classic/windows/callrxnt/backward.fnc create mode 100644 modules/api/classic/windows/callrxnt/callrxnt.c create mode 100644 modules/api/classic/windows/callrxnt/callrxnt.ico create mode 100644 modules/api/classic/windows/callrxnt/callrxnt.mak create mode 100644 modules/api/classic/windows/callrxwn/CMakeLists.txt create mode 100644 modules/api/classic/windows/callrxwn/backward.fnc create mode 100644 modules/api/classic/windows/callrxwn/callrxwn.c create mode 100644 modules/api/classic/windows/callrxwn/callrxwn.h create mode 100644 modules/api/classic/windows/callrxwn/callrxwn.ico create mode 100644 modules/api/classic/windows/callrxwn/callrxwn.mak create mode 100644 modules/api/classic/windows/callrxwn/callrxwn.rc create mode 100644 modules/api/classic/windows/readme.txt create mode 100644 modules/api/classic/windows/rexxapi1/CMakeLists.txt create mode 100755 modules/api/classic/windows/rexxapi1/apitest1.rex create mode 100644 modules/api/classic/windows/rexxapi1/rexxapi1.c create mode 100644 modules/api/classic/windows/rexxapi1/rexxapi1.def create mode 100644 modules/api/classic/windows/rexxapi1/rexxapi1.mak create mode 100644 modules/api/classic/windows/rexxapi2/CMakeLists.txt create mode 100755 modules/api/classic/windows/rexxapi2/apitest2.rex create mode 100644 modules/api/classic/windows/rexxapi2/rexxapi2.c create mode 100644 modules/api/classic/windows/rexxapi2/rexxapi2.def create mode 100644 modules/api/classic/windows/rexxapi2/rexxapi2.mak create mode 100644 modules/api/classic/windows/rexxapi3/CMakeLists.txt create mode 100755 modules/api/classic/windows/rexxapi3/apitest3.rex create mode 100644 modules/api/classic/windows/rexxapi3/rexxapi3.c create mode 100644 modules/api/classic/windows/rexxapi3/rexxapi3.def create mode 100644 modules/api/classic/windows/rexxapi3/rexxapi3.mak create mode 100644 modules/api/classic/windows/rexxexit/CMakeLists.txt create mode 100644 modules/api/classic/windows/rexxexit/rexxexit.c create mode 100644 modules/api/classic/windows/rexxexit/rexxexit.ico create mode 100644 modules/api/classic/windows/rexxexit/rexxexit.mak create mode 100644 modules/api/classic/windows/rexxexit/testRexxExit create mode 100644 modules/api/readme.txt create mode 100644 modules/c++/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 modules/c++/CMakeFiles/progress.marks create mode 100644 modules/c++/Makefile create mode 100644 modules/c++/call.example/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 modules/c++/call.example/CMakeFiles/progress.marks create mode 100644 modules/c++/call.example/CMakeFiles/runRexxProgram.dir/DependInfo.cmake create mode 100644 modules/c++/call.example/CMakeFiles/runRexxProgram.dir/build.make create mode 100644 modules/c++/call.example/CMakeFiles/runRexxProgram.dir/cmake_clean.cmake create mode 100644 modules/c++/call.example/CMakeFiles/runRexxProgram.dir/compiler_depend.make create mode 100644 modules/c++/call.example/CMakeFiles/runRexxProgram.dir/compiler_depend.ts create mode 100644 modules/c++/call.example/CMakeFiles/runRexxProgram.dir/depend.make create mode 100644 modules/c++/call.example/CMakeFiles/runRexxProgram.dir/flags.make create mode 100644 modules/c++/call.example/CMakeFiles/runRexxProgram.dir/link.txt create mode 100644 modules/c++/call.example/CMakeFiles/runRexxProgram.dir/progress.make create mode 100644 modules/c++/call.example/CMakeFiles/stackOverflow.dir/DependInfo.cmake create mode 100644 modules/c++/call.example/CMakeFiles/stackOverflow.dir/build.make create mode 100644 modules/c++/call.example/CMakeFiles/stackOverflow.dir/cmake_clean.cmake create mode 100644 modules/c++/call.example/CMakeFiles/stackOverflow.dir/compiler_depend.make create mode 100644 modules/c++/call.example/CMakeFiles/stackOverflow.dir/compiler_depend.ts create mode 100644 modules/c++/call.example/CMakeFiles/stackOverflow.dir/depend.make create mode 100644 modules/c++/call.example/CMakeFiles/stackOverflow.dir/flags.make create mode 100644 modules/c++/call.example/CMakeFiles/stackOverflow.dir/link.txt create mode 100644 modules/c++/call.example/CMakeFiles/stackOverflow.dir/progress.make create mode 100644 modules/c++/call.example/Makefile create mode 100644 modules/c++/call.example/cmake_install.cmake create mode 100644 modules/c++/cmake_install.cmake create mode 100644 modules/c++/external/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 modules/c++/external/CMakeFiles/external_methods.dir/DependInfo.cmake create mode 100644 modules/c++/external/CMakeFiles/external_methods.dir/build.make create mode 100644 modules/c++/external/CMakeFiles/external_methods.dir/cmake_clean.cmake create mode 100644 modules/c++/external/CMakeFiles/external_methods.dir/compiler_depend.make create mode 100644 modules/c++/external/CMakeFiles/external_methods.dir/compiler_depend.ts create mode 100644 modules/c++/external/CMakeFiles/external_methods.dir/depend.make create mode 100644 modules/c++/external/CMakeFiles/external_methods.dir/flags.make create mode 100644 modules/c++/external/CMakeFiles/external_methods.dir/link.txt create mode 100644 modules/c++/external/CMakeFiles/external_methods.dir/progress.make create mode 100644 modules/c++/external/CMakeFiles/external_methods_routines.dir/DependInfo.cmake create mode 100644 modules/c++/external/CMakeFiles/external_methods_routines.dir/build.make create mode 100644 modules/c++/external/CMakeFiles/external_methods_routines.dir/cmake_clean.cmake create mode 100644 modules/c++/external/CMakeFiles/external_methods_routines.dir/compiler_depend.make create mode 100644 modules/c++/external/CMakeFiles/external_methods_routines.dir/compiler_depend.ts create mode 100644 modules/c++/external/CMakeFiles/external_methods_routines.dir/depend.make create mode 100644 modules/c++/external/CMakeFiles/external_methods_routines.dir/flags.make create mode 100644 modules/c++/external/CMakeFiles/external_methods_routines.dir/link.txt create mode 100644 modules/c++/external/CMakeFiles/external_methods_routines.dir/progress.make create mode 100644 modules/c++/external/CMakeFiles/external_routines.dir/DependInfo.cmake create mode 100644 modules/c++/external/CMakeFiles/external_routines.dir/build.make create mode 100644 modules/c++/external/CMakeFiles/external_routines.dir/cmake_clean.cmake create mode 100644 modules/c++/external/CMakeFiles/external_routines.dir/compiler_depend.make create mode 100644 modules/c++/external/CMakeFiles/external_routines.dir/compiler_depend.ts create mode 100644 modules/c++/external/CMakeFiles/external_routines.dir/depend.make create mode 100644 modules/c++/external/CMakeFiles/external_routines.dir/flags.make create mode 100644 modules/c++/external/CMakeFiles/external_routines.dir/link.txt create mode 100644 modules/c++/external/CMakeFiles/external_routines.dir/progress.make create mode 100644 modules/c++/external/CMakeFiles/progress.marks create mode 100644 modules/c++/external/Makefile create mode 100644 modules/c++/external/cmake_install.cmake create mode 100644 modules/classic/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 modules/classic/CMakeFiles/progress.marks create mode 100644 modules/classic/Makefile create mode 100644 modules/classic/cmake_install.cmake create mode 100644 modules/classic/unix/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 modules/classic/unix/CMakeFiles/progress.marks create mode 100644 modules/classic/unix/Makefile create mode 100644 modules/classic/unix/callrexx/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/DependInfo.cmake create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/cmake_clean.cmake create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/compiler_depend.make create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/compiler_depend.ts create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/depend.make create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/flags.make create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/link.txt create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/progress.make create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/DependInfo.cmake create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/cmake_clean.cmake create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/compiler_depend.make create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/compiler_depend.ts create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/depend.make create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/flags.make create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/link.txt create mode 100644 modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/progress.make create mode 100644 modules/classic/unix/callrexx/CMakeFiles/progress.marks create mode 100644 modules/classic/unix/callrexx/Makefile create mode 100644 modules/classic/unix/callrexx/cmake_install.cmake create mode 100644 modules/classic/unix/cmake_install.cmake create mode 100644 modules/classic/unix/rexxapi1/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 modules/classic/unix/rexxapi1/CMakeFiles/progress.marks create mode 100644 modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/DependInfo.cmake create mode 100644 modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make create mode 100644 modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/cmake_clean.cmake create mode 100644 modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/compiler_depend.make create mode 100644 modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/compiler_depend.ts create mode 100644 modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/depend.make create mode 100644 modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/flags.make create mode 100644 modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/link.txt create mode 100644 modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/progress.make create mode 100644 modules/classic/unix/rexxapi1/Makefile create mode 100644 modules/classic/unix/rexxapi1/cmake_install.cmake create mode 100644 modules/classic/unix/rexxapi2/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 modules/classic/unix/rexxapi2/CMakeFiles/progress.marks create mode 100644 modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/DependInfo.cmake create mode 100644 modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make create mode 100644 modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/cmake_clean.cmake create mode 100644 modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/compiler_depend.make create mode 100644 modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/compiler_depend.ts create mode 100644 modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/depend.make create mode 100644 modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/flags.make create mode 100644 modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/link.txt create mode 100644 modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/progress.make create mode 100644 modules/classic/unix/rexxapi2/Makefile create mode 100644 modules/classic/unix/rexxapi2/cmake_install.cmake create mode 100644 modules/classic/unix/rexxapi3/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 modules/classic/unix/rexxapi3/CMakeFiles/progress.marks create mode 100644 modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/DependInfo.cmake create mode 100644 modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make create mode 100644 modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/cmake_clean.cmake create mode 100644 modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/compiler_depend.make create mode 100644 modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/compiler_depend.ts create mode 100644 modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/depend.make create mode 100644 modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/flags.make create mode 100644 modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/link.txt create mode 100644 modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/progress.make create mode 100644 modules/classic/unix/rexxapi3/Makefile create mode 100644 modules/classic/unix/rexxapi3/cmake_install.cmake create mode 100644 modules/cmake_install.cmake create mode 100644 modules/windows/0ReadMe.first create mode 100644 modules/windows/CMakeLists.txt create mode 100644 modules/windows/misc/fileDrop.ReadMe create mode 100644 modules/windows/misc/fileDrop.empty create mode 100644 modules/windows/misc/fileDrop.input create mode 100644 modules/windows/misc/fileDrop.rex create mode 100644 modules/windows/ole/ReadMe.first create mode 100755 modules/windows/ole/adsi/adsi1.rex create mode 100755 modules/windows/ole/adsi/adsi2.rex create mode 100755 modules/windows/ole/adsi/adsi3.rex create mode 100755 modules/windows/ole/adsi/adsi4.rex create mode 100755 modules/windows/ole/adsi/adsi5.rex create mode 100755 modules/windows/ole/adsi/adsi6.rex create mode 100755 modules/windows/ole/adsi/adsi7.rex create mode 100755 modules/windows/ole/adsi/adsi8.rex create mode 100755 modules/windows/ole/apps/AOO_scalc_chart.rex create mode 100755 modules/windows/ole/apps/AOO_simpress_present.rex create mode 100755 modules/windows/ole/apps/AOO_swriter_paragraphs.rex create mode 100755 modules/windows/ole/apps/AOO_swriter_table.rex create mode 100755 modules/windows/ole/apps/Lotus123.rex create mode 100755 modules/windows/ole/apps/LotusNotes_mail.rex create mode 100755 modules/windows/ole/apps/LotusWordPro.rex create mode 100644 modules/windows/ole/apps/LotusWordPro_clickHereFields.mwp create mode 100755 modules/windows/ole/apps/LotusWordPro_clickHereFields.rex create mode 100644 modules/windows/ole/apps/MSAccessDemo.rex create mode 100755 modules/windows/ole/apps/MSAccessDemo_32bit_only.rex create mode 100755 modules/windows/ole/apps/MSAccess_contacts.rex create mode 100755 modules/windows/ole/apps/MSExcel.rex create mode 100644 modules/windows/ole/apps/MSExcel_cURL.rex create mode 100755 modules/windows/ole/apps/MSExcel_usingRexxArray.rex create mode 100755 modules/windows/ole/apps/MSInternetExplorer_events.rex create mode 100755 modules/windows/ole/apps/MSInternetExplorer_getMethods.rex create mode 100755 modules/windows/ole/apps/MSInternetExplorer_navigate.rex create mode 100755 modules/windows/ole/apps/MSInternetExplorer_search.rex create mode 100755 modules/windows/ole/apps/MSInternetExplorer_stockPrice.rex create mode 100644 modules/windows/ole/apps/MSOutlook.rex create mode 100755 modules/windows/ole/apps/MSOutlook_monitorInbox.rex create mode 100644 modules/windows/ole/apps/MSPowerPoint_layouts.rex create mode 100755 modules/windows/ole/apps/MSPowerPoint_present.rex create mode 100755 modules/windows/ole/apps/MSWord_createModify.rex create mode 100644 modules/windows/ole/apps/MSWord_useStyles.rex create mode 100755 modules/windows/ole/apps/ScriptingFileSystemObject.rex create mode 100755 modules/windows/ole/apps/ShellApplication_listSystemFolders.rex create mode 100755 modules/windows/ole/apps/WScriptNetwork.rex create mode 100755 modules/windows/ole/apps/WScriptShell.rex create mode 100644 modules/windows/ole/apps/oleUtils.frm create mode 100755 modules/windows/ole/methinfo/main.rex create mode 100644 modules/windows/ole/methinfo/methinfo.cls create mode 100644 modules/windows/ole/oleinfo/createOleInfo.rex create mode 100644 modules/windows/ole/oleinfo/getOleConstants.rex create mode 100644 modules/windows/ole/oleinfo/listProgIds.rex create mode 100644 modules/windows/ole/oleinfo/oleinfo.cls create mode 100644 modules/windows/ole/oleinfo/oleinfo.css create mode 100644 modules/windows/ole/oleinfo/oleinfo.properties create mode 100644 modules/windows/ole/oleinfo/oleinfo2html.frm create mode 100644 modules/windows/ole/oleinfo/readme.txt create mode 100644 modules/windows/ole/oleinfo/reg_classids4ole.cls create mode 100644 modules/windows/ole/oleinfo/test.rex create mode 100755 modules/windows/ole/wmi/accounts.rex create mode 100755 modules/windows/ole/wmi/osinfo.rex create mode 100755 modules/windows/ole/wmi/process.rex create mode 100755 modules/windows/ole/wmi/services.rex create mode 100755 modules/windows/oodialog/AnimalGame.rex create mode 100755 modules/windows/oodialog/GUI_Template.rex create mode 100644 modules/windows/oodialog/bmp/bigpiece.bmp create mode 100644 modules/windows/oodialog/bmp/blank.bmp create mode 100644 modules/windows/oodialog/bmp/blanks.bmp create mode 100644 modules/windows/oodialog/bmp/cake.bmp create mode 100644 modules/windows/oodialog/bmp/cake1.bmp create mode 100644 modules/windows/oodialog/bmp/cake10.bmp create mode 100644 modules/windows/oodialog/bmp/cake11.bmp create mode 100644 modules/windows/oodialog/bmp/cake2.bmp create mode 100644 modules/windows/oodialog/bmp/cake3.bmp create mode 100644 modules/windows/oodialog/bmp/cake4.bmp create mode 100644 modules/windows/oodialog/bmp/cake5.bmp create mode 100644 modules/windows/oodialog/bmp/cake6.bmp create mode 100644 modules/windows/oodialog/bmp/cake7.bmp create mode 100644 modules/windows/oodialog/bmp/cake8.bmp create mode 100644 modules/windows/oodialog/bmp/cake9.bmp create mode 100644 modules/windows/oodialog/bmp/cakepiec.bmp create mode 100644 modules/windows/oodialog/bmp/chihuahu.bmp create mode 100644 modules/windows/oodialog/bmp/eleph2.bmp create mode 100644 modules/windows/oodialog/bmp/fork.bmp create mode 100644 modules/windows/oodialog/bmp/goat.bmp create mode 100644 modules/windows/oodialog/bmp/handfkle.bmp create mode 100644 modules/windows/oodialog/bmp/handfkri.bmp create mode 100644 modules/windows/oodialog/bmp/handleft.bmp create mode 100644 modules/windows/oodialog/bmp/handrite.bmp create mode 100644 modules/windows/oodialog/bmp/horse.bmp create mode 100644 modules/windows/oodialog/bmp/install.bmp create mode 100644 modules/windows/oodialog/bmp/install2.bmp create mode 100644 modules/windows/oodialog/bmp/kanguru.bmp create mode 100644 modules/windows/oodialog/bmp/moose.bmp create mode 100644 modules/windows/oodialog/bmp/oodStandardDialogs.ico create mode 100644 modules/windows/oodialog/bmp/oodStandardRoutines.ico create mode 100644 modules/windows/oodialog/bmp/phileat.bmp create mode 100644 modules/windows/oodialog/bmp/phileat2.bmp create mode 100644 modules/windows/oodialog/bmp/phileata.bmp create mode 100644 modules/windows/oodialog/bmp/philouch.bmp create mode 100644 modules/windows/oodialog/bmp/philphil.bmp create mode 100644 modules/windows/oodialog/bmp/philslep.bmp create mode 100644 modules/windows/oodialog/bmp/philtest.bmp create mode 100644 modules/windows/oodialog/bmp/philwait.bmp create mode 100644 modules/windows/oodialog/bmp/rhinoce.bmp create mode 100644 modules/windows/oodialog/bmp/s2anim.bmp create mode 100644 modules/windows/oodialog/bmp/s2arch.bmp create mode 100644 modules/windows/oodialog/bmp/s2backg.bmp create mode 100644 modules/windows/oodialog/bmp/s2input.bmp create mode 100644 modules/windows/oodialog/bmp/s2jack.bmp create mode 100644 modules/windows/oodialog/bmp/s2list.bmp create mode 100644 modules/windows/oodialog/bmp/s2mov.bmp create mode 100644 modules/windows/oodialog/bmp/s2philf.bmp create mode 100644 modules/windows/oodialog/bmp/s2prog.bmp create mode 100644 modules/windows/oodialog/bmp/s2prop.bmp create mode 100644 modules/windows/oodialog/bmp/s2scroll.bmp create mode 100644 modules/windows/oodialog/bmp/s2tree.bmp create mode 100644 modules/windows/oodialog/bmp/s2walker.bmp create mode 100644 modules/windows/oodialog/bmp/sealion.bmp create mode 100644 modules/windows/oodialog/bmp/tiger.bmp create mode 100644 modules/windows/oodialog/bmp/wlkfig1.bmp create mode 100644 modules/windows/oodialog/bmp/wlkfig2.bmp create mode 100644 modules/windows/oodialog/bmp/wlkfig3.bmp create mode 100644 modules/windows/oodialog/bmp/wlkfig4.bmp create mode 100644 modules/windows/oodialog/bmp/wlkfig5.bmp create mode 100644 modules/windows/oodialog/bmp/wlkfig6.bmp create mode 100644 modules/windows/oodialog/bmp/wlkfig7.bmp create mode 100644 modules/windows/oodialog/bmp/wlkfig8.bmp create mode 100755 modules/windows/oodialog/calculator.rex create mode 100644 modules/windows/oodialog/controls/ComboBox/comboBoxTypes.h create mode 100644 modules/windows/oodialog/controls/ComboBox/comboBoxTypes.rc create mode 100755 modules/windows/oodialog/controls/ComboBox/comboBoxTypes.rex create mode 100755 modules/windows/oodialog/controls/ListBox/incrementalSearch.rex create mode 100644 modules/windows/oodialog/controls/ListView/ReadMe.txt create mode 100755 modules/windows/oodialog/controls/ListView/columnClickListView.rex create mode 100755 modules/windows/oodialog/controls/ListView/columnIcons.rex create mode 100755 modules/windows/oodialog/controls/ListView/customDrawListview.rex create mode 100644 modules/windows/oodialog/controls/ListView/rc/columnIcons.dll create mode 100644 modules/windows/oodialog/controls/ListView/rc/columnIcons.h create mode 100644 modules/windows/oodialog/controls/ListView/rc/columnIcons.rc create mode 100644 modules/windows/oodialog/controls/ListView/rc/columnIcons_16.bmp create mode 100644 modules/windows/oodialog/controls/ListView/rc/columnIcons_32.bmp create mode 100644 modules/windows/oodialog/controls/ListView/rc/customDrawListView.h create mode 100644 modules/windows/oodialog/controls/ListView/rc/customDrawListView.rc create mode 100644 modules/windows/oodialog/controls/ListView/rc/res.mak create mode 100644 modules/windows/oodialog/controls/ListView/subitem.editing/ReadMe.txt create mode 100755 modules/windows/oodialog/controls/ListView/subitem.editing/dropDownComboBox.rex create mode 100755 modules/windows/oodialog/controls/ListView/subitem.editing/dropDownListComboBox.rex create mode 100755 modules/windows/oodialog/controls/ListView/subitem.editing/editControl.rex create mode 100644 modules/windows/oodialog/controls/ListView/subitem.editing/importList.h create mode 100644 modules/windows/oodialog/controls/ListView/subitem.editing/importList.rc create mode 100755 modules/windows/oodialog/controls/ListView/subitem.editing/importList.rex create mode 100755 modules/windows/oodialog/controls/PaidHolidays.rex create mode 100644 modules/windows/oodialog/controls/ReadMe.txt create mode 100755 modules/windows/oodialog/controls/ToolBar/customizeToolBar.rex create mode 100644 modules/windows/oodialog/controls/ToolBar/rc/ToolBar11IL.bmp create mode 100644 modules/windows/oodialog/controls/ToolBar/rc/customizeToolBar.dll create mode 100644 modules/windows/oodialog/controls/ToolBar/rc/customizeToolBar.h create mode 100644 modules/windows/oodialog/controls/ToolBar/rc/customizeToolBar.rc create mode 100644 modules/windows/oodialog/controls/ToolBar/rc/res.mak create mode 100644 modules/windows/oodialog/controls/ToolBar/rc/toolBar.dll create mode 100644 modules/windows/oodialog/controls/ToolBar/rc/toolBar.h create mode 100644 modules/windows/oodialog/controls/ToolBar/rc/toolBar.rc create mode 100755 modules/windows/oodialog/controls/ToolBar/toolBar.rex create mode 100644 modules/windows/oodialog/controls/ToolTip/ReadMe.txt create mode 100644 modules/windows/oodialog/controls/ToolTip/comboBoxToolTip.h create mode 100644 modules/windows/oodialog/controls/ToolTip/comboBoxToolTip.rc create mode 100755 modules/windows/oodialog/controls/ToolTip/comboBoxToolTip.rex create mode 100644 modules/windows/oodialog/controls/ToolTip/customPositionToolTip.h create mode 100644 modules/windows/oodialog/controls/ToolTip/customPositionToolTip.rc create mode 100755 modules/windows/oodialog/controls/ToolTip/customPositionToolTip.rex create mode 100644 modules/windows/oodialog/controls/ToolTip/manageControlTool.h create mode 100644 modules/windows/oodialog/controls/ToolTip/manageControlTool.rc create mode 100755 modules/windows/oodialog/controls/ToolTip/manageControlTool.rex create mode 100644 modules/windows/oodialog/controls/ToolTip/musicNote.ico create mode 100755 modules/windows/oodialog/controls/ToolTip/toolTip.rex create mode 100644 modules/windows/oodialog/controls/TreeView/rc/treeViewCustomDraw.bmp create mode 100644 modules/windows/oodialog/controls/TreeView/rc/treeViewCustomDraw.h create mode 100644 modules/windows/oodialog/controls/TreeView/rc/treeViewCustomDraw.rc create mode 100644 modules/windows/oodialog/controls/TreeView/treeViewCustomDraw.inp create mode 100755 modules/windows/oodialog/controls/TreeView/treeViewCustomDraw.rex create mode 100644 modules/windows/oodialog/controls/TreeView/treeViewCustomDrawI.inp create mode 100644 modules/windows/oodialog/controls/fiscalReports.h create mode 100644 modules/windows/oodialog/controls/fiscalReports.rc create mode 100755 modules/windows/oodialog/controls/fiscalReports.rex create mode 100644 modules/windows/oodialog/controls/paidHolidays.h create mode 100644 modules/windows/oodialog/controls/paidHolidays.rc create mode 100644 modules/windows/oodialog/controls/upDown.h create mode 100644 modules/windows/oodialog/controls/upDown.rc create mode 100755 modules/windows/oodialog/controls/upDown.rex create mode 100644 modules/windows/oodialog/controls/userStringDTP.h create mode 100644 modules/windows/oodialog/controls/userStringDTP.hlp create mode 100644 modules/windows/oodialog/controls/userStringDTP.rc create mode 100755 modules/windows/oodialog/controls/userStringDTP.rex create mode 100755 modules/windows/oodialog/editrex.rex create mode 100644 modules/windows/oodialog/examples/ReadMe.txt create mode 100755 modules/windows/oodialog/examples/addManyRows.rex create mode 100755 modules/windows/oodialog/examples/browsePrinters.rex create mode 100755 modules/windows/oodialog/examples/fileNameDialog_demo.rex create mode 100755 modules/windows/oodialog/examples/genGUID.rex create mode 100755 modules/windows/oodialog/examples/imageButton.rex create mode 100755 modules/windows/oodialog/examples/openSaveFileDemo.rex create mode 100755 modules/windows/oodialog/examples/publicRoutines_demo.rex create mode 100644 modules/windows/oodialog/examples/resources/CheckIn.bmp create mode 100644 modules/windows/oodialog/examples/resources/ClosePalette.bmp create mode 100644 modules/windows/oodialog/examples/resources/CodeReview.bmp create mode 100644 modules/windows/oodialog/examples/resources/Default.bmp create mode 100644 modules/windows/oodialog/examples/resources/Disabled.bmp create mode 100644 modules/windows/oodialog/examples/resources/Hot.bmp create mode 100644 modules/windows/oodialog/examples/resources/LinkToWeb.bmp create mode 100644 modules/windows/oodialog/examples/resources/LockModule.bmp create mode 100644 modules/windows/oodialog/examples/resources/LockProject.bmp create mode 100644 modules/windows/oodialog/examples/resources/Normal.bmp create mode 100644 modules/windows/oodialog/examples/resources/ProjectReview.bmp create mode 100644 modules/windows/oodialog/examples/resources/Pushed.bmp create mode 100644 modules/windows/oodialog/examples/resources/SaveAll.bmp create mode 100644 modules/windows/oodialog/examples/resources/SaveModule.bmp create mode 100644 modules/windows/oodialog/examples/resources/SaveProject.bmp create mode 100644 modules/windows/oodialog/examples/resources/SplitModule.bmp create mode 100644 modules/windows/oodialog/examples/resources/Update.bmp create mode 100644 modules/windows/oodialog/examples/resources/addManyRows.h create mode 100644 modules/windows/oodialog/examples/resources/addManyRows.rc create mode 100644 modules/windows/oodialog/examples/resources/genGUID.h create mode 100644 modules/windows/oodialog/examples/resources/genGUID.rc create mode 100644 modules/windows/oodialog/examples/resources/imageButton.h create mode 100644 modules/windows/oodialog/examples/resources/imageButton.rc create mode 100644 modules/windows/oodialog/examples/resources/osfDialogs.h create mode 100644 modules/windows/oodialog/examples/resources/osfDialogs.rc create mode 100644 modules/windows/oodialog/examples/resources/saveFileWithFilter.h create mode 100644 modules/windows/oodialog/examples/resources/saveFileWithFilter.rc create mode 100644 modules/windows/oodialog/examples/resources/useTools.h create mode 100755 modules/windows/oodialog/examples/saveFileWithFilter.rex create mode 100755 modules/windows/oodialog/examples/simpleFolderBrowse.rex create mode 100755 modules/windows/oodialog/examples/stopWatch.rex create mode 100755 modules/windows/oodialog/examples/useTools.rex create mode 100755 modules/windows/oodialog/ftyperex.rex create mode 100755 modules/windows/oodialog/menus/BinaryMenuBar.rex create mode 100644 modules/windows/oodialog/menus/ContextMenu.h create mode 100644 modules/windows/oodialog/menus/ContextMenu.rc create mode 100755 modules/windows/oodialog/menus/ContextMenu.rex create mode 100644 modules/windows/oodialog/menus/ScriptMenuBar.h create mode 100644 modules/windows/oodialog/menus/ScriptMenuBar.rc create mode 100755 modules/windows/oodialog/menus/ScriptMenuBar.rex create mode 100644 modules/windows/oodialog/menus/UserMenuBar.bmp create mode 100644 modules/windows/oodialog/menus/UserMenuBar.h create mode 100644 modules/windows/oodialog/menus/UserMenuBar.rc create mode 100755 modules/windows/oodialog/menus/UserMenuBar.rex create mode 100644 modules/windows/oodialog/mouse/dragNdrop.h create mode 100644 modules/windows/oodialog/mouse/dragNdrop.rc create mode 100755 modules/windows/oodialog/mouse/dragNdrop.rex create mode 100644 modules/windows/oodialog/mouse/dragging.cur create mode 100644 modules/windows/oodialog/mouse/mouseWheel.h create mode 100644 modules/windows/oodialog/mouse/mouseWheel.rc create mode 100755 modules/windows/oodialog/mouse/mouseWheel.rex create mode 100644 modules/windows/oodialog/mouse/nflPlayers.txt create mode 100644 modules/windows/oodialog/oleinfo/help.txt create mode 100644 modules/windows/oodialog/oleinfo/icons.bmp create mode 100644 modules/windows/oodialog/oleinfo/oleinfo.rc create mode 100755 modules/windows/oodialog/oleinfo/oleinfo.rex create mode 100644 modules/windows/oodialog/ooDraw.h create mode 100644 modules/windows/oodialog/ooRexxTry/doc/ooRexxTry.pdf create mode 100755 modules/windows/oodialog/ooRexxTry/ooRexxTry.rex create mode 100755 modules/windows/oodialog/oobandit.rex create mode 100755 modules/windows/oodialog/oobmpvu.rex create mode 100755 modules/windows/oodialog/oodStandardDialogs.rex create mode 100755 modules/windows/oodialog/oodStandardRoutines.rex create mode 100755 modules/windows/oodialog/oodpbar.rex create mode 100755 modules/windows/oodialog/oodraw.rex create mode 100755 modules/windows/oodialog/oograph.rex create mode 100644 modules/windows/oodialog/oophil.ico create mode 100755 modules/windows/oodialog/oophil.rex create mode 100755 modules/windows/oodialog/oovideo.rex create mode 100755 modules/windows/oodialog/oowalk2.rex create mode 100755 modules/windows/oodialog/oowalker.rex create mode 100755 modules/windows/oodialog/propertysheet.tabControls/PropertySheetDemo.rex create mode 100755 modules/windows/oodialog/propertysheet.tabControls/TabDemo.rex create mode 100755 modules/windows/oodialog/propertysheet.tabControls/TabOwnerDemo.rex create mode 100755 modules/windows/oodialog/propertysheet.tabControls/UserTabDemo.rex create mode 100755 modules/windows/oodialog/propertysheet.tabControls/oodListViews.rex create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/PropertySheetDemo.dll create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/PropertySheetDemo.h create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/PropertySheetDemo.rc create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemo.dll create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemo.h create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemo.rc create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemoListView.bmp create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemoTab.bmp create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemoTreeView.bmp create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/UserTabDemo.h create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/UserTabDemo.rc create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews.h create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews.rc create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews1.bmp create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews2.bmp create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/propertySheetDemoListView.bmp create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/propertySheetDemoTab.bmp create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/propertySheetDemoTreeView.bmp create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/ticketWizard.h create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/ticketWizard.rc create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/ticketWizardMovie.bmp create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/ticketWizardRexxLA.bmp create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/ticketWizardTheater.bmp create mode 100644 modules/windows/oodialog/propertysheet.tabControls/rc/ticketWizardTicket.bmp create mode 100755 modules/windows/oodialog/propertysheet.tabControls/ticketWizard.rex create mode 100644 modules/windows/oodialog/rc/AnimalGame.h create mode 100644 modules/windows/oodialog/rc/AnimalGame.rc create mode 100644 modules/windows/oodialog/rc/calculator.rc create mode 100644 modules/windows/oodialog/rc/exercise.rc create mode 100644 modules/windows/oodialog/rc/ldvideo.h create mode 100644 modules/windows/oodialog/rc/ldvideo.rc create mode 100644 modules/windows/oodialog/rc/oodStandardDialogs.h create mode 100644 modules/windows/oodialog/rc/oodStandardDialogs.rc create mode 100644 modules/windows/oodialog/rc/oodpbar.rc create mode 100644 modules/windows/oodialog/rc/oophil1.rc create mode 100644 modules/windows/oodialog/rc/oophil2.rc create mode 100644 modules/windows/oodialog/rc/sample.rc create mode 100644 modules/windows/oodialog/rc/walker.h create mode 100644 modules/windows/oodialog/rc/walker.rc create mode 100644 modules/windows/oodialog/res/AnimalGame.dll create mode 100644 modules/windows/oodialog/res/oowalk2.dll create mode 100644 modules/windows/oodialog/res/res.mak create mode 100644 modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemo.h create mode 100755 modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemo.rex create mode 100755 modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemoThree.rex create mode 100755 modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemoTwo.rex create mode 100644 modules/windows/oodialog/resizableDialogs/ReadMe.txt create mode 100755 modules/windows/oodialog/resizableDialogs/ResizingAdmin/PropertySheetDemo.rex create mode 100755 modules/windows/oodialog/resizableDialogs/ResizingAdmin/TabDemo.rex create mode 100755 modules/windows/oodialog/resizableDialogs/ResizingAdmin/augmentedResize.rex create mode 100755 modules/windows/oodialog/resizableDialogs/ResizingAdmin/basicResize.rex create mode 100755 modules/windows/oodialog/resizableDialogs/ResizingAdmin/gbStationary.rex create mode 100644 modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/PropertySheetDemo.dll create mode 100644 modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/PropertySheetDemo.h create mode 100644 modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/PropertySheetDemo.rc create mode 100644 modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/basicResize.h create mode 100644 modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/basicResize.rc create mode 100644 modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/gbStationary.h create mode 100644 modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/gbStationary.rc create mode 100644 modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/propertySheetDemoListView.bmp create mode 100644 modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/propertySheetDemoTab.bmp create mode 100644 modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/propertySheetDemoTreeView.bmp create mode 100755 modules/windows/oodialog/sample.rex create mode 100755 modules/windows/oodialog/samplesSetup.rex create mode 100755 modules/windows/oodialog/simple/ChangeFont.rex create mode 100644 modules/windows/oodialog/simple/ReadMe.txt create mode 100644 modules/windows/oodialog/simple/SimpleMonthCalendar.h create mode 100644 modules/windows/oodialog/simple/SimpleMonthCalendar.rc create mode 100755 modules/windows/oodialog/simple/SimpleMonthCalendar.rex create mode 100755 modules/windows/oodialog/simple/SimpleUpDown.rex create mode 100644 modules/windows/oodialog/sysinfo/sysInfo.h create mode 100644 modules/windows/oodialog/sysinfo/sysinfo.rc create mode 100755 modules/windows/oodialog/sysinfo/sysinfo.rex create mode 100644 modules/windows/oodialog/tutorial/add.bmp create mode 100755 modules/windows/oodialog/tutorial/drawing1.rex create mode 100755 modules/windows/oodialog/tutorial/drawing2.rex create mode 100755 modules/windows/oodialog/tutorial/drawing3.rex create mode 100755 modules/windows/oodialog/tutorial/drawing4.rex create mode 100755 modules/windows/oodialog/tutorial/drawing5.rex create mode 100644 modules/windows/oodialog/tutorial/drawings.rc create mode 100644 modules/windows/oodialog/tutorial/employe1.rc create mode 100755 modules/windows/oodialog/tutorial/employe1.rex create mode 100644 modules/windows/oodialog/tutorial/employe2.rc create mode 100755 modules/windows/oodialog/tutorial/employe2.rex create mode 100644 modules/windows/oodialog/tutorial/employe3.rc create mode 100755 modules/windows/oodialog/tutorial/employe3.rex create mode 100644 modules/windows/oodialog/tutorial/employe4.rc create mode 100755 modules/windows/oodialog/tutorial/employe4.rex create mode 100755 modules/windows/oodialog/tutorial/employe4validate.rex create mode 100644 modules/windows/oodialog/tutorial/employe5.rc create mode 100755 modules/windows/oodialog/tutorial/employe5.rex create mode 100644 modules/windows/oodialog/tutorial/employe6.rc create mode 100755 modules/windows/oodialog/tutorial/employe6.rex create mode 100644 modules/windows/oodialog/tutorial/employe7.h create mode 100644 modules/windows/oodialog/tutorial/employe7.rc create mode 100755 modules/windows/oodialog/tutorial/employe7.rex create mode 100644 modules/windows/oodialog/tutorial/employe8.rc create mode 100755 modules/windows/oodialog/tutorial/employe8.rex create mode 100755 modules/windows/oodialog/tutorial/employe9.rex create mode 100755 modules/windows/oodialog/tutorial/employe9menuDyn.rex create mode 100755 modules/windows/oodialog/tutorial/employee10menuRc.rex create mode 100644 modules/windows/oodialog/tutorial/employee11tab.h create mode 100644 modules/windows/oodialog/tutorial/employee11tab.rc create mode 100755 modules/windows/oodialog/tutorial/employee11tab.rex create mode 100644 modules/windows/oodialog/tutorial/logo.bmp create mode 100644 modules/windows/oodialog/tutorial/textScroll.rc create mode 100755 modules/windows/oodialog/tutorial/textScroll.rex create mode 100644 modules/windows/oodialog/userGuide/ReadMe.txt create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise02/HelloWorld.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise02/WoW.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise02/WoW2.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise03/Startup.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise03/Wow3.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise03/WowData.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise03/WowModel.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise03/WowView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerModelData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog2.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/res/ASimpleDialog.dll create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/res/res.mak create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/ReadMe.txt create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise04/Startup.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise05/ProductModelData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise05/ProductView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise05/ProductView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise05/ProductView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise05/Startup.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise05/Support/NumberOnlyEditEx.cls create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise05/res/ProductIcon.bmp create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise05/res/ProductView.dll create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise05/res/res.mak create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerListView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerListView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerListView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerModelData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/StartupCustomer.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/StartupCustomerList.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/bmp/CustList.bmp create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/bmp/CustList.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/bmp/Customer.ico create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Extras/Popups/OffsetPopups.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Extras/Popups/Popups.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Extras/ReadMe.txt create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderFormView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderFormView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderFormView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderListView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderListView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderListView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderModelData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/StartupOrder.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/StartupOrderForm.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/StartupOrderList.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/bmp/OrderForm.bmp create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/bmp/OrderForm.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/bmp/OrderList.bmp create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Order/bmp/OrderList.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/OrderMgr/OrderMgrView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/OrderMgr/OrderMgrView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/OrderMgr/OrderMgrView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/OrderMgr/RequiresList.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductListView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductListView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductListView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductModelData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/StartupProduct.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/StartupProductList.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/ProdList.bmp create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/ProdList.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/Product.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/ProductIcon.bmp create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/ProductView.dll create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/res.mak create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise06/Startup.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise06/Support/NumberOnlyEditEx.cls create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerFile.txt create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerListView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerListView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerListView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerModelsData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/bmp/CustList.BMP create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/bmp/CustList.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/bmp/Customer.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonFile.txt create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonModelData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/ReadMe.txt create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowFile.txt create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowModel.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderFormView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderFormView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderFormView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderHeadersFile.txt create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderLinesFile.txt create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderListView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderListView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderListView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderModelsData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/bmp/OrderForm.bmp create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/bmp/OrderForm.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/bmp/OrderList.bmp create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Order/bmp/OrderList.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/OrderMgr/OrderMgrView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/OrderMgr/OrderMgrView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/OrderMgr/OrderMgrView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/OrderMgr/RequiresList.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductFile.txt create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductListView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductListView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductListView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductModelsData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/ProdList.BMP create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/ProdList.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/Product.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/ProductIcon.bmp create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/ProductView.dll create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/res.mak create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/RequiresList.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Startup.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Support/GenericFile.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Support/MessageSender.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Support/MessageSender.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Support/MessageSender.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Support/Model.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise07/Support/NumberOnlyEditEx.cls create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Support/ObjectMgr.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Support/RcView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Support/ResView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Support/UdView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise07/Support/ViewMgr.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerFile.txt create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerListView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerListView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerListView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerModelsData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/bmp/CustList.BMP create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/bmp/CustList.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/bmp/Customer.cur create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/bmp/Customer.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonFile.txt create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonModelData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/ReadMe.txt create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderFormView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderFormView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderFormView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderHeadersFile.txt create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderLinesFile.txt create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderListView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderListView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderListView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderModelsData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/bmp/OrderForm.bmp create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/bmp/OrderForm.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/bmp/OrderList.bmp create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Order/bmp/OrderList.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/OrderMgr/OrderMgrView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/OrderMgr/OrderMgrView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/OrderMgr/OrderMgrView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/OrderMgr/RequiresList.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductFile.txt create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductListView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductListView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductListView.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductModelsData.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductView.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductView.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductView.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/ProdList.BMP create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/ProdList.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/Product.cur create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/Product.ico create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/ProductIcon.bmp create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/ProductView.dll create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/res.mak create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/RequiresList.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Startup.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Support/Component.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Support/DragMgr.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Support/EventMgr.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Support/GenericFile.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Support/MessageSender.h create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Support/MessageSender.rc create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Support/MessageSender.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Support/Model.rex create mode 100644 modules/windows/oodialog/userGuide/exercises/Exercise08/Support/NumberOnlyEditEx.cls create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Support/ObjectMgr.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Support/View.rex create mode 100755 modules/windows/oodialog/userGuide/exercises/Exercise08/Support/ViewMgr.rex create mode 100644 modules/windows/oodialog/wav/byebye.wav create mode 100644 modules/windows/oodialog/wav/cancel.wav create mode 100644 modules/windows/oodialog/wav/clap.wav create mode 100644 modules/windows/oodialog/wav/elephant.wav create mode 100644 modules/windows/oodialog/wav/goat.wav create mode 100644 modules/windows/oodialog/wav/gotcha.wav create mode 100644 modules/windows/oodialog/wav/guess.wav create mode 100644 modules/windows/oodialog/wav/help.wav create mode 100644 modules/windows/oodialog/wav/horse.wav create mode 100644 modules/windows/oodialog/wav/inst.wav create mode 100644 modules/windows/oodialog/wav/jackpot.wav create mode 100644 modules/windows/oodialog/wav/moose.wav create mode 100644 modules/windows/oodialog/wav/nope.wav create mode 100644 modules/windows/oodialog/wav/philcake.wav create mode 100644 modules/windows/oodialog/wav/phileat.wav create mode 100644 modules/windows/oodialog/wav/philhelp.wav create mode 100644 modules/windows/oodialog/wav/philouch.wav create mode 100644 modules/windows/oodialog/wav/philslep.wav create mode 100644 modules/windows/oodialog/wav/philstop.wav create mode 100644 modules/windows/oodialog/wav/philstrt.wav create mode 100644 modules/windows/oodialog/wav/philwait.wav create mode 100644 modules/windows/oodialog/wav/readme.txt create mode 100644 modules/windows/oodialog/wav/rhino.wav create mode 100644 modules/windows/oodialog/wav/sample.wav create mode 100644 modules/windows/oodialog/wav/sealion.wav create mode 100644 modules/windows/oodialog/wav/start.wav create mode 100644 modules/windows/oodialog/wav/take.wav create mode 100644 modules/windows/oodialog/wav/tiger.wav create mode 100644 modules/windows/oodialog/wav/whistle.wav create mode 100644 modules/windows/oodialog/wav/yourgood.wav create mode 100755 modules/windows/oodialog/winsystem/deskicon.rex create mode 100755 modules/windows/oodialog/winsystem/desktop.rex create mode 100755 modules/windows/oodialog/winsystem/displayAnyMenu.rex create mode 100755 modules/windows/oodialog/winsystem/displayWindowTree.rex create mode 100755 modules/windows/oodialog/winsystem/eventlog.rex create mode 100755 modules/windows/oodialog/winsystem/getTheWindow.rex create mode 100755 modules/windows/oodialog/winsystem/menuCalc.rex create mode 100755 modules/windows/oodialog/winsystem/menuNotepad.rex create mode 100755 modules/windows/oodialog/winsystem/quickCalc.rex create mode 100755 modules/windows/oodialog/winsystem/quickShowAllMenus.rex create mode 100755 modules/windows/oodialog/winsystem/registry.rex create mode 100755 modules/windows/oodialog/winsystem/usewmgr.rex create mode 100644 modules/windows/oodialog/winsystem/winSystemDlgs.h create mode 100644 modules/windows/oodialog/winsystem/winSystemDlgs.rc create mode 100644 modules/windows/oodialog/winsystem/windowsSystem.frm create mode 100755 modules/windows/oodialog/winsystem/writeWithNotepad.rex create mode 100755 modules/windows/rexutils/drives.rex create mode 100644 projects/mvs/dasducb.rex create mode 100644 projects/mvs/who.rex create mode 100644 projects/oorexx/1plus1.rex create mode 100644 projects/oorexx/address-test.rex create mode 100644 projects/oorexx/contacts.rdbx create mode 100644 projects/oorexx/dist.rex create mode 100755 projects/oorexx/drawbox.rex create mode 100755 projects/oorexx/experiment.rex create mode 100644 projects/oorexx/hello.rex create mode 100755 projects/oorexx/minimal_ncurses.rex create mode 100755 projects/oorexx/mouse_thing.rex create mode 100755 projects/oorexx/move_demo.rex create mode 100755 projects/oorexx/ncurses_test.rex create mode 100755 projects/oorexx/probe_orxncurses.rex create mode 100644 projects/oorexx/rexxcurl.rexx create mode 100644 projects/oorexx/stuff.rex create mode 100755 projects/oorexx/test.rex create mode 100755 projects/oorexx/test_getrexxpackage.rex create mode 100755 projects/oorexx/test_init.rex create mode 100755 projects/oorexx/test_orxncurses.rex create mode 100755 projects/oorexx/test_rxfuncadd.rex create mode 100755 projects/oorexx/text-attrs.rex create mode 100644 projects/text/jabberwocky.txt create mode 100644 samples/mvs/addcmds.rex create mode 100644 samples/mvs/alist.rex create mode 100644 samples/mvs/blox.rex create mode 100644 samples/mvs/cmds.rex create mode 100644 samples/mvs/cpuid.rex create mode 100644 samples/mvs/free.clist create mode 100644 samples/mvs/gettrid.rex create mode 100644 samples/mvs/gotdsn.clist create mode 100644 samples/mvs/iplinfo.rex create mode 100644 samples/mvs/jobcards.rex create mode 100644 samples/mvs/post.rex create mode 100644 samples/mvs/redit.rex create mode 100644 samples/mvs/testducb.rex create mode 100644 samples/mvs/testvtoc.rex create mode 100644 samples/mvs/xedit.rex create mode 100644 samples/oorexx/Enumeration.cls create mode 100755 samples/oorexx/arithmeticEvaluation.rex create mode 100755 samples/oorexx/arrayCallback.rex create mode 100755 samples/oorexx/ccreply.rex create mode 100755 samples/oorexx/complex.cls create mode 100755 samples/oorexx/concurrency.rex create mode 100755 samples/oorexx/constrained.rex create mode 100755 samples/oorexx/delegation.rex create mode 100755 samples/oorexx/distance.rex create mode 100755 samples/oorexx/dynamicMethod.rex create mode 100755 samples/oorexx/factor.rex create mode 100755 samples/oorexx/getOoRexxDocs.rex create mode 100644 samples/oorexx/getmail-pop3.rexx create mode 100644 samples/oorexx/getright.rexx create mode 100755 samples/oorexx/greply.rex create mode 100755 samples/oorexx/guess.rex create mode 100644 samples/oorexx/httppost.rexx create mode 100755 samples/oorexx/interface.rex create mode 100755 samples/oorexx/ktguard.rex create mode 100755 samples/oorexx/makestring.rex create mode 100755 samples/oorexx/month.rex create mode 100644 samples/oorexx/omdbcurl.orx create mode 100755 samples/oorexx/philfork.rex create mode 100755 samples/oorexx/pipe.cls create mode 100755 samples/oorexx/properties.rex create mode 100755 samples/oorexx/qdate.rex create mode 100755 samples/oorexx/qtime.rex create mode 100644 samples/oorexx/readme.txt create mode 100755 samples/oorexx/rexxcps.rex create mode 100755 samples/oorexx/rexxtry.rex create mode 100755 samples/oorexx/scclient.rex create mode 100644 samples/oorexx/scp.rexx create mode 100755 samples/oorexx/scserver.rex create mode 100755 samples/oorexx/semcls.cls create mode 100644 samples/oorexx/sendmail-smtp.conf create mode 100755 samples/oorexx/sendmail-smtp.rexx create mode 100755 samples/oorexx/sfclient.rex create mode 100755 samples/oorexx/sfserver.rex create mode 100755 samples/oorexx/singleLinkedList.rex create mode 100755 samples/oorexx/sortComposite.rex create mode 100644 samples/oorexx/sscclient.rex create mode 100755 samples/oorexx/stack.rex create mode 100755 samples/oorexx/synchronousConcurrency.rex create mode 100644 samples/oorexx/testcurl.rexx create mode 100755 samples/oorexx/timezone.rex create mode 100644 samples/oorexx/treeDirectory.cls create mode 100755 samples/oorexx/treeTraversal.rex create mode 100644 samples/oorexx/upload.rexx create mode 100755 samples/oorexx/usecomp.rex create mode 100755 samples/oorexx/usepipe.rex create mode 100644 samples/oorexx/usesingleton.rex create mode 100644 samples/oorexx/usetree.rex diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c18dd8d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..1e19d18 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# rexx-things + +A repository with all my rexx noodlings + +The `samples` directory is other peoples' code. The `projects` directory is my code. diff --git a/modules/CMakeCache.txt b/modules/CMakeCache.txt new file mode 100644 index 0000000..2493aa6 --- /dev/null +++ b/modules/CMakeCache.txt @@ -0,0 +1,469 @@ +# This is the CMakeCache file. +# For build in directory: /home/gmgauthier/Projects/code/rexx +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/usr/bin/addr2line + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING= + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-13 + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-13 + +//Flags used by the CXX compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the CXX compiler during DEBUG builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the CXX compiler during RELEASE builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//C compiler +CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_C_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-13 + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_C_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-13 + +//Flags used by the C compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the C compiler during DEBUG builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the C compiler during RELEASE builds. +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND + +//Flags used by the linker during all build types. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL= + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/gmake + +//Flags used by the linker during the creation of modules during +// all build types. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=samples-api + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/usr/bin/readelf + +//Flags used by the linker during the creation of shared libraries +// during all build types. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +call.example_BINARY_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/c++/call.example + +//Value Computed by CMake +call.example_IS_TOP_LEVEL:STATIC=OFF + +//Value Computed by CMake +call.example_SOURCE_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/api/c++/call.example + +//Value Computed by CMake +callrexx_BINARY_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/classic/unix/callrexx + +//Value Computed by CMake +callrexx_IS_TOP_LEVEL:STATIC=OFF + +//Value Computed by CMake +callrexx_SOURCE_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx + +//Value Computed by CMake +external-sample_BINARY_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/c++/external + +//Value Computed by CMake +external-sample_IS_TOP_LEVEL:STATIC=OFF + +//Value Computed by CMake +external-sample_SOURCE_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/api/c++/external + +//Dependencies for the target +external_methods_LIB_DEPENDS:STATIC=general;rexxapi; + +//Dependencies for the target +external_methods_routines_LIB_DEPENDS:STATIC=general;rexxapi; + +//Dependencies for the target +external_routines_LIB_DEPENDS:STATIC=general;rexxapi; + +//Value Computed by CMake +rexxapi1_BINARY_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1 + +//Value Computed by CMake +rexxapi1_IS_TOP_LEVEL:STATIC=OFF + +//Dependencies for the target +rexxapi1_LIB_DEPENDS:STATIC=general;rexx;general;rexxapi; + +//Value Computed by CMake +rexxapi1_SOURCE_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1 + +//Value Computed by CMake +rexxapi2_BINARY_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2 + +//Value Computed by CMake +rexxapi2_IS_TOP_LEVEL:STATIC=OFF + +//Dependencies for the target +rexxapi2_LIB_DEPENDS:STATIC=general;rexx;general;rexxapi; + +//Value Computed by CMake +rexxapi2_SOURCE_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2 + +//Value Computed by CMake +rexxapi3_BINARY_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3 + +//Value Computed by CMake +rexxapi3_IS_TOP_LEVEL:STATIC=OFF + +//Dependencies for the target +rexxapi3_LIB_DEPENDS:STATIC=general;rexx;general;rexxapi; + +//Value Computed by CMake +rexxapi3_SOURCE_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3 + +//Value Computed by CMake +samples-api-classic-unix_BINARY_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/classic/unix + +//Value Computed by CMake +samples-api-classic-unix_IS_TOP_LEVEL:STATIC=OFF + +//Value Computed by CMake +samples-api-classic-unix_SOURCE_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/api/classic/unix + +//Value Computed by CMake +samples-api_BINARY_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/classic + +//Value Computed by CMake +samples-api_IS_TOP_LEVEL:STATIC=OFF + +//Value Computed by CMake +samples-api_SOURCE_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/api/classic + +//Value Computed by CMake +samples-native-api_BINARY_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/c++ + +//Value Computed by CMake +samples-native-api_IS_TOP_LEVEL:STATIC=OFF + +//Value Computed by CMake +samples-native-api_SOURCE_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/api/c++ + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/gmgauthier/Projects/code/rexx +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=28 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=3 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/gmgauthier/Projects/code/rexx/api +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=10 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake-3.28 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/modules/CMakeFiles/3.28.3/CMakeCCompiler.cmake b/modules/CMakeFiles/3.28.3/CMakeCCompiler.cmake new file mode 100644 index 0000000..3766fe1 --- /dev/null +++ b/modules/CMakeFiles/3.28.3/CMakeCCompiler.cmake @@ -0,0 +1,74 @@ +set(CMAKE_C_COMPILER "/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "GNU") +set(CMAKE_C_COMPILER_VERSION "13.3.0") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_C_COMPILER_AR "/usr/bin/gcc-ar-13") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_C_COMPILER_RANLIB "/usr/bin/gcc-ranlib-13") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC 1) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED TRUE) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/13/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;gcc_s;c;gcc;gcc_s") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/13;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/modules/CMakeFiles/3.28.3/CMakeCXXCompiler.cmake b/modules/CMakeFiles/3.28.3/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..8dbc9d3 --- /dev/null +++ b/modules/CMakeFiles/3.28.3/CMakeCXXCompiler.cmake @@ -0,0 +1,85 @@ +set(CMAKE_CXX_COMPILER "/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "13.3.0") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_CXX_COMPILER_AR "/usr/bin/gcc-ar-13") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/usr/bin/gcc-ranlib-13") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED TRUE) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/usr/include/c++/13;/usr/include/x86_64-linux-gnu/c++/13;/usr/include/c++/13/backward;/usr/lib/gcc/x86_64-linux-gnu/13/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;gcc_s;gcc;c;gcc_s;gcc") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/13;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/modules/CMakeFiles/3.28.3/CMakeDetermineCompilerABI_C.bin b/modules/CMakeFiles/3.28.3/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..87f287194a15f3106a57cf4ff4b57eba7b928fa6 GIT binary patch literal 15968 zcmeHOeT)@X6~FH-3yXZbM+>?F!lqludsjp&cYT^ffv|^f=RcwL^vW;lA6?mR=?>Udz z;caWGF`CSInK}3T?)lw&=ggh=?z}m3IN8%3jYI@Xo%oQI%msUn#8iDkDX3L)E;>^;5MBowd5u`8p;syxdQie6M2)=J#F(dQSPME1vG+#c2~rF!&VH-2z%?3$5y_0o6tMfN`Rr{|s5#?c4IjU4nr!S;BH zu#J79560uzonMcvvFF@|*nHR)!`6{};o`^VcfR<8^A8?6YyTp*aO*=09{ce5a!dN9 zOXu$0yYimHUq1A7WBpU$I;&v&x74V`^P<(jbF<)Iodv%O@VI!Jh$o=nlLJsjTqJxT z6pu^1Q8WhdTLFI;Y(Yr_pw(#S5a3HN%9>(e%u$A5y9J_`po#Myi3)KNbX+vvG){~& z`mbN296w3^254+w(-g3baABG-qXx~QXStr4vz$C2gJYICgY6E^cH=y;BxCGJftYhz#E@BUpXR=I07Dc zUMQTRwA_K|Stp((?0cX8B23??__6ec?@9W8N@Th|1{(=wZYZoh~d^pb$#HW2Y_lQlS2w{A>>_scTGLHVF;fy?l%H~G^uB?3&_OaCof&P`X&ww=)Tiqq3z420N z;_SzaiQgMX|1h<4Ai1%;@pn?j1%<_qPk<+TLxW! z1k2F%{K{l(^$~PDLmK=Y>AyLRYW;O%V#;{-FWZf0r|XQ!bH>^0-co2_Ej7?knN;Iq zK92XuHmnw<+xHkpw?(mNOuXzZG>&hZ3&w@@l}hD826oTYUxT~u$bR5f`$zsC4?-mt z_5g3g(>`>U-X_uX)RUzkgq7 zNNZnDYG9xzX(s!+Qtf@_W^vyh|gS3UanLQfIbEK80g1A8=xPa zs#H#aM!{#QD3SYiiO5(yvSQ)9hLiB%2l17#9RQAeme(~;J~>(g7(T#S2eC=hbl@9p}i&n;sbALLMgN*)1abQOd`AJK3DC zw}NcG^;u3f=k4MB5(?Mgjw9TfO1q8f zUnQHzMa}=`6z7Nkn=Nww&e|{KnjmbX!eTmw zX}=i$&g1X$85O$+U2mgafW&Y3x6SmdVF5tVD-8|lgW^WAx#{K1K};W~P+OjRVDJnc(To zaP921?y);Np${i(yX_q*7@SObzwsBMnRbRTh2638H&taF&&%2~YT;<1)9zjEz4Bj2 z6Vl;vfH?MI!5p#j8OW+PyYA|1?@e_A3NK!mNrMPR*Din{0U!UcMCy*7{*Lw@v%kB0 zcXGfSXzzgkGKD-0@CzjPCwv+6|Lv51^@72ydHpkAJ*W;8)BJ^A9M5@H8novsJ;Eg? z53eJP3O!%&Y<)Oi(nsCGsO@^=J}6ys;H4QSLlB(8CY)^2eZ(q`2t6~Nhc1+c7Z_yC zCv3Oq6!J3+6Y5+$Yav1CI8}r`npHb}xBvyu9)rC+ow{3)??LGH2+gpO4Di`fd^Ob+ zgUiskm2(DRIQSZc4sS&W9p-orrtXaE=S>>8K7vaXzT=bx-*@Bn5mifHE~9=oY`BJD z{%r4cp)U%rZ z&+9tY{Cm#hXFt~W10UCnZ1cL2bu;x896t}>1QhU4na}H3)@5?!{)5N=5Y*!_aeei7 zmVR$}{Z7qP!^`&90(^~ltOGyW!REyy0e&+PSicef+W~%p2&^-K6Bcami2$G1J*@fu z2Hd3Z^kVxo6tD}9ztE_L^ykQAMKGJq(kI&;b07Dn%^ZK#80lkGt$o-8S^I1xndi#h-hBljxK{M)ODDlp%#t8>rio1g~2MFYd@81Kz_JpBEK_gg%6A6;C)8zqqS YfyTLCRf}uq+WaN>!veA}KnR%PpD9X5TL1t6 literal 0 HcmV?d00001 diff --git a/modules/CMakeFiles/3.28.3/CMakeDetermineCompilerABI_CXX.bin b/modules/CMakeFiles/3.28.3/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..81abc267065a2e02b3405c31c62b55b5985377fd GIT binary patch literal 15992 zcmeHOYit}>6~4Q65{Ee1ZJJP%gl1A2I!a zYmO(z1ix(*Prq&?H>~}<5#srEH}P0wA1M1?c2fUJf4hlyR*`OmU%%Uh1#9ka5AbAM zsQt|pALhN(-$KVBO7Uk+;T4>2N@Tj;;L}O6!NI#Sj7cmbA#iJ6h z6LmiPPQdShuV3~6pj7a41n@gBx{AxdSfgN+SBe$o-@A88REXoCqoQu!I9HJUraN52 zPm;aRb(k@OdfqW?N6#2m7LdU)Lm#rTM%p@R3T(#t(<=1Dz%D&y+UBs8cT9U=S64ch zH3y7j+7!B(G8_ZAs9bMQ8P4Rg1ux~&7C``k!xJYr}-#Pw$Q7BH+ z^!vy7b#hn}bBT;|{n`!}$2pF3lI6Mw_nsFwJvg6($eHrse9RG__Tbz%;(-Ja2qF+f zAc#N^fgl1w1peP6@W;sAuWKhKYqZmgez92y?K4FuTzWw}`NNvaa@R{+9|yR!@d?;Q z*2e_emo`2FwV}xRZXxSUuOud}d`z48wRZA1Q@aP^O~s}kYiG7U4-QJJ^I-a?AvLo8 zA?XkB#{kjJEINm(ecD+KU4IbE(Dl;N^~m}YXn2`4*jv(mYZBF_8Es-pd-e}Iv}dQQ zw9s?fl^JIhIM_%IYD(ALaWNmqdty5_i^6^TwUgV!Skxw7c51cL+ZRLS=B84qbTb8; z=NA19uDU~qfLrb#`M-Mr8nLh+coUzR)Fukoe-yus!#o|I)V`>lS$!3*3nJgCjz*p- zhT^vgU4^^(61H5b4o5EeTYgokW%ciUo^Btyj9trPR6Z)$bs#|mf(Qf=2qF+fAc#N^ zfgl1w1cC?z5eOm>MBpEf06yP&BT4l2^l!_<^Q+vDo*H%RgN<#6y!L&G{+{GEXIwY! zoS8akCpz_=eepzhUx$!(lAj!ROg(4ABd>$KiGhLMxE}B8PIUBvg={yH)U{p5$#z~_x{MT2Wn1;9c$X()pD?pnS$Y(vjz5l9e$AOb-If(Qf=2qF+fAc#N^fgl1w1pYT7!1;Kb zf5*9X@}dWZSj)qt{JiBm?L!zco|JVf`se(!;z} z6pad)?}su??Qe0b;%U;$NY{~GO_~+w{uL>|kJ7=#ZgR}yC=!8lX4&7}gtOgWOYV3f zP7<1-x(ezSc73L#HEFCQ<={|&+20-mpIe+&xPFP|@rpOW@>3ZDOrKM93O<)J@MxQOvcT>YZ-GZ(|!Zvn5ASAI+SnV+}*0^pVM z&0i;be|#3h?K!mf=bJABT$w){u@UflD&S(@pzSoNImi@;yKTB-3=07APGM+B9Tc<4 z=(>~92QeKzk2&Z$eK?&<8fiV{H+kl&bS;rn1 zL$;AI^;98~83&4|rh}z3$Fysgam4I8aG(o%vC^j9(V0*OM@NPJk=~|OD?60aJ@+CJ zZFbSwJB)hL8pf1(%YY1gXm6J+PkY*OoV4jNX_FQZ6&PI4-i}@J?xYTR_P8UskNKQF zVq{a8o!|Z8zK&gqE2Ioe`8ie8C z>liA$T_IGM`WcwfmCmkz8pCxHobvD+=ZgP5I9@kVv$W+h>UY2w*EY;w=zTA=Md9^~ zTN9!c3SPedy)V2^?iIWr?-l$%_44`uoVDULhO(dkA;A6&Ya<>%uLoIc#OL*(fBXit z<64mUyk2Cz8-ojiW5go!d7WnghD#9U^ZJuDuQ$O&3c2H|xF1Tm_G3P;_gM4sj#04Ye}y2dXjY`_2eHv58w9m`IwBKf^CV0oRaxUBc^G zeoxYG&vn)}fE)4fdHp=y03Zn4xwY9kwybj~Bd+6dOUO<7we9pOFw-wjCmHGAf M#{yF8BlxP~@1wCoegFUf literal 0 HcmV?d00001 diff --git a/modules/CMakeFiles/3.28.3/CMakeSystem.cmake b/modules/CMakeFiles/3.28.3/CMakeSystem.cmake new file mode 100644 index 0000000..e01f3fe --- /dev/null +++ b/modules/CMakeFiles/3.28.3/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-6.11.0-19-generic") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "6.11.0-19-generic") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Linux-6.11.0-19-generic") +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_VERSION "6.11.0-19-generic") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/modules/CMakeFiles/3.28.3/CompilerIdC/CMakeCCompilerId.c b/modules/CMakeFiles/3.28.3/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..0a0ec9b --- /dev/null +++ b/modules/CMakeFiles/3.28.3/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,880 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif __STDC_VERSION__ > 201710L +# define C_VERSION "23" +#elif __STDC_VERSION__ >= 201710L +# define C_VERSION "17" +#elif __STDC_VERSION__ >= 201000L +# define C_VERSION "11" +#elif __STDC_VERSION__ >= 199901L +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/modules/CMakeFiles/3.28.3/CompilerIdC/a.out b/modules/CMakeFiles/3.28.3/CompilerIdC/a.out new file mode 100755 index 0000000000000000000000000000000000000000..ecc315e71b4e62a6558ef29ebb804b7c2bdf9e59 GIT binary patch literal 16088 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 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +# if defined(__INTEL_CXX11_MODE__) +# if defined(__cpp_aggregate_nsdmi) +# define CXX_STD 201402L +# else +# define CXX_STD 201103L +# endif +# else +# define CXX_STD 199711L +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# define CXX_STD _MSVC_LANG +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > 202002L + "23" +#elif CXX_STD > 201703L + "20" +#elif CXX_STD >= 201703L + "17" +#elif CXX_STD >= 201402L + "14" +#elif CXX_STD >= 201103L + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/modules/CMakeFiles/3.28.3/CompilerIdCXX/a.out b/modules/CMakeFiles/3.28.3/CompilerIdCXX/a.out new file mode 100755 index 0000000000000000000000000000000000000000..c8ced32cf082708045baa23211fbf858c298928d GIT binary patch literal 16096 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 ASpWb4 literal 0 HcmV?d00001 diff --git a/modules/CMakeFiles/CMakeConfigureLog.yaml b/modules/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..37d3c3e --- /dev/null +++ b/modules/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,531 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineSystem.cmake:233 (message)" + - "CMakeLists.txt:53 (project)" + message: | + The system is: Linux - 6.11.0-19-generic - x86_64 + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:53 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /usr/bin/cc + Build flags: + Id flags: + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" + + The C compiler identification is GNU, found in: + /home/gmgauthier/Projects/code/rexx/CMakeFiles/3.28.3/CompilerIdC/a.out + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:53 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /usr/bin/c++ + Build flags: + Id flags: + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + + The CXX compiler identification is GNU, found in: + /home/gmgauthier/Projects/code/rexx/CMakeFiles/3.28.3/CompilerIdCXX/a.out + + - + kind: "try_compile-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:57 (try_compile)" + - "/usr/share/cmake-3.28/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:53 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-hxjnCA" + binary: "/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-hxjnCA" + cmakeVariables: + CMAKE_C_FLAGS: "" + CMAKE_EXE_LINKER_FLAGS: "" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-hxjnCA' + + Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_aaf9c/fast + /usr/bin/gmake -f CMakeFiles/cmTC_aaf9c.dir/build.make CMakeFiles/cmTC_aaf9c.dir/build + gmake[1]: Entering directory '/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-hxjnCA' + Building C object CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o + /usr/bin/cc -v -o CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.28/Modules/CMakeCCompilerABI.c + Using built-in specs. + COLLECT_GCC=/usr/bin/cc + OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa + OFFLOAD_TARGET_DEFAULT=1 + Target: x86_64-linux-gnu + Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2 + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_aaf9c.dir/' + /usr/libexec/gcc/x86_64-linux-gnu/13/cc1 -quiet -v -imultiarch x86_64-linux-gnu /usr/share/cmake-3.28/Modules/CMakeCCompilerABI.c -quiet -dumpdir CMakeFiles/cmTC_aaf9c.dir/ -dumpbase CMakeCCompilerABI.c.c -dumpbase-ext .c -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccr6vMbf.s + GNU C17 (Ubuntu 13.3.0-6ubuntu2~24.04) version 13.3.0 (x86_64-linux-gnu) + compiled by GNU C version 13.3.0, GMP version 6.3.0, MPFR version 4.2.1, MPC version 1.3.1, isl version isl-0.26-GMP + + GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 + ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed/x86_64-linux-gnu" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include" + #include "..." search starts here: + #include <...> search starts here: + /usr/lib/gcc/x86_64-linux-gnu/13/include + /usr/local/include + /usr/include/x86_64-linux-gnu + /usr/include + End of search list. + Compiler executable checksum: 38987c28e967c64056a6454abdef726e + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_aaf9c.dir/' + as -v --64 -o CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o /tmp/ccr6vMbf.s + GNU assembler version 2.42 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.42 + COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.' + Linking C executable cmTC_aaf9c + /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_aaf9c.dir/link.txt --verbose=1 + /usr/bin/cc -v -rdynamic CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o -o cmTC_aaf9c + Using built-in specs. + COLLECT_GCC=/usr/bin/cc + COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper + OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa + OFFLOAD_TARGET_DEFAULT=1 + Target: x86_64-linux-gnu + Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2 + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) + COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-v' '-rdynamic' '-o' 'cmTC_aaf9c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_aaf9c.' + /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/ccEUJSae.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_aaf9c /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o + COLLECT_GCC_OPTIONS='-v' '-rdynamic' '-o' 'cmTC_aaf9c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_aaf9c.' + gmake[1]: Leaving directory '/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-hxjnCA' + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:127 (message)" + - "/usr/share/cmake-3.28/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:53 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/usr/lib/gcc/x86_64-linux-gnu/13/include] + add: [/usr/local/include] + add: [/usr/include/x86_64-linux-gnu] + add: [/usr/include] + end of search list found + collapse include dir [/usr/lib/gcc/x86_64-linux-gnu/13/include] ==> [/usr/lib/gcc/x86_64-linux-gnu/13/include] + collapse include dir [/usr/local/include] ==> [/usr/local/include] + collapse include dir [/usr/include/x86_64-linux-gnu] ==> [/usr/include/x86_64-linux-gnu] + collapse include dir [/usr/include] ==> [/usr/include] + implicit include dirs: [/usr/lib/gcc/x86_64-linux-gnu/13/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:159 (message)" + - "/usr/share/cmake-3.28/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:53 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + ignore line: [Change Dir: '/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-hxjnCA'] + ignore line: [] + ignore line: [Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_aaf9c/fast] + ignore line: [/usr/bin/gmake -f CMakeFiles/cmTC_aaf9c.dir/build.make CMakeFiles/cmTC_aaf9c.dir/build] + ignore line: [gmake[1]: Entering directory '/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-hxjnCA'] + ignore line: [Building C object CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o] + ignore line: [/usr/bin/cc -v -o CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.28/Modules/CMakeCCompilerABI.c] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c ada c++ go d fortran objc obj-c++ m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) ] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_aaf9c.dir/'] + ignore line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/cc1 -quiet -v -imultiarch x86_64-linux-gnu /usr/share/cmake-3.28/Modules/CMakeCCompilerABI.c -quiet -dumpdir CMakeFiles/cmTC_aaf9c.dir/ -dumpbase CMakeCCompilerABI.c.c -dumpbase-ext .c -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccr6vMbf.s] + ignore line: [GNU C17 (Ubuntu 13.3.0-6ubuntu2~24.04) version 13.3.0 (x86_64-linux-gnu)] + ignore line: [ compiled by GNU C version 13.3.0 GMP version 6.3.0 MPFR version 4.2.1 MPC version 1.3.1 isl version isl-0.26-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed/x86_64-linux-gnu"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/13/include] + ignore line: [ /usr/local/include] + ignore line: [ /usr/include/x86_64-linux-gnu] + ignore line: [ /usr/include] + ignore line: [End of search list.] + ignore line: [Compiler executable checksum: 38987c28e967c64056a6454abdef726e] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_aaf9c.dir/'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o /tmp/ccr6vMbf.s] + ignore line: [GNU assembler version 2.42 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.42] + ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.'] + ignore line: [Linking C executable cmTC_aaf9c] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_aaf9c.dir/link.txt --verbose=1] + ignore line: [/usr/bin/cc -v -rdynamic CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o -o cmTC_aaf9c ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c ada c++ go d fortran objc obj-c++ m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) ] + ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-rdynamic' '-o' 'cmTC_aaf9c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_aaf9c.'] + link line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/ccEUJSae.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_aaf9c /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/libexec/gcc/x86_64-linux-gnu/13/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccEUJSae.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-pie] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_aaf9c] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../..] + arg [CMakeFiles/cmTC_aaf9c.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [--push-state] ==> ignore + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--pop-state] ==> ignore + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [--push-state] ==> ignore + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--pop-state] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] + collapse obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] ==> [/usr/lib/x86_64-linux-gnu/Scrt1.o] + collapse obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] ==> [/usr/lib/x86_64-linux-gnu/crti.o] + collapse obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] ==> [/usr/lib/x86_64-linux-gnu/crtn.o] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13] ==> [/usr/lib/gcc/x86_64-linux-gnu/13] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../..] ==> [/usr/lib] + implicit libs: [gcc;gcc_s;c;gcc;gcc_s] + implicit objs: [/usr/lib/x86_64-linux-gnu/Scrt1.o;/usr/lib/x86_64-linux-gnu/crti.o;/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o;/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o;/usr/lib/x86_64-linux-gnu/crtn.o] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/13;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + + - + kind: "try_compile-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:57 (try_compile)" + - "/usr/share/cmake-3.28/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:53 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-6uhSR4" + binary: "/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-6uhSR4" + cmakeVariables: + CMAKE_CXX_FLAGS: "" + CMAKE_EXE_LINKER_FLAGS: "" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-6uhSR4' + + Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_7c7ac/fast + /usr/bin/gmake -f CMakeFiles/cmTC_7c7ac.dir/build.make CMakeFiles/cmTC_7c7ac.dir/build + gmake[1]: Entering directory '/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-6uhSR4' + Building CXX object CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o + /usr/bin/c++ -v -o CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp + Using built-in specs. + COLLECT_GCC=/usr/bin/c++ + OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa + OFFLOAD_TARGET_DEFAULT=1 + Target: x86_64-linux-gnu + Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2 + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_7c7ac.dir/' + /usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_7c7ac.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/cc6lexkl.s + GNU C++17 (Ubuntu 13.3.0-6ubuntu2~24.04) version 13.3.0 (x86_64-linux-gnu) + compiled by GNU C version 13.3.0, GMP version 6.3.0, MPFR version 4.2.1, MPC version 1.3.1, isl version isl-0.26-GMP + + GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 + ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/13" + ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed/x86_64-linux-gnu" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include" + #include "..." search starts here: + #include <...> search starts here: + /usr/include/c++/13 + /usr/include/x86_64-linux-gnu/c++/13 + /usr/include/c++/13/backward + /usr/lib/gcc/x86_64-linux-gnu/13/include + /usr/local/include + /usr/include/x86_64-linux-gnu + /usr/include + End of search list. + Compiler executable checksum: c81c05345ce537099dafd5580045814a + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_7c7ac.dir/' + as -v --64 -o CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o /tmp/cc6lexkl.s + GNU assembler version 2.42 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.42 + COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.' + Linking CXX executable cmTC_7c7ac + /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_7c7ac.dir/link.txt --verbose=1 + /usr/bin/c++ -v -rdynamic CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_7c7ac + Using built-in specs. + COLLECT_GCC=/usr/bin/c++ + COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper + OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa + OFFLOAD_TARGET_DEFAULT=1 + Target: x86_64-linux-gnu + Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2 + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) + COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-v' '-rdynamic' '-o' 'cmTC_7c7ac' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_7c7ac.' + /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/cctX5X4H.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_7c7ac /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o + COLLECT_GCC_OPTIONS='-v' '-rdynamic' '-o' 'cmTC_7c7ac' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_7c7ac.' + gmake[1]: Leaving directory '/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-6uhSR4' + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:127 (message)" + - "/usr/share/cmake-3.28/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:53 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/usr/include/c++/13] + add: [/usr/include/x86_64-linux-gnu/c++/13] + add: [/usr/include/c++/13/backward] + add: [/usr/lib/gcc/x86_64-linux-gnu/13/include] + add: [/usr/local/include] + add: [/usr/include/x86_64-linux-gnu] + add: [/usr/include] + end of search list found + collapse include dir [/usr/include/c++/13] ==> [/usr/include/c++/13] + collapse include dir [/usr/include/x86_64-linux-gnu/c++/13] ==> [/usr/include/x86_64-linux-gnu/c++/13] + collapse include dir [/usr/include/c++/13/backward] ==> [/usr/include/c++/13/backward] + collapse include dir [/usr/lib/gcc/x86_64-linux-gnu/13/include] ==> [/usr/lib/gcc/x86_64-linux-gnu/13/include] + collapse include dir [/usr/local/include] ==> [/usr/local/include] + collapse include dir [/usr/include/x86_64-linux-gnu] ==> [/usr/include/x86_64-linux-gnu] + collapse include dir [/usr/include] ==> [/usr/include] + implicit include dirs: [/usr/include/c++/13;/usr/include/x86_64-linux-gnu/c++/13;/usr/include/c++/13/backward;/usr/lib/gcc/x86_64-linux-gnu/13/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:159 (message)" + - "/usr/share/cmake-3.28/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:53 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + ignore line: [Change Dir: '/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-6uhSR4'] + ignore line: [] + ignore line: [Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_7c7ac/fast] + ignore line: [/usr/bin/gmake -f CMakeFiles/cmTC_7c7ac.dir/build.make CMakeFiles/cmTC_7c7ac.dir/build] + ignore line: [gmake[1]: Entering directory '/home/gmgauthier/Projects/code/rexx/CMakeFiles/CMakeScratch/TryCompile-6uhSR4'] + ignore line: [Building CXX object CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/c++ -v -o CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c ada c++ go d fortran objc obj-c++ m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) ] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_7c7ac.dir/'] + ignore line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_7c7ac.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/cc6lexkl.s] + ignore line: [GNU C++17 (Ubuntu 13.3.0-6ubuntu2~24.04) version 13.3.0 (x86_64-linux-gnu)] + ignore line: [ compiled by GNU C version 13.3.0 GMP version 6.3.0 MPFR version 4.2.1 MPC version 1.3.1 isl version isl-0.26-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/13"] + ignore line: [ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed/x86_64-linux-gnu"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /usr/include/c++/13] + ignore line: [ /usr/include/x86_64-linux-gnu/c++/13] + ignore line: [ /usr/include/c++/13/backward] + ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/13/include] + ignore line: [ /usr/local/include] + ignore line: [ /usr/include/x86_64-linux-gnu] + ignore line: [ /usr/include] + ignore line: [End of search list.] + ignore line: [Compiler executable checksum: c81c05345ce537099dafd5580045814a] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_7c7ac.dir/'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o /tmp/cc6lexkl.s] + ignore line: [GNU assembler version 2.42 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.42] + ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.'] + ignore line: [Linking CXX executable cmTC_7c7ac] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_7c7ac.dir/link.txt --verbose=1] + ignore line: [/usr/bin/c++ -v -rdynamic CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_7c7ac ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c ada c++ go d fortran objc obj-c++ m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) ] + ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-rdynamic' '-o' 'cmTC_7c7ac' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_7c7ac.'] + link line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/cctX5X4H.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_7c7ac /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/libexec/gcc/x86_64-linux-gnu/13/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/cctX5X4H.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-pie] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_7c7ac] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../..] + arg [CMakeFiles/cmTC_7c7ac.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] + collapse obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] ==> [/usr/lib/x86_64-linux-gnu/Scrt1.o] + collapse obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] ==> [/usr/lib/x86_64-linux-gnu/crti.o] + collapse obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] ==> [/usr/lib/x86_64-linux-gnu/crtn.o] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13] ==> [/usr/lib/gcc/x86_64-linux-gnu/13] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../..] ==> [/usr/lib] + implicit libs: [stdc++;m;gcc_s;gcc;c;gcc_s;gcc] + implicit objs: [/usr/lib/x86_64-linux-gnu/Scrt1.o;/usr/lib/x86_64-linux-gnu/crti.o;/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o;/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o;/usr/lib/x86_64-linux-gnu/crtn.o] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/13;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + +... diff --git a/modules/CMakeFiles/CMakeDirectoryInformation.cmake b/modules/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..46ef49d --- /dev/null +++ b/modules/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/gmgauthier/Projects/code/rexx/api") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/gmgauthier/Projects/code/rexx") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/modules/CMakeFiles/Makefile.cmake b/modules/CMakeFiles/Makefile.cmake new file mode 100644 index 0000000..ebec120 --- /dev/null +++ b/modules/CMakeFiles/Makefile.cmake @@ -0,0 +1,157 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# The generator used is: +set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") + +# The top level Makefile was generated from the following files: +set(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "CMakeFiles/3.28.3/CMakeCCompiler.cmake" + "CMakeFiles/3.28.3/CMakeCXXCompiler.cmake" + "CMakeFiles/3.28.3/CMakeSystem.cmake" + "/home/gmgauthier/Projects/code/rexx/api/CMakeLists.txt" + "/home/gmgauthier/Projects/code/rexx/api/c++/CMakeLists.txt" + "/home/gmgauthier/Projects/code/rexx/api/c++/call.example/CMakeLists.txt" + "/home/gmgauthier/Projects/code/rexx/api/c++/external/CMakeLists.txt" + "/home/gmgauthier/Projects/code/rexx/api/classic/CMakeLists.txt" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeLists.txt" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/CMakeLists.txt" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/CMakeLists.txt" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2/CMakeLists.txt" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3/CMakeLists.txt" + "/usr/share/cmake-3.28/Modules/CMakeCCompiler.cmake.in" + "/usr/share/cmake-3.28/Modules/CMakeCCompilerABI.c" + "/usr/share/cmake-3.28/Modules/CMakeCInformation.cmake" + "/usr/share/cmake-3.28/Modules/CMakeCXXCompiler.cmake.in" + "/usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp" + "/usr/share/cmake-3.28/Modules/CMakeCXXInformation.cmake" + "/usr/share/cmake-3.28/Modules/CMakeCommonLanguageInclude.cmake" + "/usr/share/cmake-3.28/Modules/CMakeCompilerIdDetection.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineCCompiler.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineCXXCompiler.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineCompileFeatures.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineSystem.cmake" + "/usr/share/cmake-3.28/Modules/CMakeFindBinUtils.cmake" + "/usr/share/cmake-3.28/Modules/CMakeGenericSystem.cmake" + "/usr/share/cmake-3.28/Modules/CMakeInitializeConfigs.cmake" + "/usr/share/cmake-3.28/Modules/CMakeLanguageInformation.cmake" + "/usr/share/cmake-3.28/Modules/CMakeParseImplicitIncludeInfo.cmake" + "/usr/share/cmake-3.28/Modules/CMakeParseImplicitLinkInfo.cmake" + "/usr/share/cmake-3.28/Modules/CMakeParseLibraryArchitecture.cmake" + "/usr/share/cmake-3.28/Modules/CMakeSystem.cmake.in" + "/usr/share/cmake-3.28/Modules/CMakeSystemSpecificInformation.cmake" + "/usr/share/cmake-3.28/Modules/CMakeSystemSpecificInitialize.cmake" + "/usr/share/cmake-3.28/Modules/CMakeTestCCompiler.cmake" + "/usr/share/cmake-3.28/Modules/CMakeTestCXXCompiler.cmake" + "/usr/share/cmake-3.28/Modules/CMakeTestCompilerCommon.cmake" + "/usr/share/cmake-3.28/Modules/CMakeUnixFindMake.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/ADSP-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Borland-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Clang-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Cray-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GHS-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GNU-C.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GNU-CXX.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GNU-FindBinUtils.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GNU.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/HP-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/IAR-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Intel-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/MSVC-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/PGI-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/PathScale-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/SCO-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/TI-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Tasking-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Watcom-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/XL-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Internal/FeatureTesting.cmake" + "/usr/share/cmake-3.28/Modules/Platform/Linux-Determine-CXX.cmake" + "/usr/share/cmake-3.28/Modules/Platform/Linux-GNU-C.cmake" + "/usr/share/cmake-3.28/Modules/Platform/Linux-GNU-CXX.cmake" + "/usr/share/cmake-3.28/Modules/Platform/Linux-GNU.cmake" + "/usr/share/cmake-3.28/Modules/Platform/Linux-Initialize.cmake" + "/usr/share/cmake-3.28/Modules/Platform/Linux.cmake" + "/usr/share/cmake-3.28/Modules/Platform/UnixPaths.cmake" + ) + +# The corresponding makefile is: +set(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +set(CMAKE_MAKEFILE_PRODUCTS + "CMakeFiles/3.28.3/CMakeSystem.cmake" + "CMakeFiles/3.28.3/CMakeCCompiler.cmake" + "CMakeFiles/3.28.3/CMakeCXXCompiler.cmake" + "CMakeFiles/3.28.3/CMakeCCompiler.cmake" + "CMakeFiles/3.28.3/CMakeCXXCompiler.cmake" + "CMakeFiles/CMakeDirectoryInformation.cmake" + "c++/CMakeFiles/CMakeDirectoryInformation.cmake" + "c++/call.example/CMakeFiles/CMakeDirectoryInformation.cmake" + "c++/external/CMakeFiles/CMakeDirectoryInformation.cmake" + "classic/CMakeFiles/CMakeDirectoryInformation.cmake" + "classic/unix/CMakeFiles/CMakeDirectoryInformation.cmake" + "classic/unix/callrexx/CMakeFiles/CMakeDirectoryInformation.cmake" + "classic/unix/rexxapi1/CMakeFiles/CMakeDirectoryInformation.cmake" + "classic/unix/rexxapi2/CMakeFiles/CMakeDirectoryInformation.cmake" + "classic/unix/rexxapi3/CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +set(CMAKE_DEPEND_INFO_FILES + "c++/call.example/CMakeFiles/stackOverflow.dir/DependInfo.cmake" + "c++/call.example/CMakeFiles/runRexxProgram.dir/DependInfo.cmake" + "c++/external/CMakeFiles/external_routines.dir/DependInfo.cmake" + "c++/external/CMakeFiles/external_methods.dir/DependInfo.cmake" + "c++/external/CMakeFiles/external_methods_routines.dir/DependInfo.cmake" + "classic/unix/callrexx/CMakeFiles/callrexx1.dir/DependInfo.cmake" + "classic/unix/callrexx/CMakeFiles/callrexx2.dir/DependInfo.cmake" + "classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/DependInfo.cmake" + "classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/DependInfo.cmake" + "classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/DependInfo.cmake" + ) diff --git a/modules/CMakeFiles/Makefile2 b/modules/CMakeFiles/Makefile2 new file mode 100644 index 0000000..7e272e3 --- /dev/null +++ b/modules/CMakeFiles/Makefile2 @@ -0,0 +1,504 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +#============================================================================= +# Directory level rules for the build root directory + +# The main recursive "all" target. +all: c++/all +all: classic/all +.PHONY : all + +# The main recursive "preinstall" target. +preinstall: c++/preinstall +preinstall: classic/preinstall +.PHONY : preinstall + +# The main recursive "clean" target. +clean: c++/clean +clean: classic/clean +.PHONY : clean + +#============================================================================= +# Directory level rules for directory c++ + +# Recursive "all" directory target. +c++/all: c++/call.example/all +c++/all: c++/external/all +.PHONY : c++/all + +# Recursive "preinstall" directory target. +c++/preinstall: c++/call.example/preinstall +c++/preinstall: c++/external/preinstall +.PHONY : c++/preinstall + +# Recursive "clean" directory target. +c++/clean: c++/call.example/clean +c++/clean: c++/external/clean +.PHONY : c++/clean + +#============================================================================= +# Directory level rules for directory c++/call.example + +# Recursive "all" directory target. +c++/call.example/all: c++/call.example/CMakeFiles/stackOverflow.dir/all +c++/call.example/all: c++/call.example/CMakeFiles/runRexxProgram.dir/all +.PHONY : c++/call.example/all + +# Recursive "preinstall" directory target. +c++/call.example/preinstall: +.PHONY : c++/call.example/preinstall + +# Recursive "clean" directory target. +c++/call.example/clean: c++/call.example/CMakeFiles/stackOverflow.dir/clean +c++/call.example/clean: c++/call.example/CMakeFiles/runRexxProgram.dir/clean +.PHONY : c++/call.example/clean + +#============================================================================= +# Directory level rules for directory c++/external + +# Recursive "all" directory target. +c++/external/all: c++/external/CMakeFiles/external_routines.dir/all +c++/external/all: c++/external/CMakeFiles/external_methods.dir/all +c++/external/all: c++/external/CMakeFiles/external_methods_routines.dir/all +.PHONY : c++/external/all + +# Recursive "preinstall" directory target. +c++/external/preinstall: +.PHONY : c++/external/preinstall + +# Recursive "clean" directory target. +c++/external/clean: c++/external/CMakeFiles/external_routines.dir/clean +c++/external/clean: c++/external/CMakeFiles/external_methods.dir/clean +c++/external/clean: c++/external/CMakeFiles/external_methods_routines.dir/clean +.PHONY : c++/external/clean + +#============================================================================= +# Directory level rules for directory classic + +# Recursive "all" directory target. +classic/all: classic/unix/all +.PHONY : classic/all + +# Recursive "preinstall" directory target. +classic/preinstall: classic/unix/preinstall +.PHONY : classic/preinstall + +# Recursive "clean" directory target. +classic/clean: classic/unix/clean +.PHONY : classic/clean + +#============================================================================= +# Directory level rules for directory classic/unix + +# Recursive "all" directory target. +classic/unix/all: classic/unix/callrexx/all +classic/unix/all: classic/unix/rexxapi1/all +classic/unix/all: classic/unix/rexxapi2/all +classic/unix/all: classic/unix/rexxapi3/all +.PHONY : classic/unix/all + +# Recursive "preinstall" directory target. +classic/unix/preinstall: classic/unix/callrexx/preinstall +classic/unix/preinstall: classic/unix/rexxapi1/preinstall +classic/unix/preinstall: classic/unix/rexxapi2/preinstall +classic/unix/preinstall: classic/unix/rexxapi3/preinstall +.PHONY : classic/unix/preinstall + +# Recursive "clean" directory target. +classic/unix/clean: classic/unix/callrexx/clean +classic/unix/clean: classic/unix/rexxapi1/clean +classic/unix/clean: classic/unix/rexxapi2/clean +classic/unix/clean: classic/unix/rexxapi3/clean +.PHONY : classic/unix/clean + +#============================================================================= +# Directory level rules for directory classic/unix/callrexx + +# Recursive "all" directory target. +classic/unix/callrexx/all: classic/unix/callrexx/CMakeFiles/callrexx1.dir/all +classic/unix/callrexx/all: classic/unix/callrexx/CMakeFiles/callrexx2.dir/all +.PHONY : classic/unix/callrexx/all + +# Recursive "preinstall" directory target. +classic/unix/callrexx/preinstall: +.PHONY : classic/unix/callrexx/preinstall + +# Recursive "clean" directory target. +classic/unix/callrexx/clean: classic/unix/callrexx/CMakeFiles/callrexx1.dir/clean +classic/unix/callrexx/clean: classic/unix/callrexx/CMakeFiles/callrexx2.dir/clean +.PHONY : classic/unix/callrexx/clean + +#============================================================================= +# Directory level rules for directory classic/unix/rexxapi1 + +# Recursive "all" directory target. +classic/unix/rexxapi1/all: classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/all +.PHONY : classic/unix/rexxapi1/all + +# Recursive "preinstall" directory target. +classic/unix/rexxapi1/preinstall: +.PHONY : classic/unix/rexxapi1/preinstall + +# Recursive "clean" directory target. +classic/unix/rexxapi1/clean: classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/clean +.PHONY : classic/unix/rexxapi1/clean + +#============================================================================= +# Directory level rules for directory classic/unix/rexxapi2 + +# Recursive "all" directory target. +classic/unix/rexxapi2/all: classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/all +.PHONY : classic/unix/rexxapi2/all + +# Recursive "preinstall" directory target. +classic/unix/rexxapi2/preinstall: +.PHONY : classic/unix/rexxapi2/preinstall + +# Recursive "clean" directory target. +classic/unix/rexxapi2/clean: classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/clean +.PHONY : classic/unix/rexxapi2/clean + +#============================================================================= +# Directory level rules for directory classic/unix/rexxapi3 + +# Recursive "all" directory target. +classic/unix/rexxapi3/all: classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/all +.PHONY : classic/unix/rexxapi3/all + +# Recursive "preinstall" directory target. +classic/unix/rexxapi3/preinstall: +.PHONY : classic/unix/rexxapi3/preinstall + +# Recursive "clean" directory target. +classic/unix/rexxapi3/clean: classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/clean +.PHONY : classic/unix/rexxapi3/clean + +#============================================================================= +# Target rules for target c++/call.example/CMakeFiles/stackOverflow.dir + +# All Build rule for target. +c++/call.example/CMakeFiles/stackOverflow.dir/all: + $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/stackOverflow.dir/build.make c++/call.example/CMakeFiles/stackOverflow.dir/depend + $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/stackOverflow.dir/build.make c++/call.example/CMakeFiles/stackOverflow.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=19,20 "Built target stackOverflow" +.PHONY : c++/call.example/CMakeFiles/stackOverflow.dir/all + +# Build rule for subdir invocation for target. +c++/call.example/CMakeFiles/stackOverflow.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/call.example/CMakeFiles/stackOverflow.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : c++/call.example/CMakeFiles/stackOverflow.dir/rule + +# Convenience name for target. +stackOverflow: c++/call.example/CMakeFiles/stackOverflow.dir/rule +.PHONY : stackOverflow + +# clean rule for target. +c++/call.example/CMakeFiles/stackOverflow.dir/clean: + $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/stackOverflow.dir/build.make c++/call.example/CMakeFiles/stackOverflow.dir/clean +.PHONY : c++/call.example/CMakeFiles/stackOverflow.dir/clean + +#============================================================================= +# Target rules for target c++/call.example/CMakeFiles/runRexxProgram.dir + +# All Build rule for target. +c++/call.example/CMakeFiles/runRexxProgram.dir/all: + $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/runRexxProgram.dir/build.make c++/call.example/CMakeFiles/runRexxProgram.dir/depend + $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/runRexxProgram.dir/build.make c++/call.example/CMakeFiles/runRexxProgram.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=17,18 "Built target runRexxProgram" +.PHONY : c++/call.example/CMakeFiles/runRexxProgram.dir/all + +# Build rule for subdir invocation for target. +c++/call.example/CMakeFiles/runRexxProgram.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/call.example/CMakeFiles/runRexxProgram.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : c++/call.example/CMakeFiles/runRexxProgram.dir/rule + +# Convenience name for target. +runRexxProgram: c++/call.example/CMakeFiles/runRexxProgram.dir/rule +.PHONY : runRexxProgram + +# clean rule for target. +c++/call.example/CMakeFiles/runRexxProgram.dir/clean: + $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/runRexxProgram.dir/build.make c++/call.example/CMakeFiles/runRexxProgram.dir/clean +.PHONY : c++/call.example/CMakeFiles/runRexxProgram.dir/clean + +#============================================================================= +# Target rules for target c++/external/CMakeFiles/external_routines.dir + +# All Build rule for target. +c++/external/CMakeFiles/external_routines.dir/all: + $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_routines.dir/build.make c++/external/CMakeFiles/external_routines.dir/depend + $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_routines.dir/build.make c++/external/CMakeFiles/external_routines.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=9,10 "Built target external_routines" +.PHONY : c++/external/CMakeFiles/external_routines.dir/all + +# Build rule for subdir invocation for target. +c++/external/CMakeFiles/external_routines.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/external/CMakeFiles/external_routines.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : c++/external/CMakeFiles/external_routines.dir/rule + +# Convenience name for target. +external_routines: c++/external/CMakeFiles/external_routines.dir/rule +.PHONY : external_routines + +# clean rule for target. +c++/external/CMakeFiles/external_routines.dir/clean: + $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_routines.dir/build.make c++/external/CMakeFiles/external_routines.dir/clean +.PHONY : c++/external/CMakeFiles/external_routines.dir/clean + +#============================================================================= +# Target rules for target c++/external/CMakeFiles/external_methods.dir + +# All Build rule for target. +c++/external/CMakeFiles/external_methods.dir/all: + $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods.dir/build.make c++/external/CMakeFiles/external_methods.dir/depend + $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods.dir/build.make c++/external/CMakeFiles/external_methods.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=5,6 "Built target external_methods" +.PHONY : c++/external/CMakeFiles/external_methods.dir/all + +# Build rule for subdir invocation for target. +c++/external/CMakeFiles/external_methods.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/external/CMakeFiles/external_methods.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : c++/external/CMakeFiles/external_methods.dir/rule + +# Convenience name for target. +external_methods: c++/external/CMakeFiles/external_methods.dir/rule +.PHONY : external_methods + +# clean rule for target. +c++/external/CMakeFiles/external_methods.dir/clean: + $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods.dir/build.make c++/external/CMakeFiles/external_methods.dir/clean +.PHONY : c++/external/CMakeFiles/external_methods.dir/clean + +#============================================================================= +# Target rules for target c++/external/CMakeFiles/external_methods_routines.dir + +# All Build rule for target. +c++/external/CMakeFiles/external_methods_routines.dir/all: + $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods_routines.dir/build.make c++/external/CMakeFiles/external_methods_routines.dir/depend + $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods_routines.dir/build.make c++/external/CMakeFiles/external_methods_routines.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=7,8 "Built target external_methods_routines" +.PHONY : c++/external/CMakeFiles/external_methods_routines.dir/all + +# Build rule for subdir invocation for target. +c++/external/CMakeFiles/external_methods_routines.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/external/CMakeFiles/external_methods_routines.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : c++/external/CMakeFiles/external_methods_routines.dir/rule + +# Convenience name for target. +external_methods_routines: c++/external/CMakeFiles/external_methods_routines.dir/rule +.PHONY : external_methods_routines + +# clean rule for target. +c++/external/CMakeFiles/external_methods_routines.dir/clean: + $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods_routines.dir/build.make c++/external/CMakeFiles/external_methods_routines.dir/clean +.PHONY : c++/external/CMakeFiles/external_methods_routines.dir/clean + +#============================================================================= +# Target rules for target classic/unix/callrexx/CMakeFiles/callrexx1.dir + +# All Build rule for target. +classic/unix/callrexx/CMakeFiles/callrexx1.dir/all: + $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx1.dir/depend + $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx1.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=1,2 "Built target callrexx1" +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx1.dir/all + +# Build rule for subdir invocation for target. +classic/unix/callrexx/CMakeFiles/callrexx1.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/callrexx/CMakeFiles/callrexx1.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx1.dir/rule + +# Convenience name for target. +callrexx1: classic/unix/callrexx/CMakeFiles/callrexx1.dir/rule +.PHONY : callrexx1 + +# clean rule for target. +classic/unix/callrexx/CMakeFiles/callrexx1.dir/clean: + $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx1.dir/clean +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx1.dir/clean + +#============================================================================= +# Target rules for target classic/unix/callrexx/CMakeFiles/callrexx2.dir + +# All Build rule for target. +classic/unix/callrexx/CMakeFiles/callrexx2.dir/all: + $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx2.dir/depend + $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx2.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=3,4 "Built target callrexx2" +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx2.dir/all + +# Build rule for subdir invocation for target. +classic/unix/callrexx/CMakeFiles/callrexx2.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/callrexx/CMakeFiles/callrexx2.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx2.dir/rule + +# Convenience name for target. +callrexx2: classic/unix/callrexx/CMakeFiles/callrexx2.dir/rule +.PHONY : callrexx2 + +# clean rule for target. +classic/unix/callrexx/CMakeFiles/callrexx2.dir/clean: + $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx2.dir/clean +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx2.dir/clean + +#============================================================================= +# Target rules for target classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir + +# All Build rule for target. +classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/all: + $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/depend + $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=11,12 "Built target rexxapi1" +.PHONY : classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/all + +# Build rule for subdir invocation for target. +classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rule + +# Convenience name for target. +rexxapi1: classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rule +.PHONY : rexxapi1 + +# clean rule for target. +classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/clean: + $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/clean +.PHONY : classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/clean + +#============================================================================= +# Target rules for target classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir + +# All Build rule for target. +classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/all: + $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/depend + $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=13,14 "Built target rexxapi2" +.PHONY : classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/all + +# Build rule for subdir invocation for target. +classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rule + +# Convenience name for target. +rexxapi2: classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rule +.PHONY : rexxapi2 + +# clean rule for target. +classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/clean: + $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/clean +.PHONY : classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/clean + +#============================================================================= +# Target rules for target classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir + +# All Build rule for target. +classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/all: + $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/depend + $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=15,16 "Built target rexxapi3" +.PHONY : classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/all + +# Build rule for subdir invocation for target. +classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rule + +# Convenience name for target. +rexxapi3: classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rule +.PHONY : rexxapi3 + +# clean rule for target. +classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/clean: + $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/clean +.PHONY : classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/CMakeFiles/TargetDirectories.txt b/modules/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..a815704 --- /dev/null +++ b/modules/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,70 @@ +/home/gmgauthier/Projects/code/rexx/CMakeFiles/edit_cache.dir +/home/gmgauthier/Projects/code/rexx/CMakeFiles/rebuild_cache.dir +/home/gmgauthier/Projects/code/rexx/CMakeFiles/list_install_components.dir +/home/gmgauthier/Projects/code/rexx/CMakeFiles/install.dir +/home/gmgauthier/Projects/code/rexx/CMakeFiles/install/local.dir +/home/gmgauthier/Projects/code/rexx/CMakeFiles/install/strip.dir +/home/gmgauthier/Projects/code/rexx/c++/CMakeFiles/edit_cache.dir +/home/gmgauthier/Projects/code/rexx/c++/CMakeFiles/rebuild_cache.dir +/home/gmgauthier/Projects/code/rexx/c++/CMakeFiles/list_install_components.dir +/home/gmgauthier/Projects/code/rexx/c++/CMakeFiles/install.dir +/home/gmgauthier/Projects/code/rexx/c++/CMakeFiles/install/local.dir +/home/gmgauthier/Projects/code/rexx/c++/CMakeFiles/install/strip.dir +/home/gmgauthier/Projects/code/rexx/c++/call.example/CMakeFiles/stackOverflow.dir +/home/gmgauthier/Projects/code/rexx/c++/call.example/CMakeFiles/runRexxProgram.dir +/home/gmgauthier/Projects/code/rexx/c++/call.example/CMakeFiles/edit_cache.dir +/home/gmgauthier/Projects/code/rexx/c++/call.example/CMakeFiles/rebuild_cache.dir +/home/gmgauthier/Projects/code/rexx/c++/call.example/CMakeFiles/list_install_components.dir +/home/gmgauthier/Projects/code/rexx/c++/call.example/CMakeFiles/install.dir +/home/gmgauthier/Projects/code/rexx/c++/call.example/CMakeFiles/install/local.dir +/home/gmgauthier/Projects/code/rexx/c++/call.example/CMakeFiles/install/strip.dir +/home/gmgauthier/Projects/code/rexx/c++/external/CMakeFiles/external_routines.dir +/home/gmgauthier/Projects/code/rexx/c++/external/CMakeFiles/external_methods.dir +/home/gmgauthier/Projects/code/rexx/c++/external/CMakeFiles/external_methods_routines.dir +/home/gmgauthier/Projects/code/rexx/c++/external/CMakeFiles/edit_cache.dir +/home/gmgauthier/Projects/code/rexx/c++/external/CMakeFiles/rebuild_cache.dir +/home/gmgauthier/Projects/code/rexx/c++/external/CMakeFiles/list_install_components.dir +/home/gmgauthier/Projects/code/rexx/c++/external/CMakeFiles/install.dir +/home/gmgauthier/Projects/code/rexx/c++/external/CMakeFiles/install/local.dir +/home/gmgauthier/Projects/code/rexx/c++/external/CMakeFiles/install/strip.dir +/home/gmgauthier/Projects/code/rexx/classic/CMakeFiles/edit_cache.dir +/home/gmgauthier/Projects/code/rexx/classic/CMakeFiles/rebuild_cache.dir +/home/gmgauthier/Projects/code/rexx/classic/CMakeFiles/list_install_components.dir +/home/gmgauthier/Projects/code/rexx/classic/CMakeFiles/install.dir +/home/gmgauthier/Projects/code/rexx/classic/CMakeFiles/install/local.dir +/home/gmgauthier/Projects/code/rexx/classic/CMakeFiles/install/strip.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/CMakeFiles/edit_cache.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/CMakeFiles/rebuild_cache.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/CMakeFiles/list_install_components.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/CMakeFiles/install.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/CMakeFiles/install/local.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/CMakeFiles/install/strip.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/CMakeFiles/callrexx1.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/CMakeFiles/callrexx2.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/CMakeFiles/edit_cache.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/CMakeFiles/rebuild_cache.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/CMakeFiles/list_install_components.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/CMakeFiles/install.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/CMakeFiles/install/local.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/CMakeFiles/install/strip.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1/CMakeFiles/edit_cache.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1/CMakeFiles/rebuild_cache.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1/CMakeFiles/list_install_components.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1/CMakeFiles/install.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1/CMakeFiles/install/local.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1/CMakeFiles/install/strip.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2/CMakeFiles/edit_cache.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2/CMakeFiles/rebuild_cache.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2/CMakeFiles/list_install_components.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2/CMakeFiles/install.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2/CMakeFiles/install/local.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2/CMakeFiles/install/strip.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3/CMakeFiles/edit_cache.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3/CMakeFiles/rebuild_cache.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3/CMakeFiles/list_install_components.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3/CMakeFiles/install.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3/CMakeFiles/install/local.dir +/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3/CMakeFiles/install/strip.dir diff --git a/modules/CMakeFiles/cmake.check_cache b/modules/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/modules/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/modules/CMakeFiles/progress.marks b/modules/CMakeFiles/progress.marks new file mode 100644 index 0000000..209e3ef --- /dev/null +++ b/modules/CMakeFiles/progress.marks @@ -0,0 +1 @@ +20 diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt new file mode 100644 index 0000000..d670b4c --- /dev/null +++ b/modules/CMakeLists.txt @@ -0,0 +1,61 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (samples) + +add_subdirectory(api) + +if (WIN32) + add_subdirectory (windows) + # else () + # add_subdirectory (unix) +endif () diff --git a/modules/Makefile b/modules/Makefile new file mode 100644 index 0000000..19063c9 --- /dev/null +++ b/modules/Makefile @@ -0,0 +1,329 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Samples\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles /home/gmgauthier/Projects/code/rexx//CMakeFiles/progress.marks + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named stackOverflow + +# Build rule for target. +stackOverflow: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 stackOverflow +.PHONY : stackOverflow + +# fast build rule for target. +stackOverflow/fast: + $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/stackOverflow.dir/build.make c++/call.example/CMakeFiles/stackOverflow.dir/build +.PHONY : stackOverflow/fast + +#============================================================================= +# Target rules for targets named runRexxProgram + +# Build rule for target. +runRexxProgram: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 runRexxProgram +.PHONY : runRexxProgram + +# fast build rule for target. +runRexxProgram/fast: + $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/runRexxProgram.dir/build.make c++/call.example/CMakeFiles/runRexxProgram.dir/build +.PHONY : runRexxProgram/fast + +#============================================================================= +# Target rules for targets named external_routines + +# Build rule for target. +external_routines: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external_routines +.PHONY : external_routines + +# fast build rule for target. +external_routines/fast: + $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_routines.dir/build.make c++/external/CMakeFiles/external_routines.dir/build +.PHONY : external_routines/fast + +#============================================================================= +# Target rules for targets named external_methods + +# Build rule for target. +external_methods: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external_methods +.PHONY : external_methods + +# fast build rule for target. +external_methods/fast: + $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods.dir/build.make c++/external/CMakeFiles/external_methods.dir/build +.PHONY : external_methods/fast + +#============================================================================= +# Target rules for targets named external_methods_routines + +# Build rule for target. +external_methods_routines: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external_methods_routines +.PHONY : external_methods_routines + +# fast build rule for target. +external_methods_routines/fast: + $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods_routines.dir/build.make c++/external/CMakeFiles/external_methods_routines.dir/build +.PHONY : external_methods_routines/fast + +#============================================================================= +# Target rules for targets named callrexx1 + +# Build rule for target. +callrexx1: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 callrexx1 +.PHONY : callrexx1 + +# fast build rule for target. +callrexx1/fast: + $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx1.dir/build +.PHONY : callrexx1/fast + +#============================================================================= +# Target rules for targets named callrexx2 + +# Build rule for target. +callrexx2: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 callrexx2 +.PHONY : callrexx2 + +# fast build rule for target. +callrexx2/fast: + $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx2.dir/build +.PHONY : callrexx2/fast + +#============================================================================= +# Target rules for targets named rexxapi1 + +# Build rule for target. +rexxapi1: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 rexxapi1 +.PHONY : rexxapi1 + +# fast build rule for target. +rexxapi1/fast: + $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build +.PHONY : rexxapi1/fast + +#============================================================================= +# Target rules for targets named rexxapi2 + +# Build rule for target. +rexxapi2: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 rexxapi2 +.PHONY : rexxapi2 + +# fast build rule for target. +rexxapi2/fast: + $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build +.PHONY : rexxapi2/fast + +#============================================================================= +# Target rules for targets named rexxapi3 + +# Build rule for target. +rexxapi3: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 rexxapi3 +.PHONY : rexxapi3 + +# fast build rule for target. +rexxapi3/fast: + $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build +.PHONY : rexxapi3/fast + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" + @echo "... callrexx1" + @echo "... callrexx2" + @echo "... external_methods" + @echo "... external_methods_routines" + @echo "... external_routines" + @echo "... rexxapi1" + @echo "... rexxapi2" + @echo "... rexxapi3" + @echo "... runRexxProgram" + @echo "... stackOverflow" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/api/CMakeLists.txt b/modules/api/CMakeLists.txt new file mode 100644 index 0000000..47a3d46 --- /dev/null +++ b/modules/api/CMakeLists.txt @@ -0,0 +1,58 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (samples-api) + +add_subdirectory(c++) +add_subdirectory(classic) + +install(FILES readme.txt COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api ) diff --git a/modules/api/c++/CMakeLists.txt b/modules/api/c++/CMakeLists.txt new file mode 100644 index 0000000..bdc36c8 --- /dev/null +++ b/modules/api/c++/CMakeLists.txt @@ -0,0 +1,58 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (samples-native-api) + +add_subdirectory (call.example) +add_subdirectory (external) + +install(FILES readme.txt COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/c++) diff --git a/modules/api/c++/call.example/CMakeLists.txt b/modules/api/c++/call.example/CMakeLists.txt new file mode 100644 index 0000000..abcae05 --- /dev/null +++ b/modules/api/c++/call.example/CMakeLists.txt @@ -0,0 +1,93 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (call.example) + +#################### callrxnt (executable) ######################### +# additional source files required by specific platforms +set (platform_libs ${ORX_SYSLIB_DL}) +# Sources for call.example +add_executable(stackOverflow ${PROJECT_SOURCE_DIR}/stackOverflow.cpp) +# Include file definition +target_include_directories(stackOverflow PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +target_link_libraries(stackOverflow rexx rexxapi ${ORX_SYSLIB_DL}) + +add_executable(runRexxProgram ${PROJECT_SOURCE_DIR}/runRexxProgram.cpp) +# Include file definition +target_include_directories(runRexxProgram PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +target_link_libraries(runRexxProgram rexx rexxapi ${ORX_SYSLIB_DL}) + +target_link_libraries(runRexxProgram rexx rexxapi ${platform_callrxnt_libs}) + +#install the directory files +install(TARGETS stackOverflow RUNTIME COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/c++/callsample + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) +install(FILES stackOverflow.cpp COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/c++/callsample + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) +install(TARGETS runRexxProgram RUNTIME COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/c++/callsample + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) +install(FILES runRexxProgram.cpp COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/c++/callsample + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) +install(PROGRAMS HelloWorld.rex COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/c++/callsample + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) +install(PROGRAMS backward.fnc COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/c++/callsample + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) +install(PROGRAMS tooRecursiveTrapped.rex COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/c++/callsample + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) +install(PROGRAMS tooRecursiveUnhandled.rex COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/c++/callsample + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) + + install(FILES readme.txt Makefile.windows Makefile.unix COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/c++/callsample ) diff --git a/modules/api/c++/call.example/HelloWorld.rex b/modules/api/c++/call.example/HelloWorld.rex new file mode 100644 index 0000000..60af434 --- /dev/null +++ b/modules/api/c++/call.example/HelloWorld.rex @@ -0,0 +1,44 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Very simple Rexx intended to be used with the runRexxProgram example program. + */ + + line = "Hello World" + say line + return line diff --git a/modules/api/c++/call.example/Makefile.unix b/modules/api/c++/call.example/Makefile.unix new file mode 100644 index 0000000..f44f428 --- /dev/null +++ b/modules/api/c++/call.example/Makefile.unix @@ -0,0 +1,54 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2008-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + + +# A pretty simple make file that should work on most Unix-like platforms that have gcc. + +OOREXX_LFLAGS = -lrexx -lrexxapi # needs to follow after file for which link resoultion is needed + +# What we want to build. +all: runRexxProgram stackOverflow + +runRexxProgram: runRexxProgram.cpp + gcc runRexxProgram.cpp ${OOREXX_LFLAGS} -o runRexxProgram + +stackOverflow: stackOverflow.cpp + gcc stackOverflow.cpp $(OOREXX_LFLAGS) -o stackOverflow + +clean: + rm -f stackOverflow runRexxProgram + diff --git a/modules/api/c++/call.example/Makefile.windows b/modules/api/c++/call.example/Makefile.windows new file mode 100644 index 0000000..8fe6eb7 --- /dev/null +++ b/modules/api/c++/call.example/Makefile.windows @@ -0,0 +1,100 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +# This is a Visual C++, nMake compatible make file. +# +# The compiler needs to be able to find the ooRexx native API headers and +# libraries. If REXX_HOME is set on the system, the correct directory will be +# automatically added to the LIB and INCLUDE environment variables by this make +# file. +# +# Otherwise, either uncomment the next line and define the correct REXX_HOME, or +# be sure the LIB and INCLUDE environment variables allow the compiler to find +# the ooRexx native API headers and libraries. +# +# On a build system for ooRexx, you can set REXX_HOME to point to Win32Dbg or +# Win32Rel, as appropriate, in your build directory. For this to work, you +# will have to have built the interpreter. + +#REXX_HOME = C:\work.ooRexx\wc\main\Win32Dbg # For example + +# Define RELEASE on the command line, or here, to build a non-debug version. By +# default debug versions are built. I.e. nMake RELEASE=1 /F Makefile +#RELEASE = 1 + + +!IF DEFINED(REXX_HOME) +INCLUDE = $(INCLUDE);$(REXX_HOME)\api +LIB = $(LIB);$(REXX_HOME)\api +!ENDIF + +REXX_LIBS = rexx.lib rexxapi.lib + +WARNINGFLAGS = /W3 /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE + +!IF DEFINED(RELEASE) + +OOREXX_CFLAGS = /nologo /EHsc /O2 /Gs /FAcs /MT $(WARNINGFLAGS) /c +EXE_LFLAGS = /nologo /SUBSYSTEM:Console $(REXX_LIBS) user32.lib comdlg32.lib gdi32.lib kernel32.lib +DLL_LFLAGS = /nologo /SUBSYSTEM:Windows $(REXX_LIBS) /DLL + +!ELSE + +OOREXX_CFLAGS = /nologo /EHsc /Zi /Od /MTd $(WARNINGFLAGS) /c +EXE_LFLAGS = /nologo /DEBUG -debugtype:cv /SUBSYSTEM:Console $(REXX_LIBS) user32.lib comdlg32.lib gdi32.lib kernel32.lib +DLL_LFLAGS = /nologo /DEBUG -debugtype:cv /SUBSYSTEM:Windows $(REXX_LIBS) /DLL + +!ENDIF + +# What we want to build. +all: stackOverflow.exe runRexxProgram.exe + +stackOverflow.obj: stackOverflow.cpp + cl $(OOREXX_CFLAGS) stackOverflow.cpp + +stackOverflow.exe: stackOverflow.obj + link $(EXE_LFLAGS) stackOverflow.obj -out:$(@B).exe + +runRexxProgram.obj: runRexxProgram.cpp + cl $(OOREXX_CFLAGS) runRexxProgram.cpp + +runRexxProgram.exe: runRexxProgram.obj + link $(EXE_LFLAGS) runRexxProgram.obj -out:$(@B).exe + +clean: + del *.exe *.dll *.obj *.ilk *.pdb *.lib *.exp *.suo *.cod 1>nul 2>&1 + diff --git a/modules/api/c++/call.example/backward.fnc b/modules/api/c++/call.example/backward.fnc new file mode 100644 index 0000000..c10302f --- /dev/null +++ b/modules/api/c++/call.example/backward.fnc @@ -0,0 +1,70 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* backward.fnc - Reverse the words in a string */ +/* */ +/* This program is from the traditional, classic API example, */ +/* callrxnt. Here it can be used by the runRexxProgram to */ +/* demonstrate calling a program using the C++ native APIs. */ +/* */ +/* Input: A string of words */ +/* */ +/* Output: A string containing the same words but in opposite order */ +/* */ +/*********************************************************************/ + +say; say "backward.fnc --> start @" .DateTime~new~string +Parse Arg Data /* get argument string */ +say 'The string:' +say ' ' Data +OutString = '' /* initialize output to empty */ +Count = Words(Data) /* find number of words */ +Do i = Count To 1 By -1 /* for each word in string */ + OutString = OutString Word(Data,i) /* add word to output string */ + End /* end do */ + +OutString = Strip(OutString) /* remove any blanks on the */ + /* front or back. */ +say 'when reversed is:' +say ' ' OutString +say "backward.fnc --> finished @" .DateTime~new~string; say + +Return OutString /* return reversed string, */ + + diff --git a/modules/api/c++/call.example/readme.txt b/modules/api/c++/call.example/readme.txt new file mode 100644 index 0000000..a646a47 --- /dev/null +++ b/modules/api/c++/call.example/readme.txt @@ -0,0 +1,85 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2010-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + readme.txt + ========== + + This subdirectory provides two examples: runRexxProgram and + stackOverflow. Both programs will compile and run on any platform + supported by ooRexx. Also included are 2 make files. + + Makefile.windows + ---------------- + This is a nMake compatible make file for building the examples on + Windows. Provided your build environment is set up correctly for a + MicroSoft's Visual C++ compile, you should be able to compile the + examples without problem. Read the comments in Makefile.windows if + your have problems and / or to see how to build a debug version (the + default) or a non-debug version of the samples. + + Makefile.unix + -------------- + This make file should build the examples on any Unix-like system that + has gcc installed. + + + runRexxProgram + ============== + This example creates an instance of the interpreter and uses it to call + a Rexx program. The Rexx program name is supplied on the command line. + For instance: + + runRexxProgram HelloWorld.rex + + Read the comments in the program code for additional details. A few + sample Rexx programs are provided, including backward.fnc + + + stackOverflow + ============= + This example creates an instance of the interpreter and then + dynamically creates and calls a Rexx routine. Two routines are + provided. Execute stackOverflow without any arguments to use the first + routine and with one (any) argument to use the second routine. I.e.: + + stackOverflow + + or + + stackOverflow 1 + + More details are provided in comments within the C++ code. diff --git a/modules/api/c++/call.example/runRexxProgram.cpp b/modules/api/c++/call.example/runRexxProgram.cpp new file mode 100644 index 0000000..d8af8b3 --- /dev/null +++ b/modules/api/c++/call.example/runRexxProgram.cpp @@ -0,0 +1,233 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2017 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * A simple example that creates an instance of the interpreter and uses that + * instance to execute a Rexx program. The program name must be passed in the + * command line. For example: + * + * runRexxProgram HelloWorld.rex + * runRexxProgram backward.fnc + * runRexxProgram tooRecursiveTrapped.rex + * runRexxProgram tooRecursiveUnhandled.rex + * + * backward.fnc demonstrates how to pass arguments into the called program. + */ + +#include "oorexxapi.h" +#include +#include + +#if defined(_WIN32) +#define _CDECL __cdecl +#else +#define _CDECL +#endif + +/* Prototypes for several simple helper functions that demonstrate usage of some + * of the native C++ APIs. The functions themselves are at the bottom of the + * file. + */ +bool checkForCondition(RexxThreadContext *c, bool clear); +void printInterpreterVersion(RexxInstance *); + +int _CDECL main(int argc, char **argv) +{ + char *programName = NULL; + if ( argc == 2 ) + { + programName = argv[1]; + } + + if ( programName == NULL || *programName == '\0' ) + { + printf("You must pass in the name of a Rexx program on the command line.\n"); + printf(" For example: %s crash.rex.\n", argv[0]); + return 9; + } + + // These are the arguments to RexxCreateInterpreter(). An array of any + // number of Rexx options can be passed in, but for this example we do not + // need any options. So, we use NULL. + RexxInstance *interpreter; + RexxThreadContext *threadContext; + RexxOption *options = NULL; + + if ( RexxCreateInterpreter(&interpreter, &threadContext, options) == 0 ) + { + printf("Failed to create interpreter, aborting.\n"); + exit(1); + } + printInterpreterVersion(interpreter); + + // If we want to pass arguments to the program we need to put them into an + // array of Rexx objects. We can pass null if there are no arguments. + RexxArrayObject args = NULL; + + if ( strcmp("backward.fnc", programName) == 0 ) + { + RexxStringObject str = threadContext->String("These words will be swapped"); + args = threadContext->ArrayOfOne(str); + } + + // Execute the program and get the result returned to us. + printf("Using interpreter to execute %s\n\n", programName); + RexxObjectPtr result = threadContext->CallProgram(programName, args); + + // During the program execution, a condition can be raised if there is an + // unexpected error. If an exception occurred and is pending, + // CheckCondtion() will return true. In this case we print out some + // information on the condition, otherwise we print out the return, if any, + // from the program. + if (threadContext->CheckCondition()) + { + checkForCondition(threadContext, true); + } + else if (result != NULLOBJECT) + { + // Note that we use ObjectToStringValue(). That is guarenteed to return + // the ASCII-Z string representation of the object. If we passed in, say + // an .array object to the CString() function, we would get a crash. + printf("\nProgram result=%s\n\n", threadContext->ObjectToStringValue(result)); + } + + // Now wait for the interpreter to terminate and we are done. + interpreter->Terminate(); + + return 0; +} + +/** + * Below are several helper functions that demonstrate how to use some of the + * different C++ native APIs. + */ + +/** + * Given an interpreter instance, prints out the interpreter version and + * language version. The documentation in the ooRexx programming guide explains + * the byte encoding of the version numbers. + */ +void printInterpreterVersion(RexxInstance *interpreter) +{ + wholenumber_t ver = interpreter->InterpreterVersion(); + wholenumber_t lang = interpreter->LanguageLevel(); + printf("Created interpreter instance version=%zd.%zd.%zd language level=%zd.%02zd\n\n", + (ver & 0xff0000) >> 16, (ver & 0x00ff00) >> 8, ver & 0x0000ff, (lang & 0xff00) >> 8, lang & 0x00ff); +} + + +/** + * Given a condition object, extracts and returns as a whole number the subcode + * of the condition. + */ +inline wholenumber_t conditionSubCode(RexxCondition *condition) +{ + return (condition->code - (condition->rc * 1000)); +} + + +/** + * Outputs the typical condition message. For example: + * + * 4 *-* say dt~number + * Error 97 running C:\work\qTest.rex line 4: Object method not found + * Error 97.1: Object "a DateTime" does not understand message "NUMBER" + * + * @param c The thread context we are operating in. + * @param condObj The condition information object. The object returned from + * the C++ API GetConditionInfo() + * @param condition The RexxCondition struct. The filled in struct from the + * C++ API DecodeConditionInfo(). + * + * @assumes There is a condition and that condObj and condition are valid. + */ +void standardConditionMsg(RexxThreadContext *c, RexxDirectoryObject condObj, RexxCondition *condition) +{ + RexxObjectPtr list = c->SendMessage0(condObj, "TRACEBACK"); + if ( list != NULLOBJECT ) + { + RexxArrayObject a = (RexxArrayObject)c->SendMessage0(list, "ALLITEMS"); + if ( a != NULLOBJECT ) + { + size_t count = c->ArrayItems(a); + for ( size_t i = 1; i <= count; i++ ) + { + RexxObjectPtr o = c->ArrayAt(a, i); + if ( o != NULLOBJECT ) + { + printf("%s\n", c->ObjectToStringValue(o)); + } + } + } + } + printf("Error %zd running %s line %zd: %s\n", condition->rc, c->CString(condition->program), + condition->position, c->CString(condition->errortext)); + + printf("Error %zd.%03zd: %s\n", condition->rc, conditionSubCode(condition), c->CString(condition->message)); +} + + +/** + * Given a thread context, checks for a raised condition, and prints out the + * standard condition message if there is a condition. + * + * @param c Thread context we are operating in. + * @param clear Whether to clear the condition or not. + * + * @return True if there was a condition, otherwise false. + */ +bool checkForCondition(RexxThreadContext *c, bool clear) +{ + if ( c->CheckCondition() ) + { + RexxCondition condition; + RexxDirectoryObject condObj = c->GetConditionInfo(); + + if ( condObj != NULLOBJECT ) + { + c->DecodeConditionInfo(condObj, &condition); + standardConditionMsg(c, condObj, &condition); + + if ( clear ) + { + c->ClearCondition(); + } + return true; + } + } + return false; +} diff --git a/modules/api/c++/call.example/stackOverflow.cpp b/modules/api/c++/call.example/stackOverflow.cpp new file mode 100644 index 0000000..acbe388 --- /dev/null +++ b/modules/api/c++/call.example/stackOverflow.cpp @@ -0,0 +1,242 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2017 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * A simple example that creates an instance of the interpreter and uses that + * instance to execute a Rexx routine defined in this program. + * + * Both routines cause an infinite recursion. One version of the routine traps + * any error, the other does not. This shows how to handle conditions raised + * inside the interpreter execution, i.e., outside of your native code + * execution. + * + * To have the second routine execute, specify any argument on the command line. + * For example: + * + * stackOverflow 1 + * + * With no argument, the first routine is used: + * + * starckOverflow + */ + +#include "oorexxapi.h" +#include +#include + +#if defined(_WIN32) +#define _CDECL __cdecl +#else +#define _CDECL +#endif + +#define RECURSIVE_ROUTINE1 \ + "signal on any name error\n\n" \ + "say 'Starting infinite recursison'\n" \ + "line = 'interpret line'\n" \ + "interpret line\n" \ + "return 0\n\n" \ + "error:\n" \ + "obj = condition('O')\n" \ + "say 'Trapped error:' obj~code '('obj~errorText')'\n" \ + "return -9" + +#define RECURSIVE_ROUTINE2 \ + "say 'Starting infinite recursison'\n" \ + "line = 'interpret line'\n" \ + "interpret line\n" \ + "return 0\n\n" \ + +/* Prototypes for several simple helper functions that demonstrate usage of some + * of the native C++ APIs. The functions themselves are at the bottom of the + * file. + */ +bool checkForCondition(RexxThreadContext *c, bool clear); +void printInterpreterVersion(RexxInstance *); + +int _CDECL main(int argc, char **argv) +{ + // These are the arguments to RexxCreateInterpreter(). An array of any + // number of Rexx options can be passed in, but for this example we do not + // need any options. So, we use NULL. + RexxInstance *interpreter; + RexxThreadContext *threadContext; + RexxOption *options = NULL; + + if ( RexxCreateInterpreter(&interpreter, &threadContext, options) == 0 ) + { + printf("Failed to create interpreter, aborting.\n"); + exit(1); + } + printInterpreterVersion(interpreter); + + // Get the source code to use. We copy it into a buffer just to illustrate + // a point. How your program fills the code buffer could be by any means. + char buf[512]; + if ( argc == 1 ) + { + // No argument on the command line use the routine that traps any error. + strcpy(buf, RECURSIVE_ROUTINE1); + } + else + { + // An argument on the command line, use the routine that does not trap + // any error. + strcpy(buf, RECURSIVE_ROUTINE2); + } + + // Create a routine object from the source code. + RexxRoutineObject obj = threadContext->NewRoutine("stackOverflow", buf, strlen(buf)); + if ( obj == NULL ) + { + checkForCondition(threadContext, true); + printf("Error creating routine object, aborting\n"); + exit(1); + } + + // Execute the routine. + RexxObjectPtr result = threadContext->CallRoutine(obj, NULL); + + // Check for a condition raised during CallRoutine(). + checkForCondition(threadContext, true); + + // Now wait for the interpreter to terminate and we are done. + interpreter->Terminate(); + + return 0; +} + +/** + * Below are several helper functions that demonstrate how to use some of the + * different C++ native APIs. + */ + +/** + * Given an interpreter instance, prints out the interpreter version and + * language version. The documentation in the ooRexx programming guide explains + * the byte encoding of the version numbers. + */ +void printInterpreterVersion(RexxInstance *interpreter) +{ + wholenumber_t ver = interpreter->InterpreterVersion(); + wholenumber_t lang = interpreter->LanguageLevel(); + printf("Created interpreter instance version=%zd.%zd.%zd language level=%zd.%02zd\n\n", + (ver & 0xff0000) >> 16, (ver & 0x00ff00) >> 8, ver & 0x0000ff, (lang & 0xff00) >> 8, lang & 0x00ff); +} + + +/** + * Given a condition object, extracts and returns as a whole number the subcode + * of the condition. + */ +inline wholenumber_t conditionSubCode(RexxCondition *condition) +{ + return (condition->code - (condition->rc * 1000)); +} + + +/** + * Outputs the typical condition message. For example: + * + * 4 *-* say dt~number + * Error 97 running C:\work\qTest.rex line 4: Object method not found + * Error 97.1: Object "a DateTime" does not understand message "NUMBER" + * + * @param c The thread context we are operating in. + * @param condObj The condition information object. The object returned from + * the C++ API GetConditionInfo() + * @param condition The RexxCondition struct. The filled in struct from the + * C++ API DecodeConditionInfo(). + * + * @assumes There is a condition and that condObj and condition are valid. + */ +void standardConditionMsg(RexxThreadContext *c, RexxDirectoryObject condObj, RexxCondition *condition) +{ + RexxObjectPtr list = c->SendMessage0(condObj, "TRACEBACK"); + if ( list != NULLOBJECT ) + { + RexxArrayObject a = (RexxArrayObject)c->SendMessage0(list, "ALLITEMS"); + if ( a != NULLOBJECT ) + { + size_t count = c->ArrayItems(a); + for ( size_t i = 1; i <= count; i++ ) + { + RexxObjectPtr o = c->ArrayAt(a, i); + if ( o != NULLOBJECT ) + { + printf("%s\n", c->ObjectToStringValue(o)); + } + } + } + } + printf("Error %zd running %s line %zd: %s\n", condition->rc, c->CString(condition->program), + condition->position, c->CString(condition->errortext)); + + printf("Error %zd.%03zd: %s\n", condition->rc, conditionSubCode(condition), c->CString(condition->message)); +} + + +/** + * Given a thread context, checks for a raised condition, and prints out the + * standard condition message if there is a condition. + * + * @param c Thread context we are operating in. + * @param clear Whether to clear the condition or not. + * + * @return True if there was a condition, otherwise false. + */ +bool checkForCondition(RexxThreadContext *c, bool clear) +{ + if ( c->CheckCondition() ) + { + RexxCondition condition; + RexxDirectoryObject condObj = c->GetConditionInfo(); + + if ( condObj != NULLOBJECT ) + { + c->DecodeConditionInfo(condObj, &condition); + standardConditionMsg(c, condObj, &condition); + + if ( clear ) + { + c->ClearCondition(); + } + return true; + } + } + return false; +} diff --git a/modules/api/c++/call.example/tooRecursiveTrapped.rex b/modules/api/c++/call.example/tooRecursiveTrapped.rex new file mode 100644 index 0000000..fa699fa --- /dev/null +++ b/modules/api/c++/call.example/tooRecursiveTrapped.rex @@ -0,0 +1,55 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * A simple Rexx program that is infinitely recursive. + * + * Meant to be used with the runRexxProgram example to demonstrate condition + * handling. (This is the same Rexx code as used in the stackOverflow example.) + */ +signal on any name error + + say 'Starting infinite recursison' + + line = 'interpret line' + interpret line + return 0 + +error: + obj = condition('O') + say 'Trapped error:' obj~code '('obj~errorText')' + return -9 diff --git a/modules/api/c++/call.example/tooRecursiveUnhandled.rex b/modules/api/c++/call.example/tooRecursiveUnhandled.rex new file mode 100644 index 0000000..44c1eaa --- /dev/null +++ b/modules/api/c++/call.example/tooRecursiveUnhandled.rex @@ -0,0 +1,49 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * A simple Rexx program that is infinitely recursive. + * + * Meant to be used with the runRexxProgram example to demonstrate condition + * handling. (This is the same Rexx code as used in the stackOverflow example.) + */ + + say 'Starting infinite recursison' + + line = 'interpret line' + interpret line + return 0 diff --git a/modules/api/c++/external/CMakeLists.txt b/modules/api/c++/external/CMakeLists.txt new file mode 100644 index 0000000..1ea47bf --- /dev/null +++ b/modules/api/c++/external/CMakeLists.txt @@ -0,0 +1,122 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (external-sample) + +# installation target for all samples +set (DEST ${INSTALL_SAMPLES_DIR}/api/c++/external) + +# allow group write permissions as well +set (PERM PERMISSIONS OWNER_READ OWNER_WRITE + GROUP_READ GROUP_WRITE + WORLD_READ ) +# add execute bit +set (PERM_EXE ${PERM} OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE) + +install(FILES readme.txt Makefile.unix Makefile.windows + COMPONENT Samples DESTINATION ${DEST} ${PERM}) + +#################### external_routines (library) ######################### +# Sources for external_routines sample +add_library(external_routines SHARED external_routines.cpp) +# Include file definition +target_include_directories(external_routines PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +target_link_libraries(external_routines rexxapi) + +if (WIN32) + install(TARGETS external_routines RUNTIME COMPONENT Samples DESTINATION ${DEST}) +else() + install(TARGETS external_routines LIBRARY COMPONENT Samples DESTINATION ${DEST} ${PERM_EXE} ) +endif() +install(FILES external_routines.cpp COMPONENT Samples DESTINATION ${DEST} ${PERM}) +install(PROGRAMS useExternalRoutines.rex useExternalRoutines2.rex + COMPONENT Samples DESTINATION ${DEST} ${PERM_EXE}) + + +#################### external_methods (library) ######################### +# Sources for external_methods sample +add_library(external_methods SHARED external_methods.cpp) +# Include file definition +target_include_directories(external_methods PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +target_link_libraries(external_methods rexxapi) + +if (WIN32) + install(TARGETS external_methods RUNTIME COMPONENT Samples DESTINATION ${DEST}) +else() + install(TARGETS external_methods LIBRARY COMPONENT Samples DESTINATION ${DEST} ${PERM_EXE}) +endif() +install(FILES external_methods.cpp COMPONENT Samples DESTINATION ${DEST} ${PERM}) +install(PROGRAMS useExternalMethods.rex COMPONENT Samples DESTINATION ${DEST} ${PERM_EXE}) + + +#################### external_methods_routines (library) ######################### +# Sources for external_methods_routines sample +add_library(external_methods_routines SHARED external_methods_routines.cpp) +# Include file definition +target_include_directories(external_methods_routines PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +target_link_libraries(external_methods_routines rexxapi) + +if (WIN32) + install(TARGETS external_methods_routines RUNTIME COMPONENT Samples DESTINATION ${DEST}) +else() + install(TARGETS external_methods_routines LIBRARY COMPONENT Samples DESTINATION ${DEST} ${PERM_EXE} ) +endif() +install(FILES external_methods_routines.cpp COMPONENT Samples DESTINATION ${DEST} ${PERM}) +install(PROGRAMS useExternalMethodsRoutines.rex COMPONENT Samples DESTINATION ${DEST} ${PERM_EXE}) + + diff --git a/modules/api/c++/external/Makefile.unix b/modules/api/c++/external/Makefile.unix new file mode 100644 index 0000000..4897b39 --- /dev/null +++ b/modules/api/c++/external/Makefile.unix @@ -0,0 +1,70 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +# A make file that should work on most Unix-like platforms that have gcc + +OOREXX_CFLAGS = -fPIC +OOREXX_LFLAGS = -export-dynamic -shared -nostartfiles + +# determine extension, default to Linux style +EXT = so +UNAME := $(shell uname -s) +ifeq ($(UNAME),Darwin) # if Apple adjust accordingly + EXT = dylib +endif + +# What we want to build. +all: external_routines external_methods external_methods_routines + +external_routines: + @echo "building [$@] ..." + gcc -c $@.cpp $(OOREXX_CFLAGS) -o $@.o + gcc $@.o ${OOREXX_LFLAGS} -o lib$@.$(EXT) + +external_methods: + @echo "building [$@] ..." + gcc -c $@.cpp $(OOREXX_CFLAGS) -o $@.o + gcc $@.o ${OOREXX_LFLAGS} -o lib$@.$(EXT) + +external_methods_routines: + @echo "building [$@] ..." + gcc -c $@.cpp $(OOREXX_CFLAGS) -o $@.o + gcc $@.o ${OOREXX_LFLAGS} -o lib$@.$(EXT) + +clean: + rm -f *.so *.o lib*.$(EXT) + diff --git a/modules/api/c++/external/Makefile.windows b/modules/api/c++/external/Makefile.windows new file mode 100644 index 0000000..abc9cd8 --- /dev/null +++ b/modules/api/c++/external/Makefile.windows @@ -0,0 +1,66 @@ +# usage: nmake /f Makefile.windows [clean] +# /*----------------------------------------------------------------------------*/ +# /* */ +# /* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +# /* */ +# /* This program and the accompanying materials are made available under */ +# /* the terms of the Common Public License v1.0 which accompanies this */ +# /* distribution. A copy is also available at the following address: */ +# /* https://www.oorexx.org/license.html */ +# /* */ +# /* Redistribution and use in source and binary forms, with or */ +# /* without modification, are permitted provided that the following */ +# /* conditions are met: */ +# /* */ +# /* Redistributions of source code must retain the above copyright */ +# /* notice, this list of conditions and the following disclaimer. */ +# /* Redistributions in binary form must reproduce the above copyright */ +# /* notice, this list of conditions and the following disclaimer in */ +# /* the documentation and/or other materials provided with the distribution. */ +# /* */ +# /* Neither the name of Rexx Language Association nor the names */ +# /* of its contributors may be used to endorse or promote products */ +# /* derived from this software without specific prior written permission. */ +# /* */ +# /* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +# /* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +# /* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +# /* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +# /* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +# /* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +# /* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +# /* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +# /* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +# /* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +# /* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +# /* */ +# /*----------------------------------------------------------------------------*/ + +!IF DEFINED(REXX_HOME) +INCLUDE = $(INCLUDE);$(REXX_HOME)\api +LIB = $(LIB);$(REXX_HOME)\api +!ENDIF + +WARNINGFLAGS = /W3 /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE + +REXX_LIBS = rexxapi.lib +OOREXX_CFLAGS = /nologo /EHsc /O2 /Gs /FAcs /MT $(WARNINGFLAGS) /c +DLL_LFLAGS = /nologo /SUBSYSTEM:Windows $(REXX_LIBS) /DLL + +# default targets +all: external_routines external_methods external_methods_routines + +external_routines: + cl $(OOREXX_CFLAGS) /Fo$(@B).obj $(@B).cpp + link $(DLL_LFLAGS) $(@B).obj -out:$(@B).dll + +external_methods: + cl $(OOREXX_CFLAGS) /Fo$(@B).obj $(@B).cpp + link $(DLL_LFLAGS) $(@B).obj -out:$(@B).dll + +external_methods_routines: + cl $(OOREXX_CFLAGS) /Fo$(@B).obj $(@B).cpp + link $(DLL_LFLAGS) $(@B).obj -out:$(@B).dll + +clean: + del *.exe *.dll *.obj *.ilk *.pdb *.lib *.exp *.suo *.cod 1>nul 2>&1 diff --git a/modules/api/c++/external/external_methods.cpp b/modules/api/c++/external/external_methods.cpp new file mode 100644 index 0000000..37edc80 --- /dev/null +++ b/modules/api/c++/external/external_methods.cpp @@ -0,0 +1,133 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include + +// ----------------------------------------------------- +RexxMethod0(int, // return type + NoArgMethodReturn123) // native method name +{ + return 123; // return value +} + +// ----------------------------------------------------- +RexxMethod0(RexxObjectPtr, // return type a Rexx Object Pointer + NoArgMethodVoid) // native method name +{ + fprintf(stdout, "(from native code) \"NoArgMethodVoid\"\n"); + return NULLOBJECT; // indicate no return value ! +} + +// ----------------------------------------------------- +RexxMethod1(int, // return type + OneArgMethodReturnArg, // native method name + OPTIONAL_int, arg1) // argument +{ + fprintf(stdout, "(from native code) \"OneArgMethodReturnArg\": arg1=[%d]", arg1); + fprintf(stdout, " argumentExists(1)=[%d], argumentOmitted(1)=[%d]\n", + argumentExists(1), argumentOmitted(1)); + return arg1; // return value +} + +// ----------------------------------------------------- +RexxMethod1(RexxObjectPtr, // return type a Rexx Object Pointer + OneArgMethodVoid, // native method name + int, arg1) // argument +{ + fprintf(stdout, "(from native code) \"OneArgMethodVoid\": arg1=[%d]\n", arg1); + return NULLOBJECT; // indicate no return value ! +} + +// ----------------------------------------------------- +RexxMethod2(int, // return type + TwoIntArgAdder, // native method name + int, arg1, // argument 1 + int, arg2) // argument 2 +{ + return arg1 + arg2; // return value +} + +// ----------------------------------------------------- +RexxMethod2(double, // return type + TwoDoubleArgAdder, // native method name + double, arg1, // argument 1 + double, arg2) // argument 2 +{ + return arg1 + arg2; // return value +} + +// ----------------------------------------------------- +RexxMethod2(RexxObjectPtr, // return type a Rexx Object Pointer + OneArgInvokeOrxMethod, // native method name + OSELF, self, // pseudo-argument: allow access to object instance + int, arg1) // argument from Rexx program! +{ + fprintf(stdout, "(from native code) \"OneArgInvokeOrxMethod\": arg1=[%d]\n", arg1); + fprintf(stdout, "(from native code) invoking method \"hello\" in this very same object:\n"); + context->SendMessage0(self,"HELLO"); + return NULLOBJECT; // indicate no return value ! +} + + +RexxMethodEntry orxtest_meths[] = { + + REXX_METHOD(NoArgMethodReturn123 , NoArgMethodReturn123 ), + REXX_METHOD(NoArgMethodVoid , NoArgMethodVoid ), + REXX_METHOD(OneArgMethodReturnArg, OneArgMethodReturnArg), + REXX_METHOD(OneArgMethodVoid , OneArgMethodVoid ), + REXX_METHOD(TwoIntArgAdder , TwoIntArgAdder ), + REXX_METHOD(TwoDoubleArgAdder , TwoDoubleArgAdder ), + REXX_METHOD(OneArgInvokeOrxMethod, OneArgInvokeOrxMethod), + REXX_LAST_METHOD() // end marker +}; + + +RexxPackageEntry DemoExternalMethods_package_entry = { + STANDARD_PACKAGE_HEADER + REXX_INTERPRETER_5_0_0, // ooRexx version 5.0.0 or higher required + "ExternalMethodsDemo", // name of the package + "1.0.0", // package information + NULL, // no load function + NULL, // no unload function + NULL, // the exported routines + orxtest_meths // the exported methods +}; + +// package loading stub. +OOREXX_GET_PACKAGE(DemoExternalMethods); + diff --git a/modules/api/c++/external/external_methods_routines.cpp b/modules/api/c++/external/external_methods_routines.cpp new file mode 100644 index 0000000..cd21edc --- /dev/null +++ b/modules/api/c++/external/external_methods_routines.cpp @@ -0,0 +1,77 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include + +// ----------------------------------------------------- +RexxRoutine0(int, // return type + NoArgRoutineReturn123) // native routine name +{ + return 123; // return value +} + +RexxRoutineEntry orxtest_funcs[] = { + REXX_TYPED_ROUTINE(NoArgRoutineReturn123 , NoArgRoutineReturn123 ), + REXX_LAST_ROUTINE() // end marker +}; + +// ----------------------------------------------------- +RexxMethod0(int, // return type + NoArgMethodReturn123) // native method name +{ + return 123; // return value +} + +RexxMethodEntry orxtest_meths[] = { + REXX_METHOD(NoArgMethodReturn123 , NoArgMethodReturn123 ), + REXX_LAST_METHOD() // end marker +}; + +RexxPackageEntry DemoExternalLibrary_package_entry = { + STANDARD_PACKAGE_HEADER + REXX_CURRENT_INTERPRETER_VERSION, // ooRexx version at compilation time or higher + "ExternalMethodsRoutinesDemo", // name of the package + "1.0.0", // package information + NULL, // no load function + NULL, // no unload function + orxtest_funcs, // the exported routines + orxtest_meths // the exported methods +}; + +// package loading stub. +OOREXX_GET_PACKAGE(DemoExternalLibrary); + diff --git a/modules/api/c++/external/external_routines.cpp b/modules/api/c++/external/external_routines.cpp new file mode 100644 index 0000000..73cc075 --- /dev/null +++ b/modules/api/c++/external/external_routines.cpp @@ -0,0 +1,120 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include + +// ----------------------------------------------------- +RexxRoutine0(int, // return type + NoArgRoutineReturn123) // native routine name +{ + return 123; // return value +} + +// ----------------------------------------------------- +RexxRoutine0(RexxObjectPtr, // return type a Rexx Object Pointer + NoArgRoutineVoid) // native routine name +{ + fprintf(stdout, "(from native code) \"NoArgRoutineVoid\"\n"); + return NULLOBJECT; // indicate no return value ! +} + +// ----------------------------------------------------- +RexxRoutine1(int, // return type + OneArgRoutineReturnArg,// native routine name + OPTIONAL_int, arg1) // optional argument +{ + fprintf(stdout, "(from native code) \"OneArgRoutineReturnArg\": arg1=[%d]", arg1); + fprintf(stdout, " argumentExists(1)=[%d], argumentOmitted(1)=[%d]\n", + argumentExists(1), argumentOmitted(1)); + return arg1; // return value +} + +// ----------------------------------------------------- +RexxRoutine1(RexxObjectPtr, // return type a Rexx Object Pointer + OneArgRoutineVoid, // native routine name + int, arg1) // argument +{ + fprintf(stdout, "(from native code) \"OneArgRoutineVoid\": arg1=[%d]\n", arg1); + return NULLOBJECT; // indicate no return value ! +} + +// ----------------------------------------------------- +RexxRoutine2(int, // return type + TwoIntArgAdder, // native routine name + int, arg1, // argument 1 + int, arg2) // argument 2 +{ + return arg1 + arg2; // return value +} + +// ----------------------------------------------------- +RexxRoutine2(double, // return type + TwoDoubleArgAdder, // native routine name + double, arg1, // argument 1 + double, arg2) // argument 2 +{ + return arg1 + arg2; // return value +} + + +RexxRoutineEntry orxtest_funcs[] = { + + REXX_TYPED_ROUTINE(NoArgRoutineReturn123 , NoArgRoutineReturn123 ), + REXX_TYPED_ROUTINE(NoArgRoutineVoid , NoArgRoutineVoid ), + REXX_TYPED_ROUTINE(OneArgRoutineReturnArg, OneArgRoutineReturnArg), + REXX_TYPED_ROUTINE(OneArgRoutineVoid , OneArgRoutineVoid ), + REXX_TYPED_ROUTINE(TwoIntArgAdder , TwoIntArgAdder ), + REXX_TYPED_ROUTINE(TwoDoubleArgAdder , TwoDoubleArgAdder ), + REXX_LAST_ROUTINE() // end marker +}; + + +RexxPackageEntry DemoExternalRoutines_package_entry = { + STANDARD_PACKAGE_HEADER + REXX_INTERPRETER_4_0_0, // ooRexx version 4.0.0 or higher required + "ExternalRoutinesDemo", // name of the package + "1.0.0", // package information + NULL, // no load function + NULL, // no unload function + orxtest_funcs, // the exported routines + NULL // the exported methods +}; + +// package loading stub. +OOREXX_GET_PACKAGE(DemoExternalRoutines); + diff --git a/modules/api/c++/external/readme.txt b/modules/api/c++/external/readme.txt new file mode 100644 index 0000000..43bddbf --- /dev/null +++ b/modules/api/c++/external/readme.txt @@ -0,0 +1,116 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +This directory includes c++ source code files with Makefiles for the different +platforms and Rexx code which demonstrate how to create routines/functions and +methods in native code and using it directly from ooRexx code. + +Information on external native libraries, the declarations and the +available predefined argument and return types can be found in the ooRexx +API documentation in rexxapi.pdf: + + Chapter 1.12. Building an External Native Library + Chapter 1.13. Defining Library Routines + Chapter 1.14. Defining Library Methods + + +external_routines.cpp +===================== + +This example creates external functions/routines in a DLL which get used +from + + - useExternalRoutines.rex: uses the routine directive to individually + load each native routine (would allow to use a different name in the + ooRexx program) + + - useExternalRoutines2.rex: uses the "library" subkeyword of the requires + directive to load all external routines at once + +Note that external_routines.cpp defines the native routines to be usable +from ooRexx 4.0.0 on, cf. "REXX_INTERPRETER_4_0_0" constant in the +RexxPackageEntry structure at the end of the program. + + +external_methods.cpp +==================== + +This example creates external methods in a DLL which get used from + + - useExternalMethods.rex: uses the "external" subkeyword of the method + directive to load the native methods + +Note that external_methods.cpp defines the native methods to be usable +from ooRexx 5.0.0 on, cf. "REXX_INTERPRETER_5_0_0" constant in the +RexxPackageEntry structure at the end of the program. + + +external_methods_routines.cpp +============================= + +This example creates external routines and methods in a DLL which get used +from + + - useExternalMethodsRoutines.rex: uses the "external" subkeyword of the + routine and method directives + +Note that external_methods_routines.cpp defines the native methods and +routines to be usable from the ooRexx version on that got used to compile +the library, cf. "REXX_CURRRENT_INTERPRETER_VERSION" constant in the +RexxPackageEntry structure at the end of the program. + +------------------------------------------------------------------------------ + +Maybe some useful hints: + + On Linux you may want to run the ooRexx scripts with: + + LD_LIBRARY_PATH=`pwd` rexx useExternalRoutines.rex + LD_LIBRARY_PATH=`pwd` rexx useExternalRoutines2.rex + LD_LIBRARY_PATH=`pwd` rexx useExternalMethods.rex + LD_LIBRARY_PATH=`pwd` rexx useExternalMethodsRoutines.rex + + Unix: to recreate the shared libraries you would enter: + + make -f Makefile.unix clean + make -f Makefile.unix + + Windows: to recreate the DLLs you would enter: + + nmake /f Makefile.windows clean + nmake /f Makefile.windows + diff --git a/modules/api/c++/external/useExternalMethods.rex b/modules/api/c++/external/useExternalMethods.rex new file mode 100755 index 0000000..8ab4ce4 --- /dev/null +++ b/modules/api/c++/external/useExternalMethods.rex @@ -0,0 +1,77 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +o=.test~new -- create object +o~hello +say "---" +say "o~NoArgMethodReturn123() :" pp(o~NoArgMethodReturn123) +say +say "invoking a method that returns nothing:" +o~NoArgMethodVoid +say +say "o~OneArgMethodReturnArg(1) :" pp(o~OneArgMethodReturnArg(1)) +say "o~OneArgMethodReturnArg( ) :" pp(o~OneArgMethodReturnArg( )) +say +say "invoking another method that returns nothing:" +o~OneArgMethodVoid(2) +say +say "o~TwoIntArgAdder(4, 5) :" pp(o~TwoIntArgAdder(4, 5)) +say "o~TwoDoubleArgAdder(6 , 8 ):" pp(o~TwoDoubleArgAdder(6 , 8 )) +say "o~TwoDoubleArgAdder(6.7, 8.9):" pp(o~TwoDoubleArgAdder(6.7, 8.9)) +say "---" +say "invoking a method that natively will send 'hello' to its object:" +o~OneArgInvokeOrxMethod(-123) +say "---" + +say "Invoking an external method with wrong arguments:" +say "o~TwoIntArgAdder(9.8, 7.6) :" pp(o~TwoIntArgAdder(9.8, 7.6)) + + +::routine pp -- return string value enclosed in square brackets + return "["arg(1)"]" + +::class test -- define class and native methods for it +::method NoArgMethodReturn123 external "LIBRARY external_methods NoArgMethodReturn123 " +::method NoArgMethodVoid external "LIBRARY external_methods NoArgMethodVoid " +::method OneArgMethodReturnArg external "LIBRARY external_methods OneArgMethodReturnArg" +::method OneArgMethodVoid external "LIBRARY external_methods OneArgMethodVoid " +::method TwoIntArgAdder external "LIBRARY external_methods TwoIntArgAdder " +::method TwoDoubleArgAdder external "LIBRARY external_methods TwoDoubleArgAdder " +::method OneArgInvokeOrxMethod external "LIBRARY external_methods OneArgInvokeOrxMethod" + +::method hello + say "hello from" pp(self) "self~identityHash:" pp(self~identityHash) diff --git a/modules/api/c++/external/useExternalMethodsRoutines.rex b/modules/api/c++/external/useExternalMethodsRoutines.rex new file mode 100755 index 0000000..5dbe49f --- /dev/null +++ b/modules/api/c++/external/useExternalMethodsRoutines.rex @@ -0,0 +1,47 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +say "NoArgRoutineReturn123():" NoArgRoutineReturn123() + +o=.test~new -- create object +say "o~NoArgMethodReturn123 :" o~NoArgMethodReturn123 + +::routine NoArgRoutineReturn123 external "library external_methods_routines NoArgRoutineReturn123" + +::class test -- define class and native methods for it +::method NoArgMethodReturn123 external "LIBRARY external_methods_routines NoArgMethodReturn123 " + diff --git a/modules/api/c++/external/useExternalRoutines.rex b/modules/api/c++/external/useExternalRoutines.rex new file mode 100755 index 0000000..fc6b3a0 --- /dev/null +++ b/modules/api/c++/external/useExternalRoutines.rex @@ -0,0 +1,64 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +say "NoArgRoutineReturn123() :" pp(NoArgRoutineReturn123()) +say +say "calling a routine that returns nothing:" +call NoArgRoutineVoid +say +say "OneArgRoutineReturnArg(1) :" pp(OneArgRoutineReturnArg(1)) +say "OneArgRoutineReturnArg( ) :" pp(OneArgRoutineReturnArg()) +say +say "calling another routine that returns nothing:" +call OneArgRoutineVoid 2 +say +say "TwoIntArgAdder(4, 5) :" pp(TwoIntArgAdder(4, 5)) +say "TwoDoubleArgAdder(6 , 8 ):" pp(TwoDoubleArgAdder(6 , 8 )) +say "TwoDoubleArgAdder(6.7, 8.9):" pp(TwoDoubleArgAdder(6.7, 8.9)) +say "---" + +say "Invoking an external routine with wrong arguments:" +say "TwoIntArgAdder(9.8, 7.6) :" pp(TwoIntArgAdder(9.8, 7.6)) + +::routine pp -- return string value enclosed in square brackets + return "["arg(1)"]" + +::routine NoArgRoutineReturn123 external "library external_routines NoArgRoutineReturn123" +::routine NoArgRoutineVoid external "library external_routines NoArgRoutineVoid" +::routine OneArgRoutineReturnArg external "library external_routines OneArgRoutineReturnArg" +::routine OneArgRoutineVoid external "library external_routines OneArgRoutineVoid" +::routine TwoDoubleArgAdder external "library external_routines TwoDoubleArgAdder" diff --git a/modules/api/c++/external/useExternalRoutines2.rex b/modules/api/c++/external/useExternalRoutines2.rex new file mode 100755 index 0000000..79fcd43 --- /dev/null +++ b/modules/api/c++/external/useExternalRoutines2.rex @@ -0,0 +1,60 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYright HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYright */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +say "NoArgRoutineReturn123() :" pp(NoArgRoutineReturn123()) +say +say "calling a routine that returns nothing:" +call NoArgRoutineVoid +say +say "OneArgRoutineReturnArg(1) :" pp(OneArgRoutineReturnArg(1)) +say "OneArgRoutineReturnArg( ) :" pp(OneArgRoutineReturnArg()) +say +say "calling another routine that returns nothing:" +call OneArgRoutineVoid 2 +say +say "TwoIntArgAdder(4, 5) :" pp(TwoIntArgAdder(4, 5)) +say "TwoDoubleArgAdder(6 , 8 ):" pp(TwoDoubleArgAdder(6 , 8 )) +say "TwoDoubleArgAdder(6.7, 8.9):" pp(TwoDoubleArgAdder(6.7, 8.9)) +say "---" + +say "Invoking an external routine with wrong arguments:" +say "TwoIntArgAdder(9.8, 7.6) :" pp(TwoIntArgAdder(9.8, 7.6)) + +::requires "external_routines" library + +::routine pp -- return string value enclosed in square brackets + return "["arg(1)"]" diff --git a/modules/api/c++/readme.txt b/modules/api/c++/readme.txt new file mode 100644 index 0000000..01152f7 --- /dev/null +++ b/modules/api/c++/readme.txt @@ -0,0 +1,69 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2010-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + ReadMe + ====== + + ooRexx 4.0.0 introduced a new (at the time) C++ API for writing + extensions to the ooRexx interpreter. This API makes it possible for + the extension developer to make better, and more robust, use of the + interpreter. In particular the API makes it possible to use the + objects in ooRexx. + + The subdirectories of this directory contain examples showing how to + use the C++ API. + + Note that the extensions distributed with ooRexx make extensive use of + the C++ API and provide a lot of code showing usage of the API. + + The subdirectories: + + callsample + ---------- + This subdirectory has several examples of creating an interpreter + instance. One example uses the interpreter instance to call, + execute, and obtain the result from Rexx programs. The other + dynamically creates a Rexx routine and calls that routine. + + external + -------- + This subdirectory has three examples to create DLLs/shared libraries + with external routines and methods that can be directly used from + ooRexx programs. One example creates external routines only, the next + external methods only and one example creates external routines and + methods in the same DLL/shared library. + diff --git a/modules/api/classic/CMakeLists.txt b/modules/api/classic/CMakeLists.txt new file mode 100644 index 0000000..d3f4691 --- /dev/null +++ b/modules/api/classic/CMakeLists.txt @@ -0,0 +1,59 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (samples-api) + +if (WIN32) + add_subdirectory (windows) +else () + add_subdirectory (unix) +endif () diff --git a/modules/api/classic/unix/CMakeCache.txt b/modules/api/classic/unix/CMakeCache.txt new file mode 100644 index 0000000..567e923 --- /dev/null +++ b/modules/api/classic/unix/CMakeCache.txt @@ -0,0 +1,382 @@ +# This is the CMakeCache file. +# For build in directory: /home/gmgauthier/Projects/code/rexx/api/classic/unix +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/usr/bin/addr2line + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING= + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-13 + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-13 + +//Flags used by the CXX compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the CXX compiler during DEBUG builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the CXX compiler during RELEASE builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//C compiler +CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_C_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-13 + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_C_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-13 + +//Flags used by the C compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the C compiler during DEBUG builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the C compiler during RELEASE builds. +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND + +//Flags used by the linker during all build types. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL= + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/gmake + +//Flags used by the linker during the creation of modules during +// all build types. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=rexxapi1 + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/usr/bin/readelf + +//Flags used by the linker during the creation of shared libraries +// during all build types. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +rexxapi1_BINARY_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/api/classic/unix + +//Value Computed by CMake +rexxapi1_IS_TOP_LEVEL:STATIC=ON + +//Dependencies for the target +rexxapi1_LIB_DEPENDS:STATIC=general;rexx;general;rexxapi; + +//Value Computed by CMake +rexxapi1_SOURCE_DIR:STATIC=/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1 + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/gmgauthier/Projects/code/rexx/api/classic/unix +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=28 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=3 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1 +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake-3.28 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeCCompiler.cmake b/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeCCompiler.cmake new file mode 100644 index 0000000..3766fe1 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeCCompiler.cmake @@ -0,0 +1,74 @@ +set(CMAKE_C_COMPILER "/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "GNU") +set(CMAKE_C_COMPILER_VERSION "13.3.0") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_C_COMPILER_AR "/usr/bin/gcc-ar-13") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_C_COMPILER_RANLIB "/usr/bin/gcc-ranlib-13") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC 1) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED TRUE) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/13/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;gcc_s;c;gcc;gcc_s") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/13;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeCXXCompiler.cmake b/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..8dbc9d3 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeCXXCompiler.cmake @@ -0,0 +1,85 @@ +set(CMAKE_CXX_COMPILER "/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "13.3.0") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_CXX_COMPILER_AR "/usr/bin/gcc-ar-13") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/usr/bin/gcc-ranlib-13") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED TRUE) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/usr/include/c++/13;/usr/include/x86_64-linux-gnu/c++/13;/usr/include/c++/13/backward;/usr/lib/gcc/x86_64-linux-gnu/13/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;gcc_s;gcc;c;gcc_s;gcc") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/13;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeDetermineCompilerABI_C.bin b/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..87f287194a15f3106a57cf4ff4b57eba7b928fa6 GIT binary patch literal 15968 zcmeHOeT)@X6~FH-3yXZbM+>?F!lqludsjp&cYT^ffv|^f=RcwL^vW;lA6?mR=?>Udz z;caWGF`CSInK}3T?)lw&=ggh=?z}m3IN8%3jYI@Xo%oQI%msUn#8iDkDX3L)E;>^;5MBowd5u`8p;syxdQie6M2)=J#F(dQSPME1vG+#c2~rF!&VH-2z%?3$5y_0o6tMfN`Rr{|s5#?c4IjU4nr!S;BH zu#J79560uzonMcvvFF@|*nHR)!`6{};o`^VcfR<8^A8?6YyTp*aO*=09{ce5a!dN9 zOXu$0yYimHUq1A7WBpU$I;&v&x74V`^P<(jbF<)Iodv%O@VI!Jh$o=nlLJsjTqJxT z6pu^1Q8WhdTLFI;Y(Yr_pw(#S5a3HN%9>(e%u$A5y9J_`po#Myi3)KNbX+vvG){~& z`mbN296w3^254+w(-g3baABG-qXx~QXStr4vz$C2gJYICgY6E^cH=y;BxCGJftYhz#E@BUpXR=I07Dc zUMQTRwA_K|Stp((?0cX8B23??__6ec?@9W8N@Th|1{(=wZYZoh~d^pb$#HW2Y_lQlS2w{A>>_scTGLHVF;fy?l%H~G^uB?3&_OaCof&P`X&ww=)Tiqq3z420N z;_SzaiQgMX|1h<4Ai1%;@pn?j1%<_qPk<+TLxW! z1k2F%{K{l(^$~PDLmK=Y>AyLRYW;O%V#;{-FWZf0r|XQ!bH>^0-co2_Ej7?knN;Iq zK92XuHmnw<+xHkpw?(mNOuXzZG>&hZ3&w@@l}hD826oTYUxT~u$bR5f`$zsC4?-mt z_5g3g(>`>U-X_uX)RUzkgq7 zNNZnDYG9xzX(s!+Qtf@_W^vyh|gS3UanLQfIbEK80g1A8=xPa zs#H#aM!{#QD3SYiiO5(yvSQ)9hLiB%2l17#9RQAeme(~;J~>(g7(T#S2eC=hbl@9p}i&n;sbALLMgN*)1abQOd`AJK3DC zw}NcG^;u3f=k4MB5(?Mgjw9TfO1q8f zUnQHzMa}=`6z7Nkn=Nww&e|{KnjmbX!eTmw zX}=i$&g1X$85O$+U2mgafW&Y3x6SmdVF5tVD-8|lgW^WAx#{K1K};W~P+OjRVDJnc(To zaP921?y);Np${i(yX_q*7@SObzwsBMnRbRTh2638H&taF&&%2~YT;<1)9zjEz4Bj2 z6Vl;vfH?MI!5p#j8OW+PyYA|1?@e_A3NK!mNrMPR*Din{0U!UcMCy*7{*Lw@v%kB0 zcXGfSXzzgkGKD-0@CzjPCwv+6|Lv51^@72ydHpkAJ*W;8)BJ^A9M5@H8novsJ;Eg? z53eJP3O!%&Y<)Oi(nsCGsO@^=J}6ys;H4QSLlB(8CY)^2eZ(q`2t6~Nhc1+c7Z_yC zCv3Oq6!J3+6Y5+$Yav1CI8}r`npHb}xBvyu9)rC+ow{3)??LGH2+gpO4Di`fd^Ob+ zgUiskm2(DRIQSZc4sS&W9p-orrtXaE=S>>8K7vaXzT=bx-*@Bn5mifHE~9=oY`BJD z{%r4cp)U%rZ z&+9tY{Cm#hXFt~W10UCnZ1cL2bu;x896t}>1QhU4na}H3)@5?!{)5N=5Y*!_aeei7 zmVR$}{Z7qP!^`&90(^~ltOGyW!REyy0e&+PSicef+W~%p2&^-K6Bcami2$G1J*@fu z2Hd3Z^kVxo6tD}9ztE_L^ykQAMKGJq(kI&;b07Dn%^ZK#80lkGt$o-8S^I1xndi#h-hBljxK{M)ODDlp%#t8>rio1g~2MFYd@81Kz_JpBEK_gg%6A6;C)8zqqS YfyTLCRf}uq+WaN>!veA}KnR%PpD9X5TL1t6 literal 0 HcmV?d00001 diff --git a/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeDetermineCompilerABI_CXX.bin b/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..81abc267065a2e02b3405c31c62b55b5985377fd GIT binary patch literal 15992 zcmeHOYit}>6~4Q65{Ee1ZJJP%gl1A2I!a zYmO(z1ix(*Prq&?H>~}<5#srEH}P0wA1M1?c2fUJf4hlyR*`OmU%%Uh1#9ka5AbAM zsQt|pALhN(-$KVBO7Uk+;T4>2N@Tj;;L}O6!NI#Sj7cmbA#iJ6h z6LmiPPQdShuV3~6pj7a41n@gBx{AxdSfgN+SBe$o-@A88REXoCqoQu!I9HJUraN52 zPm;aRb(k@OdfqW?N6#2m7LdU)Lm#rTM%p@R3T(#t(<=1Dz%D&y+UBs8cT9U=S64ch zH3y7j+7!B(G8_ZAs9bMQ8P4Rg1ux~&7C``k!xJYr}-#Pw$Q7BH+ z^!vy7b#hn}bBT;|{n`!}$2pF3lI6Mw_nsFwJvg6($eHrse9RG__Tbz%;(-Ja2qF+f zAc#N^fgl1w1peP6@W;sAuWKhKYqZmgez92y?K4FuTzWw}`NNvaa@R{+9|yR!@d?;Q z*2e_emo`2FwV}xRZXxSUuOud}d`z48wRZA1Q@aP^O~s}kYiG7U4-QJJ^I-a?AvLo8 zA?XkB#{kjJEINm(ecD+KU4IbE(Dl;N^~m}YXn2`4*jv(mYZBF_8Es-pd-e}Iv}dQQ zw9s?fl^JIhIM_%IYD(ALaWNmqdty5_i^6^TwUgV!Skxw7c51cL+ZRLS=B84qbTb8; z=NA19uDU~qfLrb#`M-Mr8nLh+coUzR)Fukoe-yus!#o|I)V`>lS$!3*3nJgCjz*p- zhT^vgU4^^(61H5b4o5EeTYgokW%ciUo^Btyj9trPR6Z)$bs#|mf(Qf=2qF+fAc#N^ zfgl1w1cC?z5eOm>MBpEf06yP&BT4l2^l!_<^Q+vDo*H%RgN<#6y!L&G{+{GEXIwY! zoS8akCpz_=eepzhUx$!(lAj!ROg(4ABd>$KiGhLMxE}B8PIUBvg={yH)U{p5$#z~_x{MT2Wn1;9c$X()pD?pnS$Y(vjz5l9e$AOb-If(Qf=2qF+fAc#N^fgl1w1pYT7!1;Kb zf5*9X@}dWZSj)qt{JiBm?L!zco|JVf`se(!;z} z6pad)?}su??Qe0b;%U;$NY{~GO_~+w{uL>|kJ7=#ZgR}yC=!8lX4&7}gtOgWOYV3f zP7<1-x(ezSc73L#HEFCQ<={|&+20-mpIe+&xPFP|@rpOW@>3ZDOrKM93O<)J@MxQOvcT>YZ-GZ(|!Zvn5ASAI+SnV+}*0^pVM z&0i;be|#3h?K!mf=bJABT$w){u@UflD&S(@pzSoNImi@;yKTB-3=07APGM+B9Tc<4 z=(>~92QeKzk2&Z$eK?&<8fiV{H+kl&bS;rn1 zL$;AI^;98~83&4|rh}z3$Fysgam4I8aG(o%vC^j9(V0*OM@NPJk=~|OD?60aJ@+CJ zZFbSwJB)hL8pf1(%YY1gXm6J+PkY*OoV4jNX_FQZ6&PI4-i}@J?xYTR_P8UskNKQF zVq{a8o!|Z8zK&gqE2Ioe`8ie8C z>liA$T_IGM`WcwfmCmkz8pCxHobvD+=ZgP5I9@kVv$W+h>UY2w*EY;w=zTA=Md9^~ zTN9!c3SPedy)V2^?iIWr?-l$%_44`uoVDULhO(dkA;A6&Ya<>%uLoIc#OL*(fBXit z<64mUyk2Cz8-ojiW5go!d7WnghD#9U^ZJuDuQ$O&3c2H|xF1Tm_G3P;_gM4sj#04Ye}y2dXjY`_2eHv58w9m`IwBKf^CV0oRaxUBc^G zeoxYG&vn)}fE)4fdHp=y03Zn4xwY9kwybj~Bd+6dOUO<7we9pOFw-wjCmHGAf M#{yF8BlxP~@1wCoegFUf literal 0 HcmV?d00001 diff --git a/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeSystem.cmake b/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeSystem.cmake new file mode 100644 index 0000000..e01f3fe --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/3.28.3/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-6.11.0-19-generic") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "6.11.0-19-generic") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Linux-6.11.0-19-generic") +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_VERSION "6.11.0-19-generic") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/modules/api/classic/unix/CMakeFiles/3.28.3/CompilerIdC/CMakeCCompilerId.c b/modules/api/classic/unix/CMakeFiles/3.28.3/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..0a0ec9b --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/3.28.3/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,880 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif __STDC_VERSION__ > 201710L +# define C_VERSION "23" +#elif __STDC_VERSION__ >= 201710L +# define C_VERSION "17" +#elif __STDC_VERSION__ >= 201000L +# define C_VERSION "11" +#elif __STDC_VERSION__ >= 199901L +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/modules/api/classic/unix/CMakeFiles/3.28.3/CompilerIdC/a.out b/modules/api/classic/unix/CMakeFiles/3.28.3/CompilerIdC/a.out new file mode 100755 index 0000000000000000000000000000000000000000..ecc315e71b4e62a6558ef29ebb804b7c2bdf9e59 GIT binary patch literal 16088 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 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +# if defined(__INTEL_CXX11_MODE__) +# if defined(__cpp_aggregate_nsdmi) +# define CXX_STD 201402L +# else +# define CXX_STD 201103L +# endif +# else +# define CXX_STD 199711L +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# define CXX_STD _MSVC_LANG +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > 202002L + "23" +#elif CXX_STD > 201703L + "20" +#elif CXX_STD >= 201703L + "17" +#elif CXX_STD >= 201402L + "14" +#elif CXX_STD >= 201103L + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/modules/api/classic/unix/CMakeFiles/3.28.3/CompilerIdCXX/a.out b/modules/api/classic/unix/CMakeFiles/3.28.3/CompilerIdCXX/a.out new file mode 100755 index 0000000000000000000000000000000000000000..c8ced32cf082708045baa23211fbf858c298928d GIT binary patch literal 16096 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 ASpWb4 literal 0 HcmV?d00001 diff --git a/modules/api/classic/unix/CMakeFiles/CMakeConfigureLog.yaml b/modules/api/classic/unix/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..cd300e0 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,531 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineSystem.cmake:233 (message)" + - "CMakeLists.txt:53 (project)" + message: | + The system is: Linux - 6.11.0-19-generic - x86_64 + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:53 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /usr/bin/cc + Build flags: + Id flags: + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" + + The C compiler identification is GNU, found in: + /home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/3.28.3/CompilerIdC/a.out + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:53 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /usr/bin/c++ + Build flags: + Id flags: + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + + The CXX compiler identification is GNU, found in: + /home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/3.28.3/CompilerIdCXX/a.out + + - + kind: "try_compile-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:57 (try_compile)" + - "/usr/share/cmake-3.28/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:53 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-DdXzc5" + binary: "/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-DdXzc5" + cmakeVariables: + CMAKE_C_FLAGS: "" + CMAKE_EXE_LINKER_FLAGS: "" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-DdXzc5' + + Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_0f8fe/fast + /usr/bin/gmake -f CMakeFiles/cmTC_0f8fe.dir/build.make CMakeFiles/cmTC_0f8fe.dir/build + gmake[1]: Entering directory '/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-DdXzc5' + Building C object CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o + /usr/bin/cc -v -o CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.28/Modules/CMakeCCompilerABI.c + Using built-in specs. + COLLECT_GCC=/usr/bin/cc + OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa + OFFLOAD_TARGET_DEFAULT=1 + Target: x86_64-linux-gnu + Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2 + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_0f8fe.dir/' + /usr/libexec/gcc/x86_64-linux-gnu/13/cc1 -quiet -v -imultiarch x86_64-linux-gnu /usr/share/cmake-3.28/Modules/CMakeCCompilerABI.c -quiet -dumpdir CMakeFiles/cmTC_0f8fe.dir/ -dumpbase CMakeCCompilerABI.c.c -dumpbase-ext .c -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccq6SGES.s + GNU C17 (Ubuntu 13.3.0-6ubuntu2~24.04) version 13.3.0 (x86_64-linux-gnu) + compiled by GNU C version 13.3.0, GMP version 6.3.0, MPFR version 4.2.1, MPC version 1.3.1, isl version isl-0.26-GMP + + GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 + ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed/x86_64-linux-gnu" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include" + #include "..." search starts here: + #include <...> search starts here: + /usr/lib/gcc/x86_64-linux-gnu/13/include + /usr/local/include + /usr/include/x86_64-linux-gnu + /usr/include + End of search list. + Compiler executable checksum: 38987c28e967c64056a6454abdef726e + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_0f8fe.dir/' + as -v --64 -o CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o /tmp/ccq6SGES.s + GNU assembler version 2.42 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.42 + COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.' + Linking C executable cmTC_0f8fe + /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_0f8fe.dir/link.txt --verbose=1 + /usr/bin/cc -v -rdynamic CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o -o cmTC_0f8fe + Using built-in specs. + COLLECT_GCC=/usr/bin/cc + COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper + OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa + OFFLOAD_TARGET_DEFAULT=1 + Target: x86_64-linux-gnu + Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2 + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) + COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-v' '-rdynamic' '-o' 'cmTC_0f8fe' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_0f8fe.' + /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/ccbjzs4x.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_0f8fe /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o + COLLECT_GCC_OPTIONS='-v' '-rdynamic' '-o' 'cmTC_0f8fe' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_0f8fe.' + gmake[1]: Leaving directory '/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-DdXzc5' + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:127 (message)" + - "/usr/share/cmake-3.28/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:53 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/usr/lib/gcc/x86_64-linux-gnu/13/include] + add: [/usr/local/include] + add: [/usr/include/x86_64-linux-gnu] + add: [/usr/include] + end of search list found + collapse include dir [/usr/lib/gcc/x86_64-linux-gnu/13/include] ==> [/usr/lib/gcc/x86_64-linux-gnu/13/include] + collapse include dir [/usr/local/include] ==> [/usr/local/include] + collapse include dir [/usr/include/x86_64-linux-gnu] ==> [/usr/include/x86_64-linux-gnu] + collapse include dir [/usr/include] ==> [/usr/include] + implicit include dirs: [/usr/lib/gcc/x86_64-linux-gnu/13/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:159 (message)" + - "/usr/share/cmake-3.28/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:53 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + ignore line: [Change Dir: '/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-DdXzc5'] + ignore line: [] + ignore line: [Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_0f8fe/fast] + ignore line: [/usr/bin/gmake -f CMakeFiles/cmTC_0f8fe.dir/build.make CMakeFiles/cmTC_0f8fe.dir/build] + ignore line: [gmake[1]: Entering directory '/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-DdXzc5'] + ignore line: [Building C object CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o] + ignore line: [/usr/bin/cc -v -o CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.28/Modules/CMakeCCompilerABI.c] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c ada c++ go d fortran objc obj-c++ m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) ] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_0f8fe.dir/'] + ignore line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/cc1 -quiet -v -imultiarch x86_64-linux-gnu /usr/share/cmake-3.28/Modules/CMakeCCompilerABI.c -quiet -dumpdir CMakeFiles/cmTC_0f8fe.dir/ -dumpbase CMakeCCompilerABI.c.c -dumpbase-ext .c -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccq6SGES.s] + ignore line: [GNU C17 (Ubuntu 13.3.0-6ubuntu2~24.04) version 13.3.0 (x86_64-linux-gnu)] + ignore line: [ compiled by GNU C version 13.3.0 GMP version 6.3.0 MPFR version 4.2.1 MPC version 1.3.1 isl version isl-0.26-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed/x86_64-linux-gnu"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/13/include] + ignore line: [ /usr/local/include] + ignore line: [ /usr/include/x86_64-linux-gnu] + ignore line: [ /usr/include] + ignore line: [End of search list.] + ignore line: [Compiler executable checksum: 38987c28e967c64056a6454abdef726e] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_0f8fe.dir/'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o /tmp/ccq6SGES.s] + ignore line: [GNU assembler version 2.42 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.42] + ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.'] + ignore line: [Linking C executable cmTC_0f8fe] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_0f8fe.dir/link.txt --verbose=1] + ignore line: [/usr/bin/cc -v -rdynamic CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o -o cmTC_0f8fe ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c ada c++ go d fortran objc obj-c++ m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) ] + ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-rdynamic' '-o' 'cmTC_0f8fe' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_0f8fe.'] + link line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/ccbjzs4x.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_0f8fe /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/libexec/gcc/x86_64-linux-gnu/13/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccbjzs4x.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-pie] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_0f8fe] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../..] + arg [CMakeFiles/cmTC_0f8fe.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [--push-state] ==> ignore + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--pop-state] ==> ignore + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [--push-state] ==> ignore + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--pop-state] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] + collapse obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] ==> [/usr/lib/x86_64-linux-gnu/Scrt1.o] + collapse obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] ==> [/usr/lib/x86_64-linux-gnu/crti.o] + collapse obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] ==> [/usr/lib/x86_64-linux-gnu/crtn.o] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13] ==> [/usr/lib/gcc/x86_64-linux-gnu/13] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../..] ==> [/usr/lib] + implicit libs: [gcc;gcc_s;c;gcc;gcc_s] + implicit objs: [/usr/lib/x86_64-linux-gnu/Scrt1.o;/usr/lib/x86_64-linux-gnu/crti.o;/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o;/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o;/usr/lib/x86_64-linux-gnu/crtn.o] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/13;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + + - + kind: "try_compile-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:57 (try_compile)" + - "/usr/share/cmake-3.28/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:53 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-oSgVWu" + binary: "/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-oSgVWu" + cmakeVariables: + CMAKE_CXX_FLAGS: "" + CMAKE_EXE_LINKER_FLAGS: "" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-oSgVWu' + + Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_9f826/fast + /usr/bin/gmake -f CMakeFiles/cmTC_9f826.dir/build.make CMakeFiles/cmTC_9f826.dir/build + gmake[1]: Entering directory '/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-oSgVWu' + Building CXX object CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o + /usr/bin/c++ -v -o CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp + Using built-in specs. + COLLECT_GCC=/usr/bin/c++ + OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa + OFFLOAD_TARGET_DEFAULT=1 + Target: x86_64-linux-gnu + Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2 + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_9f826.dir/' + /usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_9f826.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccc6b6MX.s + GNU C++17 (Ubuntu 13.3.0-6ubuntu2~24.04) version 13.3.0 (x86_64-linux-gnu) + compiled by GNU C version 13.3.0, GMP version 6.3.0, MPFR version 4.2.1, MPC version 1.3.1, isl version isl-0.26-GMP + + GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 + ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/13" + ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed/x86_64-linux-gnu" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include" + #include "..." search starts here: + #include <...> search starts here: + /usr/include/c++/13 + /usr/include/x86_64-linux-gnu/c++/13 + /usr/include/c++/13/backward + /usr/lib/gcc/x86_64-linux-gnu/13/include + /usr/local/include + /usr/include/x86_64-linux-gnu + /usr/include + End of search list. + Compiler executable checksum: c81c05345ce537099dafd5580045814a + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_9f826.dir/' + as -v --64 -o CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccc6b6MX.s + GNU assembler version 2.42 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.42 + COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.' + Linking CXX executable cmTC_9f826 + /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_9f826.dir/link.txt --verbose=1 + /usr/bin/c++ -v -rdynamic CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_9f826 + Using built-in specs. + COLLECT_GCC=/usr/bin/c++ + COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper + OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa + OFFLOAD_TARGET_DEFAULT=1 + Target: x86_64-linux-gnu + Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2 + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) + COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-v' '-rdynamic' '-o' 'cmTC_9f826' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_9f826.' + /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/ccjd28fu.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_9f826 /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o + COLLECT_GCC_OPTIONS='-v' '-rdynamic' '-o' 'cmTC_9f826' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_9f826.' + gmake[1]: Leaving directory '/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-oSgVWu' + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:127 (message)" + - "/usr/share/cmake-3.28/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:53 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/usr/include/c++/13] + add: [/usr/include/x86_64-linux-gnu/c++/13] + add: [/usr/include/c++/13/backward] + add: [/usr/lib/gcc/x86_64-linux-gnu/13/include] + add: [/usr/local/include] + add: [/usr/include/x86_64-linux-gnu] + add: [/usr/include] + end of search list found + collapse include dir [/usr/include/c++/13] ==> [/usr/include/c++/13] + collapse include dir [/usr/include/x86_64-linux-gnu/c++/13] ==> [/usr/include/x86_64-linux-gnu/c++/13] + collapse include dir [/usr/include/c++/13/backward] ==> [/usr/include/c++/13/backward] + collapse include dir [/usr/lib/gcc/x86_64-linux-gnu/13/include] ==> [/usr/lib/gcc/x86_64-linux-gnu/13/include] + collapse include dir [/usr/local/include] ==> [/usr/local/include] + collapse include dir [/usr/include/x86_64-linux-gnu] ==> [/usr/include/x86_64-linux-gnu] + collapse include dir [/usr/include] ==> [/usr/include] + implicit include dirs: [/usr/include/c++/13;/usr/include/x86_64-linux-gnu/c++/13;/usr/include/c++/13/backward;/usr/lib/gcc/x86_64-linux-gnu/13/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake:159 (message)" + - "/usr/share/cmake-3.28/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:53 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + ignore line: [Change Dir: '/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-oSgVWu'] + ignore line: [] + ignore line: [Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_9f826/fast] + ignore line: [/usr/bin/gmake -f CMakeFiles/cmTC_9f826.dir/build.make CMakeFiles/cmTC_9f826.dir/build] + ignore line: [gmake[1]: Entering directory '/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/CMakeScratch/TryCompile-oSgVWu'] + ignore line: [Building CXX object CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/c++ -v -o CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c ada c++ go d fortran objc obj-c++ m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) ] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_9f826.dir/'] + ignore line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_9f826.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccc6b6MX.s] + ignore line: [GNU C++17 (Ubuntu 13.3.0-6ubuntu2~24.04) version 13.3.0 (x86_64-linux-gnu)] + ignore line: [ compiled by GNU C version 13.3.0 GMP version 6.3.0 MPFR version 4.2.1 MPC version 1.3.1 isl version isl-0.26-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/13"] + ignore line: [ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed/x86_64-linux-gnu"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /usr/include/c++/13] + ignore line: [ /usr/include/x86_64-linux-gnu/c++/13] + ignore line: [ /usr/include/c++/13/backward] + ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/13/include] + ignore line: [ /usr/local/include] + ignore line: [ /usr/include/x86_64-linux-gnu] + ignore line: [ /usr/include] + ignore line: [End of search list.] + ignore line: [Compiler executable checksum: c81c05345ce537099dafd5580045814a] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_9f826.dir/'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccc6b6MX.s] + ignore line: [GNU assembler version 2.42 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.42] + ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.'] + ignore line: [Linking CXX executable cmTC_9f826] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_9f826.dir/link.txt --verbose=1] + ignore line: [/usr/bin/c++ -v -rdynamic CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_9f826 ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs --enable-languages=c ada c++ go d fortran objc obj-c++ m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-13 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04) ] + ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-rdynamic' '-o' 'cmTC_9f826' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_9f826.'] + link line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/ccjd28fu.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_9f826 /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/libexec/gcc/x86_64-linux-gnu/13/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccjd28fu.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-pie] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_9f826] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../..] + arg [CMakeFiles/cmTC_9f826.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] + collapse obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] ==> [/usr/lib/x86_64-linux-gnu/Scrt1.o] + collapse obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] ==> [/usr/lib/x86_64-linux-gnu/crti.o] + collapse obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] ==> [/usr/lib/x86_64-linux-gnu/crtn.o] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13] ==> [/usr/lib/gcc/x86_64-linux-gnu/13] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../..] ==> [/usr/lib] + implicit libs: [stdc++;m;gcc_s;gcc;c;gcc_s;gcc] + implicit objs: [/usr/lib/x86_64-linux-gnu/Scrt1.o;/usr/lib/x86_64-linux-gnu/crti.o;/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o;/usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o;/usr/lib/x86_64-linux-gnu/crtn.o] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/13;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + +... diff --git a/modules/api/classic/unix/CMakeFiles/CMakeDirectoryInformation.cmake b/modules/api/classic/unix/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c38f8b7 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/gmgauthier/Projects/code/rexx/api/classic/unix") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/modules/api/classic/unix/CMakeFiles/Makefile.cmake b/modules/api/classic/unix/CMakeFiles/Makefile.cmake new file mode 100644 index 0000000..6be0396 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/Makefile.cmake @@ -0,0 +1,130 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# The generator used is: +set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") + +# The top level Makefile was generated from the following files: +set(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "CMakeFiles/3.28.3/CMakeCCompiler.cmake" + "CMakeFiles/3.28.3/CMakeCXXCompiler.cmake" + "CMakeFiles/3.28.3/CMakeSystem.cmake" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/CMakeLists.txt" + "/usr/share/cmake-3.28/Modules/CMakeCCompiler.cmake.in" + "/usr/share/cmake-3.28/Modules/CMakeCCompilerABI.c" + "/usr/share/cmake-3.28/Modules/CMakeCInformation.cmake" + "/usr/share/cmake-3.28/Modules/CMakeCXXCompiler.cmake.in" + "/usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp" + "/usr/share/cmake-3.28/Modules/CMakeCXXInformation.cmake" + "/usr/share/cmake-3.28/Modules/CMakeCommonLanguageInclude.cmake" + "/usr/share/cmake-3.28/Modules/CMakeCompilerIdDetection.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineCCompiler.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineCXXCompiler.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineCompileFeatures.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerABI.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake" + "/usr/share/cmake-3.28/Modules/CMakeDetermineSystem.cmake" + "/usr/share/cmake-3.28/Modules/CMakeFindBinUtils.cmake" + "/usr/share/cmake-3.28/Modules/CMakeGenericSystem.cmake" + "/usr/share/cmake-3.28/Modules/CMakeInitializeConfigs.cmake" + "/usr/share/cmake-3.28/Modules/CMakeLanguageInformation.cmake" + "/usr/share/cmake-3.28/Modules/CMakeParseImplicitIncludeInfo.cmake" + "/usr/share/cmake-3.28/Modules/CMakeParseImplicitLinkInfo.cmake" + "/usr/share/cmake-3.28/Modules/CMakeParseLibraryArchitecture.cmake" + "/usr/share/cmake-3.28/Modules/CMakeSystem.cmake.in" + "/usr/share/cmake-3.28/Modules/CMakeSystemSpecificInformation.cmake" + "/usr/share/cmake-3.28/Modules/CMakeSystemSpecificInitialize.cmake" + "/usr/share/cmake-3.28/Modules/CMakeTestCCompiler.cmake" + "/usr/share/cmake-3.28/Modules/CMakeTestCXXCompiler.cmake" + "/usr/share/cmake-3.28/Modules/CMakeTestCompilerCommon.cmake" + "/usr/share/cmake-3.28/Modules/CMakeUnixFindMake.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/ADSP-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Borland-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Clang-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Cray-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GHS-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GNU-C.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GNU-CXX.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GNU-FindBinUtils.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/GNU.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/HP-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/IAR-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Intel-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/MSVC-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/PGI-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/PathScale-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/SCO-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/TI-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Tasking-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/Watcom-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/XL-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.28/Modules/Internal/FeatureTesting.cmake" + "/usr/share/cmake-3.28/Modules/Platform/Linux-Determine-CXX.cmake" + "/usr/share/cmake-3.28/Modules/Platform/Linux-GNU-C.cmake" + "/usr/share/cmake-3.28/Modules/Platform/Linux-GNU-CXX.cmake" + "/usr/share/cmake-3.28/Modules/Platform/Linux-GNU.cmake" + "/usr/share/cmake-3.28/Modules/Platform/Linux-Initialize.cmake" + "/usr/share/cmake-3.28/Modules/Platform/Linux.cmake" + "/usr/share/cmake-3.28/Modules/Platform/UnixPaths.cmake" + ) + +# The corresponding makefile is: +set(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +set(CMAKE_MAKEFILE_PRODUCTS + "CMakeFiles/3.28.3/CMakeSystem.cmake" + "CMakeFiles/3.28.3/CMakeCCompiler.cmake" + "CMakeFiles/3.28.3/CMakeCXXCompiler.cmake" + "CMakeFiles/3.28.3/CMakeCCompiler.cmake" + "CMakeFiles/3.28.3/CMakeCXXCompiler.cmake" + "CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +set(CMAKE_DEPEND_INFO_FILES + "CMakeFiles/rexxapi1.dir/DependInfo.cmake" + ) diff --git a/modules/api/classic/unix/CMakeFiles/Makefile2 b/modules/api/classic/unix/CMakeFiles/Makefile2 new file mode 100644 index 0000000..ab3425f --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/Makefile2 @@ -0,0 +1,112 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx/api/classic/unix + +#============================================================================= +# Directory level rules for the build root directory + +# The main recursive "all" target. +all: CMakeFiles/rexxapi1.dir/all +.PHONY : all + +# The main recursive "preinstall" target. +preinstall: +.PHONY : preinstall + +# The main recursive "clean" target. +clean: CMakeFiles/rexxapi1.dir/clean +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/rexxapi1.dir + +# All Build rule for target. +CMakeFiles/rexxapi1.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/rexxapi1.dir/build.make CMakeFiles/rexxapi1.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/rexxapi1.dir/build.make CMakeFiles/rexxapi1.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles --progress-num=1,2 "Built target rexxapi1" +.PHONY : CMakeFiles/rexxapi1.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/rexxapi1.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/rexxapi1.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles 0 +.PHONY : CMakeFiles/rexxapi1.dir/rule + +# Convenience name for target. +rexxapi1: CMakeFiles/rexxapi1.dir/rule +.PHONY : rexxapi1 + +# clean rule for target. +CMakeFiles/rexxapi1.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/rexxapi1.dir/build.make CMakeFiles/rexxapi1.dir/clean +.PHONY : CMakeFiles/rexxapi1.dir/clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/api/classic/unix/CMakeFiles/TargetDirectories.txt b/modules/api/classic/unix/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..3a0808d --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,7 @@ +/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/rexxapi1.dir +/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/edit_cache.dir +/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/rebuild_cache.dir +/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/list_install_components.dir +/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/install.dir +/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/install/local.dir +/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/install/strip.dir diff --git a/modules/api/classic/unix/CMakeFiles/cmake.check_cache b/modules/api/classic/unix/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/modules/api/classic/unix/CMakeFiles/progress.marks b/modules/api/classic/unix/CMakeFiles/progress.marks new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/progress.marks @@ -0,0 +1 @@ +2 diff --git a/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/DependInfo.cmake b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/DependInfo.cmake new file mode 100644 index 0000000..002b201 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/rexxapi1.c" "CMakeFiles/rexxapi1.dir/rexxapi1.c.o" "gcc" "CMakeFiles/rexxapi1.dir/rexxapi1.c.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/build.make b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/build.make new file mode 100644 index 0000000..e2eaa03 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/build.make @@ -0,0 +1,110 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx/api/classic/unix + +# Include any dependencies generated for this target. +include CMakeFiles/rexxapi1.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include CMakeFiles/rexxapi1.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/rexxapi1.dir/progress.make + +# Include the compile flags for this target's objects. +include CMakeFiles/rexxapi1.dir/flags.make + +CMakeFiles/rexxapi1.dir/rexxapi1.c.o: CMakeFiles/rexxapi1.dir/flags.make +CMakeFiles/rexxapi1.dir/rexxapi1.c.o: /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/rexxapi1.c +CMakeFiles/rexxapi1.dir/rexxapi1.c.o: CMakeFiles/rexxapi1.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object CMakeFiles/rexxapi1.dir/rexxapi1.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/rexxapi1.dir/rexxapi1.c.o -MF CMakeFiles/rexxapi1.dir/rexxapi1.c.o.d -o CMakeFiles/rexxapi1.dir/rexxapi1.c.o -c /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/rexxapi1.c + +CMakeFiles/rexxapi1.dir/rexxapi1.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/rexxapi1.dir/rexxapi1.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/rexxapi1.c > CMakeFiles/rexxapi1.dir/rexxapi1.c.i + +CMakeFiles/rexxapi1.dir/rexxapi1.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/rexxapi1.dir/rexxapi1.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/rexxapi1.c -o CMakeFiles/rexxapi1.dir/rexxapi1.c.s + +# Object files for target rexxapi1 +rexxapi1_OBJECTS = \ +"CMakeFiles/rexxapi1.dir/rexxapi1.c.o" + +# External object files for target rexxapi1 +rexxapi1_EXTERNAL_OBJECTS = + +librexxapi1.so: CMakeFiles/rexxapi1.dir/rexxapi1.c.o +librexxapi1.so: CMakeFiles/rexxapi1.dir/build.make +librexxapi1.so: CMakeFiles/rexxapi1.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking C shared library librexxapi1.so" + $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rexxapi1.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +CMakeFiles/rexxapi1.dir/build: librexxapi1.so +.PHONY : CMakeFiles/rexxapi1.dir/build + +CMakeFiles/rexxapi1.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/rexxapi1.dir/cmake_clean.cmake +.PHONY : CMakeFiles/rexxapi1.dir/clean + +CMakeFiles/rexxapi1.dir/depend: + cd /home/gmgauthier/Projects/code/rexx/api/classic/unix && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1 /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1 /home/gmgauthier/Projects/code/rexx/api/classic/unix /home/gmgauthier/Projects/code/rexx/api/classic/unix /home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles/rexxapi1.dir/DependInfo.cmake "--color=$(COLOR)" +.PHONY : CMakeFiles/rexxapi1.dir/depend + diff --git a/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/cmake_clean.cmake b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/cmake_clean.cmake new file mode 100644 index 0000000..d980a69 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/rexxapi1.dir/rexxapi1.c.o" + "CMakeFiles/rexxapi1.dir/rexxapi1.c.o.d" + "librexxapi1.pdb" + "librexxapi1.so" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C) + include(CMakeFiles/rexxapi1.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/compiler_depend.make b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/compiler_depend.make new file mode 100644 index 0000000..95727db --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for rexxapi1. +# This may be replaced when dependencies are built. diff --git a/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/compiler_depend.ts b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/compiler_depend.ts new file mode 100644 index 0000000..2aec347 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for rexxapi1. diff --git a/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/depend.make b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/depend.make new file mode 100644 index 0000000..1efbde0 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for rexxapi1. +# This may be replaced when dependencies are built. diff --git a/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/flags.make b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/flags.make new file mode 100644 index 0000000..60197ff --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# compile C with /usr/bin/cc +C_DEFINES = -Drexxapi1_EXPORTS + +C_INCLUDES = + +C_FLAGS = -fPIC + diff --git a/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/link.txt b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/link.txt new file mode 100644 index 0000000..ffe6654 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -fPIC -shared -Wl,-soname,librexxapi1.so -o librexxapi1.so CMakeFiles/rexxapi1.dir/rexxapi1.c.o -lrexx -lrexxapi diff --git a/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/progress.make b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/progress.make new file mode 100644 index 0000000..abadeb0 --- /dev/null +++ b/modules/api/classic/unix/CMakeFiles/rexxapi1.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 1 +CMAKE_PROGRESS_2 = 2 + diff --git a/modules/api/classic/unix/CMakeLists.txt b/modules/api/classic/unix/CMakeLists.txt new file mode 100644 index 0000000..a680c5e --- /dev/null +++ b/modules/api/classic/unix/CMakeLists.txt @@ -0,0 +1,60 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (samples-api-classic-unix) + +add_subdirectory (callrexx) +add_subdirectory (rexxapi1) +add_subdirectory (rexxapi2) +add_subdirectory (rexxapi3) + +install(FILES rexxapi.README callrexx.README COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/classic ) diff --git a/modules/api/classic/unix/Makefile b/modules/api/classic/unix/Makefile new file mode 100644 index 0000000..fe30354 --- /dev/null +++ b/modules/api/classic/unix/Makefile @@ -0,0 +1,230 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx/api/classic/unix + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Samples\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles /home/gmgauthier/Projects/code/rexx/api/classic/unix//CMakeFiles/progress.marks + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/api/classic/unix/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named rexxapi1 + +# Build rule for target. +rexxapi1: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 rexxapi1 +.PHONY : rexxapi1 + +# fast build rule for target. +rexxapi1/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/rexxapi1.dir/build.make CMakeFiles/rexxapi1.dir/build +.PHONY : rexxapi1/fast + +rexxapi1.o: rexxapi1.c.o +.PHONY : rexxapi1.o + +# target to build an object file +rexxapi1.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/rexxapi1.dir/build.make CMakeFiles/rexxapi1.dir/rexxapi1.c.o +.PHONY : rexxapi1.c.o + +rexxapi1.i: rexxapi1.c.i +.PHONY : rexxapi1.i + +# target to preprocess a source file +rexxapi1.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/rexxapi1.dir/build.make CMakeFiles/rexxapi1.dir/rexxapi1.c.i +.PHONY : rexxapi1.c.i + +rexxapi1.s: rexxapi1.c.s +.PHONY : rexxapi1.s + +# target to generate assembly for a file +rexxapi1.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/rexxapi1.dir/build.make CMakeFiles/rexxapi1.dir/rexxapi1.c.s +.PHONY : rexxapi1.c.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" + @echo "... rexxapi1" + @echo "... rexxapi1.o" + @echo "... rexxapi1.i" + @echo "... rexxapi1.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/api/classic/unix/callrexx.README b/modules/api/classic/unix/callrexx.README new file mode 100644 index 0000000..6993374 --- /dev/null +++ b/modules/api/classic/unix/callrexx.README @@ -0,0 +1,64 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +The API samples in the "callrexx" directory demonstrate how to +invoke the interpreter from within an application. + +The callrexx1 sample (callrexx1.cpp) demonstrates the dynamic linking of +the REXXSTART-command. + +The callrexx2 sample demonstrates the dynamic loading of the +REXXSTART command via dlopen and dlsym functions from a calling +C program. + +The examples show + +- How to deliver Arguments to a Rexx program +- How data can be returned from a Rexx program +- How to use the instore feature +- How to use the Macrospace feature + +To build: + make -f Makefile.unix clean + make -f Makefile.unix + +To run: + + ./callrexx1 + ./callrexx2 + diff --git a/modules/api/classic/unix/callrexx/CMakeLists.txt b/modules/api/classic/unix/callrexx/CMakeLists.txt new file mode 100644 index 0000000..6b8dd5b --- /dev/null +++ b/modules/api/classic/unix/callrexx/CMakeLists.txt @@ -0,0 +1,103 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (callrexx) + +# set variables used in here +set (DEST ${INSTALL_SAMPLES_DIR}/api/classic/callrexx) +# add GROUP_WRITE right to default permissions +set (PERM_EXECUTE PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) +set (PERM_RW PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ ) + +# message (STATUS PERM_EXECUTE=${PERM_EXECUTE} ) +# message (STATUS PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR} ) + +#################### callrexx1 (executable) ######################### +# additional source files required by specific platforms +# Sources for callrexx1 +add_executable(callrexx1 ${PROJECT_SOURCE_DIR}/callrexx1.cpp) +# Include file definition +target_include_directories(callrexx1 PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +# Extra link library definitions +target_link_libraries(callrexx1 rexx rexxapi) +install(TARGETS callrexx1 RUNTIME DESTINATION ${DEST} ${PERM_EXECUTE}) +install(FILES callrexx1.cpp Makefile.unix COMPONENT Samples DESTINATION ${DEST} ${PERM_RW} ) + + +#################### callrexx2 (executable) ######################### +# additional source files required by specific platforms +#set (platform_callrexx2_libs ${ORX_SYSLIB_DL} ${ORX_SYSLIB_PTHREAD}) +# Sources for callrexx2 +add_executable(callrexx2 ${PROJECT_SOURCE_DIR}/callrexx2.c) +# Include file definition +target_include_directories(callrexx2 PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +# Extra link library definitions +target_link_libraries(callrexx2 rexx rexxapi) +install(TARGETS callrexx2 RUNTIME DESTINATION ${DEST} ${PERM_EXECUTE}) +install(FILES callrexx2.c COMPONENT Samples DESTINATION ${DEST} ${PERM_RW}) + + +#################### Rexx scripts invoked by the executables ######################### +# o.k. install(PROGRAMS del_macro.rex example.rex load_macro.rex macros.rex startrx1.rex startrx2.rex startrx3.rex +# COMPONENT Samples DESTINATION ${DEST}) + +# install(DIRECTORY ${PROJECT_SOURCE_DIR} COMPONENT Samples DESTINATION ${DEST} FILES_MATCHING PATTERN "*.rex" ${PERM} ) +# install(DIRECTORY ${PROJECT_SOURCE_DIR} COMPONENT Samples DESTINATION ${DEST} FILES_MATCHING PATTERN "*.rex" ${PERM} ) + + +install(PROGRAMS del_macro.rex example.rex load_macro.rex macros.rex startrx1.rex startrx2.rex startrx3.rex + COMPONENT Samples DESTINATION ${DEST} ${PERM_EXECUTE}) + diff --git a/modules/api/classic/unix/callrexx/Makefile.unix b/modules/api/classic/unix/callrexx/Makefile.unix new file mode 100644 index 0000000..acc410c --- /dev/null +++ b/modules/api/classic/unix/callrexx/Makefile.unix @@ -0,0 +1,55 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2008-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + + +# A pretty simple make file that should work on most Unix-like platforms that have gcc. + +OOREXX_LFLAGS = -lrexx -lrexxapi # needs to follow after file for which link resoultion is needed +DL_LFLAGS = -ldl # dlopen etc. + +# What we want to build. +all: callrexx1 callrexx2 + +callrexx1: callrexx1.cpp + gcc callrexx1.cpp ${OOREXX_LFLAGS} -o callrexx1 + +callrexx2: callrexx2.c + gcc callrexx2.c $(OOREXX_LFLAGS) ${DL_LFLAGS} -o callrexx2 + +clean: + rm -f callrexx1 callrexx2 + diff --git a/modules/api/classic/unix/callrexx/callrexx1.cpp b/modules/api/classic/unix/callrexx/callrexx1.cpp new file mode 100644 index 0000000..44860f4 --- /dev/null +++ b/modules/api/classic/unix/callrexx/callrexx1.cpp @@ -0,0 +1,476 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2017 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* File Name: CALLREXX1.C */ +/* */ +/* ----------------------------------------------------------------- */ +/* */ +/* Description: Samples of how to invoke the Open Object Rexx*/ +/* interpreter. */ +/* */ +/* Entry Points: main - main entry point */ +/* */ +/* Input: None */ +/* */ +/* Output: returns from the Open Object Rexx programs */ +/* */ +/*********************************************************************/ + +#include +#include +#include +#include +#include + +#include "rexx.h" + +char *pcharTemp; + +int main() +{ + CONSTRXSTRING arg[4]; /* argument string for Rexx */ + RXSTRING rexxretval; /* return value from Rexx */ + RXSTRING instore[2]; /* in storage parms */ + char *pszTemp; + RexxReturnCode rc = 0; /* return code from Rexx */ + short rexxrc = 0; /* return code from function */ + int ignore; // avoid warning: ignoring return value of 'int system(const char*)' + // avoid warning: ignoring return value of 'int scanf(const char*, ...)' + + char val; + const char *str1 = "Arg number one"; /* text to swap */ + const char *str2 = "Arg number two"; /* text to swap */ + const char *str3 = "Arg number three"; /* text to swap */ + const char *str4 = "Arg number four"; /* text to swap */ + const char *sync_tst = "call time 'Reset';" \ + "object1 = .example~new;" \ + "object2 = .example~new;" \ + "object3 = .example~new;" \ + "a.1 = object1~start('REPEAT', 4 , 'Object 1 running');" \ + "say a.1~result;" \ + "say 'The result method waits until the START message has completed:';" \ + "a.2 = object2~start('REPEAT', 2, 'Object 2 running');" \ + "a.3 = object3~start('REPEAT', 2, 'Object 3 running');" \ + "say a.2~result;" \ + "say a.3~result;" \ + "say 'main ended';" \ + "say 'Elapsed time: ' time('E');" \ + "exit;" \ + "::REQUIRES 'example.rex'"; + + /* By setting the strlength of the Rexx output to zero, the */ + /* interpreter allocates memory. */ + /* We can provide a buffer for the interpreter to use instead. */ + /* If the returned value does not fit into the buffer, Open Object Rexx */ + /* creates a new one. */ + + ignore = system("clear"); + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + printf("This is an easy sample of how to invoke the Rexx interpreter. \n"); + printf("The Rexx commandfile which is started is named: startrx1.rex\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + + /* This is the interpreter invocation. ---------------------------- */ + + rc=RexxStart( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "startrx1.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX1 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX1 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX1 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("In this case a previously defined Resultstring is \n"); + printf("delivered to Open Object Rexx, which is large enough to \n"); + printf("hold the Return Value of the Rexx commandfile\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rexxretval.strptr = (char *) malloc(100 * sizeof(char)); + rexxretval.strlength = 100; + + rc=RexxStart( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "startrx1.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX1 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX1 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX1 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("In this case a previously defined Resultstring is \n"); + printf("delivered to Open Object Rexx, which is too small to\n"); + printf("hold the Return Value of the Rexx commandfile.\n"); + printf("Rexx reallocates the buffer which needs to be freed\n"); + printf("in the calling program\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rexxretval.strptr = (char *) malloc(2 * sizeof(char)); + pszTemp = rexxretval.strptr; + rexxretval.strlength = 2; + + printf("The Length of the Resultstring is %zd\n", rexxretval.strlength); + + rc=RexxStart( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "startrx1.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX1 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX1 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX1 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + printf("This is a sample with 4 arguments delivered to \n"); + printf("REXXSTART\n"); + printf("The Rexx commandfile which is started is named: startrx2.rex\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + MAKERXSTRING(arg[0], str1, strlen(str1)); /* create input argument 1*/ + MAKERXSTRING(arg[1], str2, strlen(str2)); /* create input argument 2*/ + MAKERXSTRING(arg[2], str3, strlen(str3)); /* create input argument 3*/ + MAKERXSTRING(arg[3], str4, strlen(str4)); /* create input argument 4*/ + + rc=RexxStart( + 4, /* number of arguments */ + arg, /* array of arguments */ + "startrx2.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX1 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX1 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX1 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("This is a sample with 2 arguments delivered to \n"); + printf("REXXSTART\n"); + printf("The Rexx commandfile which is started is named: startrx2.rex\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + rc=RexxStart( + 2, /* number of arguments */ + arg, /* array of arguments */ + "startrx2.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX1 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX1 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX1 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("This is a sample where the directory listing of the \n"); + printf("actual directory is returned by the Rexx program. The \n"); + printf("returned ResultString is displayed\n"); + printf("The Rexx commandfile which is started is named: startrx3.rex\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + rc=RexxStart( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "startrx3.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX1 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX1 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX1 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("This is a sample where the instore parameter [0] is \n"); + printf("tested. Instore parameter [0] is loaded with \n"); + printf("a small Open Object Rexx script showing the concurrency feature.\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + instore[0].strptr = const_cast(sync_tst); + instore[0].strlength = strlen(instore[0].strptr); + instore[1].strptr = NULL; + instore[1].strlength = 0; + + rc=RexxStart( + 0, /* number of arguments */ + NULL, /* array of arguments */ + NULL, /* name of Rexx file */ + instore, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX1 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX1 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX1 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("Now instore[1] is loaded with the content of instore[0]. \n"); + printf("It can be used on subsequent calls. instore[0] is set to NULL \n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + instore[0].strptr = NULL; + instore[0].strlength = 0; + + rc=RexxStart( + 0, /* number of arguments */ + NULL, /* array of arguments */ + NULL, /* name of Rexx file */ + instore, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX1 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX1 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX1 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + RexxFreeMemory(instore[1].strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("This is a sample to show how to use the Rexx MacroSpace facility. \n"); + printf("First of all load_macro.rex is called to load \n"); + printf("the Rexx script macros.rex into Macrospace. The Macrospace- \n"); + printf("name is upload.rex. \n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + rc=RexxStart( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "load_macro.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX1 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX1 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX1 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("Now the Open Object Rexx script macros.rex (named upload.rex) has been loaded\n"); + printf("into Macrospace. It is now used in the name option of\n"); + printf("the REXXSTART command. \n"); + printf("It is very important that instore paramenter [0] and [1] are\n"); + printf("initialized to NULL rsp. 0 and used as REXXSTART parameters\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + instore[1].strptr = NULL; + instore[1].strlength = 0; + instore[0].strptr = NULL; + instore[0].strlength = 0; + + rc=RexxStart( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "upload.rex", /* name of Rexx file */ + instore, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX1 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX1 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX1 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("Finally del_macro.rex is called to delete macros.rex (named upload.rex)\n"); + printf("out of the Open Object Rexx Macrospace.\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rc=RexxStart( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "del_macro.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX1 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX1 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX1 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); +} + diff --git a/modules/api/classic/unix/callrexx/callrexx2.c b/modules/api/classic/unix/callrexx/callrexx2.c new file mode 100644 index 0000000..8420d83 --- /dev/null +++ b/modules/api/classic/unix/callrexx/callrexx2.c @@ -0,0 +1,522 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* File Name: CALLREXX2.C */ +/* */ +/* ----------------------------------------------------------------- */ +/* */ +/* Description: Samples of how to invoke the Open Object Rexx*/ +/* interpreter. It loads the Rexx library at */ +/* runtime. */ +/* */ +/* Entry Points: main - main entry point */ +/* */ +/* Input: None */ +/* */ +/* Output: returns from the Open Object Rexx programs */ +/* */ +/*********************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "rexx.h" + +char *pcharTemp; + +int main(int argc, char **argv) +{ + CONSTRXSTRING arg[4]; /* argument string for Rexx */ + RXSTRING rexxretval; /* return value from Rexx */ + RXSTRING instore[2]; /* in storage parms */ + PFNREXXSTART FuncAddress; + void *pLibHandle = NULL; /* Library handle */ + RexxReturnCode rc = 0; /* return code from Rexx */ + short rexxrc = 0; /* return code from function */ +#ifdef __APPLE__ + const char *pszLibraryName = "librexx.dylib"; /* define the library name */ +#else + const char *pszLibraryName = "librexx.so"; /* define the library name */ +#endif + char returnBuffer[100]; + int ignore; // avoid warning: ignoring return value of 'system' + // avoid warning: ignoring return value of 'scanf' + + char val; + const char *str1 = "Arg number one"; /* text to swap */ + const char *str2 = "Arg number two"; /* text to swap */ + const char *str3 = "Arg number three"; /* text to swap */ + const char *str4 = "Arg number four"; /* text to swap */ + + const char *sync_tst = "call time 'Reset';" \ + "object1 = .example~new;" \ + "object2 = .example~new;" \ + "object3 = .example~new;" \ + "a.1 = object1~start('REPEAT', 4 , 'Object 1 running');" \ + "say a.1~result;" \ + "say 'The result method waits until the START message has completed:';" \ + "a.2 = object2~start('REPEAT', 2, 'Object 2 running');" \ + "a.3 = object3~start('REPEAT', 2, 'Object 3 running');" \ + "say a.2~result;" \ + "say a.3~result;" \ + "say 'main ended';" \ + "say 'Elapsed time: ' time('E');" \ + "exit;" \ + "::REQUIRES 'example.rex'"; + + if (!(pLibHandle = dlopen(pszLibraryName, RTLD_LAZY ))) + { /* Load and resolve symbols immediately */ + fprintf(stderr, " *** Unable to load library %s !\nError message: %s\n", + pszLibraryName, dlerror()); + return 99; + } + + if(!(FuncAddress = (PFNREXXSTART) dlsym(pLibHandle, "RexxStart"))) + { + rc = 1; /* could not resolve */ + fprintf(stderr, " *** Unable to load function %s !\nError message: %s\n", + "RexxStart", dlerror()); + return 99; + } + + + /* By setting the strlength of the Rexx output to zero, the */ + /* interpreter allocates memory. */ + /* We can provide a buffer for the interpreter to use instead. */ + /* If the returned value does not fit into the buffer, */ + /* Open Object Rexx creates a new one. */ + + ignore = system("clear"); + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + printf("This is an easy sample of how to invoke the Rexx interpreter. \n"); + printf("The Rexx commandfile which is started is named: startrx1.rex\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + + /* This is the interpreter invocation. ------------------------------ */ + + rc = (*FuncAddress)( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "startrx1.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX2 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX2 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX2 - RESULT-Value: %s\n", rexxretval.strptr); + + if (rexxretval.strptr != NULL) + { + RexxFreeMemory(rexxretval.strptr); + } + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("In this case a previously defined Resultstring is \n"); + printf("delivered to Open Object Rexx, which is large enough to \n"); + printf("hold the Return Value of the Rexx commandfile.\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rexxretval.strptr = returnBuffer; + rexxretval.strlength = sizeof(returnBuffer); + + rc = (*FuncAddress)( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "startrx1.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX2 - Back from REXXSTART: Return Code: %d\n", rc); + printf("rexxretval.strptr contains %s\n", rexxretval.strptr); + printf("CALLREXX2 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX2 - RESULT-Value: %s\n", rexxretval.strptr); + /* if Rexx needed to allocate a new buffer, release that one */ + if (rexxretval.strptr != returnBuffer) + { + RexxFreeMemory(rexxretval.strptr); + } + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("In this case a previously defined Resultstring is \n"); + printf("delivered to Open Object Rexx, which is too small to\n"); + printf("hold the Return Value of the Rexx commandfile.\n"); + printf("Rexx reallocates the buffer which needs to be freed.\n"); + printf("in the calling program\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rexxretval.strptr = (char *)returnBuffer; + rexxretval.strlength = 2; + + printf("The length of the Resultstring is %zd\n", rexxretval.strlength); + + rc = (*FuncAddress)( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "startrx1.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX2 - Back from REXXSTART: Return Code: %d\n", rc); + printf("The ResultString contains %s after call\n", rexxretval.strptr); + printf("The length is now %zd\n", rexxretval.strlength); + + /* if Rexx needed to allocate a new buffer, release that one */ + if (rexxretval.strptr != returnBuffer) + { + RexxFreeMemory(rexxretval.strptr); + } + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + printf("This is a sample with 4 arguments delivered to \n"); + printf("REXXSTART\n"); + printf("The Rexx commandfile which is started is named: startrx2.rex\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + MAKERXSTRING(arg[0], str1, strlen(str1)); /* create input argument 1 */ + MAKERXSTRING(arg[1], str2, strlen(str2)); /* create input argument 2 */ + MAKERXSTRING(arg[2], str3, strlen(str3)); /* create input argument 3 */ + MAKERXSTRING(arg[3], str4, strlen(str4)); /* create input argument 4 */ + + rc = (*FuncAddress)( + 4, /* number of arguments */ + arg, /* array of arguments */ + "startrx2.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX2 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX2 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX2 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("This is a sample with 2 arguments delivered to \n"); + printf("REXXSTART\n"); + printf("The Rexx commandfile which is started is named: startrx2.rex\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + rc = (*FuncAddress)( + 2, /* number of arguments */ + arg, /* array of arguments */ + "startrx2.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX2 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX2 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX2 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("This is a sample where the directory listing of the \n"); + printf("actual directory is returned by the Rexx program. The \n"); + printf("returned ResultString is displayed\n"); + printf("The Rexx commandfile which is started is named: startrx3.rex\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + rc = (*FuncAddress)( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "startrx3.rex", /* name of Rexx file */ + NULL, /* No INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX2 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX2 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX2 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("This is a sample where the instore parameter [0] is \n"); + printf("tested. Instore parameter [0] is loaded with \n"); + printf("a small Open Object Rexx script showing the concurrency feature.\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + instore[0].strptr = (char *)sync_tst; + instore[0].strlength = strlen(instore[0].strptr); + instore[1].strptr = NULL; + instore[1].strlength = 0; + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + rc = (*FuncAddress)( + 0, /* number of arguments */ + NULL, /* array of arguments */ + NULL, /* no name for Rexx file */ + instore, /* INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX2 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX2 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX2 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("Now instore[1] is loaded with the content of instore[0]. \n"); + printf("It can be used on subsequent calls. instore[0] is set to NULL \n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + instore[0].strptr = NULL; + instore[0].strlength = 0; + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + rc = (*FuncAddress)( + 0, /* number of arguments */ + NULL, /* array of arguments */ + NULL, /* no name for Rexx file */ + instore, /* INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX2 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX2 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX2 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + free(instore[1].strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("This is a sample to show how to use the Rexx MacroSpace facility. \n"); + printf("First of all load_macro.rex is called to load \n"); + printf("the Rexx script macros.rex into Macrospace. The Macrospace- \n"); + printf("name is upload.rex. \n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + rc = (*FuncAddress)( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "load_macro.rex", /* name for Rexx macrospacefile*/ + NULL, /* INSTORE not used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX2 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX2 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX2 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("Now the Open Object Rexx script macros.rex (named upload.rex) has been loaded\n"); + printf("into Macrospace. It is now used in the name option of\n"); + printf("the REXXSTART command. \n"); + printf("It is very important that instore paramenter [0] and [1] are\n"); + printf("initialized to NULL rsp. 0 and used as REXXSTART parameters\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rexxretval.strptr = NULL; /* initialize return-pointer to empty */ + rexxretval.strlength = 0; /* initialize return-length to zero */ + + instore[1].strptr = NULL; + instore[1].strlength = 0; + instore[0].strptr = NULL; + instore[0].strlength = 0; + + rc = (*FuncAddress)( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "upload.rex", /* name for Rexx macrospacefile */ + instore, /* INSTORE used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX2 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX2 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX2 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + free(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + + printf("Finally del_macro.rex is called to delete macros.rex (named upload.rex)\n"); + printf("out of the Open Object Rexx Macrospace.\n"); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + rc = (*FuncAddress)( + 0, /* number of arguments */ + NULL, /* array of arguments */ + "del_macro.rex", /* name for Rexx macrospacefile */ + NULL, /* INSTORE not used */ + "ksh", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + NULL, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("CALLREXX2 - Back from REXXSTART: Return Code: %d\n", rc); + printf("CALLREXX2 - RESULT-LENGTH: %zd\n", rexxretval.strlength); + printf("CALLREXX2 - RESULT-Value: %s\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); + + printf("Press Enter to continue\n"); + ignore = scanf("%c", &val); + + ignore = system("clear"); + return 0; +} + diff --git a/modules/api/classic/unix/callrexx/del_macro.rex b/modules/api/classic/unix/callrexx/del_macro.rex new file mode 100755 index 0000000..3a82ee7 --- /dev/null +++ b/modules/api/classic/unix/callrexx/del_macro.rex @@ -0,0 +1,54 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* File Name: del_macro */ +/* */ +/* ----------------------------------------------------------------- */ +/* */ +/* Description: script to test the REXX interpreter API */ +/* */ +/*********************************************************************/ + +call RxFuncAdd 'SysLoadFuncs', 'rexxutil', 'SysLoadFuncs' +call SysLoadFuncs +say 'start deleting macro' +rc = SysDropRexxMacro('upload.rex') +say 'I have deleted macros.rex named upload.rex from the Macrospace. Rc = 'rc +say time('E') +exit diff --git a/modules/api/classic/unix/callrexx/example.rex b/modules/api/classic/unix/callrexx/example.rex new file mode 100755 index 0000000..644fe40 --- /dev/null +++ b/modules/api/classic/unix/callrexx/example.rex @@ -0,0 +1,55 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* File Name: example */ +/* */ +/* ----------------------------------------------------------------- */ +/* */ +/* Description: script to test the REXX interpreter API */ +/* */ +/*********************************************************************/ + +::class example public +::method repeat + expose loops + use arg reps, msg + do reps + say msg + end + return 'Repeated' msg',' reps 'times.' diff --git a/modules/api/classic/unix/callrexx/load_macro.rex b/modules/api/classic/unix/callrexx/load_macro.rex new file mode 100755 index 0000000..42b4735 --- /dev/null +++ b/modules/api/classic/unix/callrexx/load_macro.rex @@ -0,0 +1,54 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* File Name: load_macro */ +/* */ +/* ----------------------------------------------------------------- */ +/* */ +/* Description: script to test the REXX interpreter API */ +/* */ +/*********************************************************************/ + +trace o +call RxFuncAdd 'SysLoadFuncs', 'rexxutil', 'SysLoadFuncs' +call SysLoadFuncs +rc = SysAddRexxMacro('upload.rex','macros.rex') +say 'i have added macros.rex with name upload.rex to the Macrospace. RC = ' rc +exit + diff --git a/modules/api/classic/unix/callrexx/macros.rex b/modules/api/classic/unix/callrexx/macros.rex new file mode 100755 index 0000000..62797e2 --- /dev/null +++ b/modules/api/classic/unix/callrexx/macros.rex @@ -0,0 +1,52 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* File Name: macros.rex */ +/* */ +/* ----------------------------------------------------------------- */ +/* */ +/* Description: script to test the REXX interpreter API */ +/* */ +/*********************************************************************/ + +do 10 + say "Now inside the file macros.rex which is located in the REXX Macrospace" + say "and named upload.rex" +end +exit diff --git a/modules/api/classic/unix/callrexx/startrx1.rex b/modules/api/classic/unix/callrexx/startrx1.rex new file mode 100755 index 0000000..c6eeb82 --- /dev/null +++ b/modules/api/classic/unix/callrexx/startrx1.rex @@ -0,0 +1,57 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* File Name: startrx1.rex */ +/* */ +/* ----------------------------------------------------------------- */ +/* */ +/* Description: script to test the REXX interpreter API */ +/* */ +/*********************************************************************/ + + +say ' ' +say ' Now inside startrx1.rex which can perform' +say ' tasks which are suitable for Open Object Rexx'. +say ' The return value is 99999999' +say ' ' +say ' ' + +exit 99999999 + diff --git a/modules/api/classic/unix/callrexx/startrx2.rex b/modules/api/classic/unix/callrexx/startrx2.rex new file mode 100755 index 0000000..8885be1 --- /dev/null +++ b/modules/api/classic/unix/callrexx/startrx2.rex @@ -0,0 +1,65 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* File Name: startrx2.rex */ +/* */ +/* ----------------------------------------------------------------- */ +/* */ +/* Description: script to test the REXX interpreter API */ +/* */ +/*********************************************************************/ + + +tmp = 0 +value = arg() + +say ' ' +say ' Now inside startrx2.rex. The amount of arguments ' +say ' delivered from the calling routine: ' value +say ' ' +say ' ' +do while(value > 0) + tmp = tmp +1 + value = value-1 + say ' content of argument' || tmp ':' arg(tmp) +end +say ' ' + +exit 0 + diff --git a/modules/api/classic/unix/callrexx/startrx3.rex b/modules/api/classic/unix/callrexx/startrx3.rex new file mode 100755 index 0000000..3e7bd38 --- /dev/null +++ b/modules/api/classic/unix/callrexx/startrx3.rex @@ -0,0 +1,67 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* File Name: startrx3.rex */ +/* */ +/* ----------------------------------------------------------------- */ +/* */ +/* Description: script to test the REXX interpreter API */ +/* */ +/*********************************************************************/ + +value_back = '' + +new_queue = rxqueue('create', 'test_queue') +old_queue = rxqueue('set', new_queue) + +address ksh 'ls -al | rxqueue' new_queue + +say 'Open Object Rexx has queued the filenames of the actual directory' +say 'in the queue ' new_queue'. Number of Elements in the queue: ' queued() + +do while queued() > 0 + parse pull element + value_back = value_back || '0A'x || element +end + +call rxqueue 'delete', new_queue +call rxqueue 'set', old_queue + +exit value_back + diff --git a/modules/api/classic/unix/cmake_install.cmake b/modules/api/classic/unix/cmake_install.cmake new file mode 100644 index 0000000..cccf1f5 --- /dev/null +++ b/modules/api/classic/unix/cmake_install.cmake @@ -0,0 +1,123 @@ +# Install script for directory: /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1 + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT) + if(EXISTS "$ENV{DESTDIR}/api/classic/rexxapi1/librexxapi1.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/classic/rexxapi1/librexxapi1.so") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}/api/classic/rexxapi1/librexxapi1.so" + RPATH "") + endif() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi1/librexxapi1.so") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi1" TYPE SHARED_LIBRARY PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE FILES "/home/gmgauthier/Projects/code/rexx/api/classic/unix/librexxapi1.so") + if(EXISTS "$ENV{DESTDIR}/api/classic/rexxapi1/librexxapi1.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/classic/rexxapi1/librexxapi1.so") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/api/classic/rexxapi1/librexxapi1.so") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi1/rexxapi1.c;/api/classic/rexxapi1/readme.txt") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi1" TYPE FILE FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/rexxapi1.c" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/readme.txt" + ) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi1/Makefile.apple;/api/classic/rexxapi1/Makefile.linux") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi1" TYPE FILE FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/Makefile.apple" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/Makefile.linux" + ) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi1/apitest1.rex") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi1" TYPE PROGRAM FILES "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/apitest1.rex") +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/home/gmgauthier/Projects/code/rexx/api/classic/unix/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/modules/api/classic/unix/rexxapi.README b/modules/api/classic/unix/rexxapi.README new file mode 100644 index 0000000..dcafe90 --- /dev/null +++ b/modules/api/classic/unix/rexxapi.README @@ -0,0 +1,66 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +The API samples in the directories rexxapi1, rexxapi2, rexxapi3 demonstrate how to: + +- Register external functions from within external functions +- How you can provide external functions (written in C) in a library that can + be accessed from Open Object Rexx (after they have been registered) +- How data can be returned from external functions +- How the REXX Variable Pool Interface can be used to access and modify Open + Object Rexx variables + +rexxapi1 +======== +Start: "rexx apitest1.rex" +Description: This sample registers a few functions that produce some screen output or + return some data + +rexxapi2 +======== +Start: "rexx apitest2.rex" +Description: Sets the value of a variable by using the Rexx Variable Pool Interface + + +rexxapi3 +======== +Start: "rexx apitest3.rex" +Description: A more extensive use of the Rexx Variable Pool Interface + + +For more information about the Open Object Rexx API read rexxapi.pdf, "Chapter 2. +Classic Rexx Application Programming Interfaces". diff --git a/modules/api/classic/unix/rexxapi1/CMakeLists.txt b/modules/api/classic/unix/rexxapi1/CMakeLists.txt new file mode 100644 index 0000000..c5713ca --- /dev/null +++ b/modules/api/classic/unix/rexxapi1/CMakeLists.txt @@ -0,0 +1,70 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (rexxapi1) + +#################### rexxapi1 (executable) ######################### +# Sources for rexxapi1 +add_library(rexxapi1 SHARED ${PROJECT_SOURCE_DIR}/rexxapi1.c) +# Include file definition +target_include_directories(rexxapi1 PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +# Extra link library definitions +target_link_libraries(rexxapi1 rexx rexxapi) +set_target_properties(rexxapi1 PROPERTIES OUTPUT_NAME "rexxapi1") +install(TARGETS rexxapi1 LIBRARY DESTINATION ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi1 + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE + ) +install(FILES rexxapi1.c readme.txt COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi1) +install(FILES Makefile.apple Makefile.linux COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi1) +install(PROGRAMS ${PROJECT_SOURCE_DIR}/apitest1.rex COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi1) diff --git a/modules/api/classic/unix/rexxapi1/Makefile b/modules/api/classic/unix/rexxapi1/Makefile new file mode 100644 index 0000000..e2ab726 --- /dev/null +++ b/modules/api/classic/unix/rexxapi1/Makefile @@ -0,0 +1,55 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +# A make file that should work on most Unix-like platforms that have gcc + +OOREXX_CFLAGS = -fPIC +OOREXX_LFLAGS = -export-dynamic -shared -nostartfiles + + +# What we want to build. +all: librexxapi1.so + +rexxapi1.o: rexxapi1.c + gcc -c rexxapi1.c $(OOREXX_CFLAGS) -o rexxapi1.o + +librexxapi1.so: rexxapi1.o + gcc rexxapi1.o ${OOREXX_LFLAGS} -o librexxapi1.so + +clean: + rm -f *.so *.o librexxapi1.so + diff --git a/modules/api/classic/unix/rexxapi1/Makefile.apple b/modules/api/classic/unix/rexxapi1/Makefile.apple new file mode 100644 index 0000000..c8280ea --- /dev/null +++ b/modules/api/classic/unix/rexxapi1/Makefile.apple @@ -0,0 +1,55 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +# A make file that should work on most Unix-like platforms that have gcc + +OOREXX_CFLAGS = -fPIC +OOREXX_LFLAGS = -shared -lrexx -lrexxapi + + +# What we want to build. +all: librexxapi1.dylib + +rexxapi1.o: rexxapi1.c + gcc -c rexxapi1.c $(OOREXX_CFLAGS) -o rexxapi1.o + +librexxapi1.dylib: rexxapi1.o + gcc rexxapi1.o ${OOREXX_LFLAGS} -o librexxapi1.dylib + +clean: + rm -f *.so *.o librexxapi1.dylib + diff --git a/modules/api/classic/unix/rexxapi1/Makefile.linux b/modules/api/classic/unix/rexxapi1/Makefile.linux new file mode 100644 index 0000000..e2ab726 --- /dev/null +++ b/modules/api/classic/unix/rexxapi1/Makefile.linux @@ -0,0 +1,55 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +# A make file that should work on most Unix-like platforms that have gcc + +OOREXX_CFLAGS = -fPIC +OOREXX_LFLAGS = -export-dynamic -shared -nostartfiles + + +# What we want to build. +all: librexxapi1.so + +rexxapi1.o: rexxapi1.c + gcc -c rexxapi1.c $(OOREXX_CFLAGS) -o rexxapi1.o + +librexxapi1.so: rexxapi1.o + gcc rexxapi1.o ${OOREXX_LFLAGS} -o librexxapi1.so + +clean: + rm -f *.so *.o librexxapi1.so + diff --git a/modules/api/classic/unix/rexxapi1/apitest1.rex b/modules/api/classic/unix/rexxapi1/apitest1.rex new file mode 100755 index 0000000..a0ea1e7 --- /dev/null +++ b/modules/api/classic/unix/rexxapi1/apitest1.rex @@ -0,0 +1,79 @@ + +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/***************************************************************************/ +/* */ +/* apitest1.rex Open Object Rexx samples */ +/* */ +/* ----------------------------------------------------------------------- */ +/* */ +/* Description: script to test the REXX interpreter API */ +/* */ +/***************************************************************************/ + +say "1a) 'call RxFuncAdd', expecting '0' as result" +Call RxFuncAdd "ApiLoadFuncs", "rexxapi1", "ApiLoadFuncs" +say "1b) result:" result +say "---" + +say "2a) 'call ApiLoadFuncs', null (empty) string expected as result" +Call ApiLoadFuncs +say "2b) result:" result +say "---" + +say "3a) 'call Api_Output_From_C', library version '1.0' expected as result" +call Api_Output_From_C +say "3b) result:" result +say "---" + +say "4a) 'call Api_Output_FROM_REXX', expecting string as result" +call Api_Output_From_REXX +say "4b) result:" result +say "---" + +say "5a) 'res=Api_Exchange_Data(23456,888, a)', expecting '0' as result" +a = 'This is a String' +res=Api_Exchange_Data(23456,888, a) +say "5b) res:" res +say "---" + +say "6a) 'call ApiDeregFunc', no result expected" +call ApiDeregFunc +say "6b) result:" result +say "---" + diff --git a/modules/api/classic/unix/rexxapi1/librexxapi1.so b/modules/api/classic/unix/rexxapi1/librexxapi1.so new file mode 100755 index 0000000000000000000000000000000000000000..ae56aefd49c66d368a6dab2284db8df85ea0e5cc GIT binary patch literal 15000 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 Y+#m@ZtiWqxKKoDWwZR|Aj)~L$-^czZ-2eap literal 0 HcmV?d00001 diff --git a/modules/api/classic/unix/rexxapi1/readme.txt b/modules/api/classic/unix/rexxapi1/readme.txt new file mode 100644 index 0000000..7524374 --- /dev/null +++ b/modules/api/classic/unix/rexxapi1/readme.txt @@ -0,0 +1,20 @@ +To run the sample on Linux you may have to set LD_LIBRARY_PATH, e.g.: + + LD_LIBRARY_PATH=`pwd` rexx apitest1.rex + +or + export LD_LIBRARY_PATH=`pwd` + rexx apitest1.rex + +--- + +To compile on Linux use Makefile.linux: + + make -f Makefile.linux clean + make -f Makefile.linux + +To compile on MacOS use Makefile.apple: + + make -f Makefile.apple clean + make -f Makefile.apple + diff --git a/modules/api/classic/unix/rexxapi1/rexxapi1.c b/modules/api/classic/unix/rexxapi1/rexxapi1.c new file mode 100644 index 0000000..5bffe14 --- /dev/null +++ b/modules/api/classic/unix/rexxapi1/rexxapi1.c @@ -0,0 +1,269 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/***************************************************************************/ +/* */ +/* rexxasp1.c Open Object Rexx samples */ +/* */ +/* ----------------------------------------------------------------------- */ +/* */ +/* Description: functions used by Open Object REXX script */ +/* */ +/***************************************************************************/ + +#include +#include +#include + +#include + +/*********************************************************************/ +/* Numeric Return calls */ +/*********************************************************************/ + +#define INVALID_ROUTINE 40 /* Raise Rexx error */ +#define VALID_ROUTINE 0 /* Successful completion */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*********************************************************************/ +/* ApiFncTable */ +/* Array of names of the REXXASP1 functions. */ +/* This list is used for registration and deregistration. */ +/*********************************************************************/ +static const char *ApiFncTable[] = + { + "Api_Output_From_C", + "Api_Output_From_REXX", + "Api_Exchange_Data", + "ApiDeregFunc" + }; + + +/************************************************************************* +* Function: ApiLoadFuncs * +* * +* Syntax: call ApiLoadFuncs * +* * +* Params: none * +* * +* Return: null string * +*************************************************************************/ + +RexxReturnCode REXXENTRY ApiLoadFuncs( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + int entries; /* Num of entries */ + int j; /* Counter */ + + + entries = sizeof(ApiFncTable)/sizeof(const char *); + + for (j = 0; j < entries; j++) + { + RexxRegisterFunctionDll(ApiFncTable[j], "rexxapi1", ApiFncTable[j]); + } + + retstr->strlength = 0; /* return null string */ + + return VALID_ROUTINE; +} + + + +/************************************************************************* +* Function: ApiDeregFunc * +* * +* Syntax: call ApiDeregFuncs * +* * +* Params: none * +* * +* Return: no return value * +*************************************************************************/ + +RexxReturnCode REXXENTRY ApiDeregFunc( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + int entries; /* Num of entries */ + int j; /* Counter */ + + retstr->strptr = NULL; /* no return value */ + + if (numargs > 0) + return INVALID_ROUTINE; + + + entries = sizeof(ApiFncTable)/sizeof(const char *); + + for (j = 0; j < entries; j++) + { + RexxDeregisterFunction(ApiFncTable[j]); + } + + return VALID_ROUTINE; +} + + + +/************************************************************************* +* Function: Api_Output_From_C * +* * +* Syntax: call Api_Output_From_C * +* * +* Params: none * +* * +* Return: Version of this Api support DLL * +*************************************************************************/ + +RexxReturnCode REXXENTRY Api_Output_From_C( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + + if (numargs > 0) + { + strcpy(retstr->strptr, "Api_OutPut_From_C does not support any Arguments"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + + printf("This Output is generated and displayed by the C-function Api_Output_From_C\n"); + fflush(NULL); + + strcpy(retstr->strptr, "1.0"); /* set return value to be "1.0" */ + retstr->strlength = 3; + + return VALID_ROUTINE; +} + + +/************************************************************************* +* Function: Api_Output_From_REXX * +* * +* Syntax: call Api_Output_From_C * +* * +* Params: none * +* * +* Return: String to be output by Rexx * +*************************************************************************/ + +RexxReturnCode REXXENTRY Api_Output_From_REXX( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + if (numargs > 0) + { + strcpy(retstr->strptr, "Api_Output_From_REXX does not support any Arguments"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + strcpy(retstr->strptr, "This Output is generated by the C-function Api_Output_From_REXX and displayed by REXX"); + retstr->strlength = strlen(retstr->strptr); + + return VALID_ROUTINE; +} + + +/************************************************************************* +* Function: Api_Exchange_Data * +* * +* Syntax: call Api_Exchange_Data startsect, numsects, outbuf * +* * +* Params: parm1 - numeric value given by REXX * +* parm2 - numeric value given by REXX * +* outbuf - variable given by REXX * +* * +* Return: 0 - success, 1 - failure * +*************************************************************************/ + +RexxReturnCode REXXENTRY Api_Exchange_Data( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + int parm1 = 0; + int parm2 = 0; + char outbuf[255]; + + /* we expect 3 arguments */ + + if (numargs != 3 ) + { + printf("Api_Exchange_Data function expects 3 arguments, instead received: %lu\n", numargs); + fflush(NULL); + strcpy(retstr->strptr, "1"); // return failure + retstr->strlength = 1; + return VALID_ROUTINE; + } + + /* read the values from the parameters */ + + parm1 = atoi(args[0].strptr); + parm2 = atoi(args[1].strptr); + strcpy(outbuf, args[2].strptr); + + printf("Api_Exchange_Data function has received following arguments:\n\tArgument 1: %d\n\tArgument 2: %d\n\tArgument 3: %s\n", + parm1, parm2, outbuf); + fflush(NULL); + + strcpy(retstr->strptr, "0"); // return success + retstr->strlength = 1; + + return VALID_ROUTINE; +} + +#ifdef __cplusplus +} +#endif diff --git a/modules/api/classic/unix/rexxapi1/rexxapi1.o b/modules/api/classic/unix/rexxapi1/rexxapi1.o new file mode 100644 index 0000000000000000000000000000000000000000..5015e0241bad713494f13dd3f23eced5ae3c57a5 GIT binary patch literal 4568 zcmbtWU1%Id9G|yVYhS1mw!gX`E_d)OWj@?^xMmx7>RAARvfT1bjb0>NGjA`yxNLCAwbzaAoj1S!`4e|Baw*}Fqp|1di< zzxjX9e`fYfVsIcDi4aKp}Pas#0veK);hn(DXp#JU9~eR@Xc%S_6V(U!_@nc zdi7h#J&{<60Qakj`=`I9)x>pLN0dzA=f?bh`QuB(JCK`Bj4u(kVX6zpcMpU-eWtmm z?a?NF+-x-74ar!6WGq86ASs8JAQ_8baG9`i@L`cw;~jM7Ksld$%Vk4!)@8{7yHre4 z4$E}4#I(diP?9JgF9QEw%6O)<&i06Ew< z`ZAp{thAQSI}mZf7&FtL806v*7Nyf*1i1-t9tm>PBm$+3KfE^t$B}wh7yo(ifO?k~ zcz5AC?`m_<4SJJP(4}d$eHT_T^%5&RbM?tv0K$~iC+~?7ow$nPZBTF3Nng>m)pFq5 z%qu~y39cK9H3M}4Y4_)Ken)VL+u!hPPjZj2s6{*;cK`(V!o*yRSA4LDKCLclv^vy5 zYm>`}dOu4Yv{pl;dI7nsT%q?+9%CIhcns%ZB~4%GLDT?KcOA7=|aIl~Fq zwM?l{D7~Mzva3q>ZQAIcNsDPcpf9b=dqeX+m^)zZ(dkfs|30m2WYo2otM&BheR}tv z7hOK>{h)WR-o5vE0dpJp*uE$gG70EfT!8sb3X_zBiou>LOMK)>QASic#ppGF+0h!3n>Z%apz z0d0SYi$M08^*mqqR~o;_+D`u9Cq2B{*7POET<~W%%ntba25d7R5e3%-#}4SXEBblP z0NVu(^B<F-6TrR@ z_%Ts1d@lgQTdtYiOD*u}7WiBXJh(FS6ka6*R_drRS}<`uSTfRht2ksBu9aakn};K9 zBf|0}>tLa<_U=I@eiN->LmvFqP%buy*#*-gfH)+RDY#CqfvLq^SGMyO%MgQ=@&vS` z%3~y%beNGknM~zQCNoC90AX^9iyqD))F~nNANX{<1)frH+=4g6+!8(N*Z@uHxg+qf z{=XFdjSBx)V!u((V+wvr;HU@f4njlvPT|M1AnjgLaQs7+_yj5d3hPgZdJ5z70+)8> z9k8JAW8F#pzbLqB_eoR?gx%xNB!6!U{2c|~uJF48m;U?)Ye*j{{Hi~nDY)v-yn;Ug z^3or!3_h4X5ekRkisdA6^a)9xIf*~#!vyaiB#FP`Pl+aa^j~ZRN8%y;yqKQ|;qtyY z8^Yy1aWRC;dxGfBSdkf{&@2YyGndTRM$r`R{qIf#4Vc^Tix3A4 z>4w-}f9CVbG4?y5Axj*ZN+-n6Kul~7)(qN_`!DzPS%IrHf_gSKf4aC1T$i*P2B`B< z<>A+j>r`t9b;pGLx6x^Zr2i7y4+CTg+dnH3s!2xChv!(&&GJ{qO9-p7II=$mi*l^;{UGF3498*KEMRy~hx514B7W&V>O#VI8+C@| zmxcTkGAR_6$Nzz5`CAbAs|Z=lAHD-pUgocvZ4~($g92I-0dIvdx)hejHz&OJ0Fh5| a0q7^c3%=p};T_&go}$A*p5F!Eu>8Mc?!5B= literal 0 HcmV?d00001 diff --git a/modules/api/classic/unix/rexxapi2/CMakeLists.txt b/modules/api/classic/unix/rexxapi2/CMakeLists.txt new file mode 100644 index 0000000..5709e05 --- /dev/null +++ b/modules/api/classic/unix/rexxapi2/CMakeLists.txt @@ -0,0 +1,66 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (rexxapi2) + +#################### rexxapi2 (executable) ######################### +# Sources for rexxapi2 +add_library(rexxapi2 SHARED ${PROJECT_SOURCE_DIR}/rexxapi2.c) +# Include file definition +target_include_directories(rexxapi2 PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +# Extra link library definitions +target_link_libraries(rexxapi2 rexx rexxapi) +install(TARGETS rexxapi2 LIBRARY DESTINATION ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi2) +install(FILES rexxapi2.c readme.txt Makefile.linux Makefile.apple COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi2) +install(PROGRAMS ${PROJECT_SOURCE_DIR}/apitest2.rex COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi2) diff --git a/modules/api/classic/unix/rexxapi2/Makefile.apple b/modules/api/classic/unix/rexxapi2/Makefile.apple new file mode 100644 index 0000000..dc89a5b --- /dev/null +++ b/modules/api/classic/unix/rexxapi2/Makefile.apple @@ -0,0 +1,55 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +# A make file that should work on most Unix-like platforms that have gcc + +OOREXX_CFLAGS = -fPIC +OOREXX_LFLAGS = -shared -lrexx -lrexxapi + + +# What we want to build. +all: librexxapi2.dylib + +rexxapi22.o: rexxapi2.c + gcc -c rexxapi2.c $(OOREXX_CFLAGS) -o rexxapi2.o + +librexxapi2.dylib: rexxapi2.o + gcc rexxapi2.o ${OOREXX_LFLAGS} -o librexxapi2.dylib + +clean: + rm -f *.so *.o librexxapi2.dylib + diff --git a/modules/api/classic/unix/rexxapi2/Makefile.linux b/modules/api/classic/unix/rexxapi2/Makefile.linux new file mode 100644 index 0000000..acc5bfe --- /dev/null +++ b/modules/api/classic/unix/rexxapi2/Makefile.linux @@ -0,0 +1,55 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +# A make file that should work on most Unix-like platforms that have gcc + +OOREXX_CFLAGS = -fPIC +OOREXX_LFLAGS = -export-dynamic -shared -nostartfiles + + +# What we want to build. +all: librexxapi2.so + +rexxapi2.o: rexxapi2.c + gcc -c rexxapi2.c $(OOREXX_CFLAGS) -o rexxapi2.o + +librexxapi2.so: rexxapi2.o + gcc rexxapi2.o ${OOREXX_LFLAGS} -o librexxapi2.so + +clean: + rm -f *.so *.o librexxapi2.so + diff --git a/modules/api/classic/unix/rexxapi2/apitest2.rex b/modules/api/classic/unix/rexxapi2/apitest2.rex new file mode 100755 index 0000000..92f8c04 --- /dev/null +++ b/modules/api/classic/unix/rexxapi2/apitest2.rex @@ -0,0 +1,65 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/***************************************************************************/ +/* */ +/* apitest2.rex Open Object Rexx samples */ +/* */ +/* ----------------------------------------------------------------------- */ +/* */ +/* Description: */ +/* */ +/* Object REXX starts a C-function that reads all variables that exist */ +/* in the variable pool of a running REXX program. */ +/* */ +/***************************************************************************/ + +Call RxFuncAdd "ApiLoadFuncs2", "rexxapi2", "ApiLoadFuncs2" +Call ApiLoadFuncs2 + +call Api_Fill_REXX_Variable_Pool "ReadBuf" +Say 'Length of Buffer allocated by the C-function: ' Length(ReadBuf) + +Say 'The C-function Api_Fill_REXX_Variable_Pool has put the following data into the buffer: ' + +Do i = 1 To Length(ReadBuf) + Say 'Position in buffer:' i 'Decimal Value:' C2D(SubStr(ReadBuf, i, 1)) 'Hex Value: ' C2X(SubStr(ReadBuf, i, 1)) +End + +call ApiDeregFunc2 + +exit diff --git a/modules/api/classic/unix/rexxapi2/readme.txt b/modules/api/classic/unix/rexxapi2/readme.txt new file mode 100644 index 0000000..c827cc4 --- /dev/null +++ b/modules/api/classic/unix/rexxapi2/readme.txt @@ -0,0 +1,20 @@ +To run the sample on Linux you may have to set LD_LIBRARY_PATH, e.g.: + + LD_LIBRARY_PATH=`pwd` rexx apitest2.rex + +or + export LD_LIBRARY_PATH=`pwd` + rexx apitest2.rex + +--- + +To compile on Linux use Makefile.linux: + + make -f Makefile.linux clean + make -f Makefile.linux + +To compile on MacOS use Makefile.apple: + + make -f Makefile.apple clean + make -f Makefile.apple + diff --git a/modules/api/classic/unix/rexxapi2/rexxapi2.c b/modules/api/classic/unix/rexxapi2/rexxapi2.c new file mode 100644 index 0000000..31be624 --- /dev/null +++ b/modules/api/classic/unix/rexxapi2/rexxapi2.c @@ -0,0 +1,224 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/***************************************************************************/ +/* */ +/* rexxasp2.c Open Object Rexx samples */ +/* */ +/* ----------------------------------------------------------------------- */ +/* */ +/* Description: functions used by Open Object Rexx script */ +/* */ +/***************************************************************************/ + +#include +#include +#include + +#include + +/*********************************************************************/ +/* Numeric Return calls */ +/*********************************************************************/ + +#define INVALID_ROUTINE 40 /* Raise Rexx error */ +#define VALID_ROUTINE 0 /* Successful completion */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/*********************************************************************/ +/* ApiFncTable */ +/* Array of names of the REXXAPI functions. */ +/* This list is used for registration and deregistration. */ +/*********************************************************************/ +static const char *ApiFncTable[] = + { + "ApiDeregFunc2", + "Api_Fill_REXX_Variable_Pool" + }; + + +/************************************************************************* +* Function: ApiLoadFuncs2 * +* * +* Syntax: call ApiLoadFuncs2 * +* * +* Params: none * +* * +* Return: null string * +*************************************************************************/ + +RexxReturnCode REXXENTRY ApiLoadFuncs2( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + int entries; /* Num of entries */ + int j; /* Counter */ + + + entries = sizeof(ApiFncTable)/sizeof(const char *); + + for (j = 0; j < entries; j++) + { + RexxRegisterFunctionDll(ApiFncTable[j], "rexxapi2", ApiFncTable[j]); + } + return VALID_ROUTINE; +} + + +/************************************************************************* +* Function: ApiDeregFunc2 * +* * +* Syntax: call ApiDeregFuncs2 * +* * +* Params: none * +* * +* Return: null string * +*************************************************************************/ + +RexxReturnCode REXXENTRY ApiDeregFunc2( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + int entries; /* Num of entries */ + int j; /* Counter */ + + retstr->strlength = 0; /* set return value */ + + if (numargs > 0) + return INVALID_ROUTINE; + + + entries = sizeof(ApiFncTable)/sizeof(const char *); + + for (j = 0; j < entries; j++) + { + RexxDeregisterFunction(ApiFncTable[j]); + } + return VALID_ROUTINE; +} + + + +/************************************************************************* +* Function: ApiRead * +* * +* Syntax: call Api_Fill_REXX_Variable_Pool * +* * +* Params: outbuf - variable that will be filled with data * +* Return: 0 - success, 1 - failure * +*************************************************************************/ + +RexxReturnCode REXXENTRY Api_Fill_REXX_Variable_Pool( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + char *outbuf = NULL; + char *ptr; + int i; + SHVBLOCK shvb; + + /* we expect 1 argument */ + + if (numargs != 1 ) /* validate arg count */ + { + strcpy(retstr->strptr, "Api_Fill_REXX_Variable_Pool expects 1 Arguments"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + + /* preset the return value */ + + strcpy(retstr->strptr, "0"); + retstr->strlength = strlen(retstr->strptr); + + outbuf = (char *) malloc(300); + if (outbuf == NULL) + { + strcpy(retstr->strptr, "Api_Fill_REXX_Variable_Pool received a allocation fault"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + + ptr = outbuf; + for (i=0; i<300; i++) + { + *ptr = i % 256; + ptr++; + } + +/* copying the buffer to the Rexx Variable Pool ****************/ + + shvb.shvnext = NULL; + shvb.shvname.strptr = args[0].strptr; + shvb.shvname.strlength = strlen(args[0].strptr); + shvb.shvnamelen = shvb.shvname.strlength; + shvb.shvvalue.strptr = outbuf; + shvb.shvvalue.strlength = 300; + shvb.shvvaluelen = 300; + shvb.shvcode = RXSHV_SYSET; + shvb.shvret = 0; + if (RexxVariablePool(&shvb) == RXSHV_BADN) + { + free(outbuf); + strcpy(retstr->strptr, "1"); + return INVALID_ROUTINE; + } + + free(outbuf); + return VALID_ROUTINE; +} + + +#ifdef __cplusplus +} +#endif + + + diff --git a/modules/api/classic/unix/rexxapi3/CMakeLists.txt b/modules/api/classic/unix/rexxapi3/CMakeLists.txt new file mode 100644 index 0000000..2d83f89 --- /dev/null +++ b/modules/api/classic/unix/rexxapi3/CMakeLists.txt @@ -0,0 +1,66 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (rexxapi3) + +#################### rexxapi3 (executable) ######################### +# Sources for rexxapi3 +add_library(rexxapi3 SHARED ${PROJECT_SOURCE_DIR}/rexxapi3.c) +# Include file definition +target_include_directories(rexxapi3 PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +# Extra link library definitions +target_link_libraries(rexxapi3 rexx rexxapi) +install(TARGETS rexxapi3 LIBRARY DESTINATION ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi3) +install(FILES rexxapi3.c readme.txt Makefile.linux Makefile.apple COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi3) +install(PROGRAMS apitest3.rex COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi3) diff --git a/modules/api/classic/unix/rexxapi3/Makefile.apple b/modules/api/classic/unix/rexxapi3/Makefile.apple new file mode 100644 index 0000000..b10f491 --- /dev/null +++ b/modules/api/classic/unix/rexxapi3/Makefile.apple @@ -0,0 +1,55 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +# A make file that should work on most Unix-like platforms that have gcc + +OOREXX_CFLAGS = -fPIC +OOREXX_LFLAGS = -shared -lrexx -lrexxapi + + +# What we want to build. +all: librexxapi3.dylib + +rexxapi3.o: rexxapi3.c + gcc -c rexxapi3.c $(OOREXX_CFLAGS) -o rexxapi3.o + +librexxapi3.dylib: rexxapi3.o + gcc rexxapi3.o ${OOREXX_LFLAGS} -o librexxapi3.dylib + +clean: + rm -f *.so *.o librexxapi3.dylib + diff --git a/modules/api/classic/unix/rexxapi3/Makefile.linux b/modules/api/classic/unix/rexxapi3/Makefile.linux new file mode 100644 index 0000000..60691d2 --- /dev/null +++ b/modules/api/classic/unix/rexxapi3/Makefile.linux @@ -0,0 +1,55 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +# A make file that should work on most Unix-like platforms that have gcc + +OOREXX_CFLAGS = -fPIC +OOREXX_LFLAGS = -export-dynamic -shared -nostartfiles + + +# What we want to build. +all: librexxapi3.so + +rexxapi3.o: rexxapi3.c + gcc -c rexxapi3.c $(OOREXX_CFLAGS) -o rexxapi3.o + +librexxapi3.so: rexxapi3.o + gcc rexxapi3.o ${OOREXX_LFLAGS} -o librexxapi3.so + +clean: + rm -f *.so *.o librexxapi3.so + diff --git a/modules/api/classic/unix/rexxapi3/apitest3.rex b/modules/api/classic/unix/rexxapi3/apitest3.rex new file mode 100755 index 0000000..9e5bad3 --- /dev/null +++ b/modules/api/classic/unix/rexxapi3/apitest3.rex @@ -0,0 +1,67 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************************/ +/* */ +/* apitest3.rex Open Object Rexx samples */ +/* */ +/* ----------------------------------------------------------------------------- */ +/* */ +/* Description: */ +/* */ +/* REXX calls the Function Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP */ +/* and hands over the name of a stem. The C-function is able to access the */ +/* variable pool of a running Rexx program and read all elements of that stem. */ +/*********************************************************************************/ + +Call RxFuncAdd "ApiLoadFuncs3", "rexxapi3", "ApiLoadFuncs3" +Call ApiLoadFuncs3 + + +do j = 1 to 100 + x.j = j * j +end + +x.0 = 100 + +--call Api_Read_All_Variables_From_REXX_VP + +call Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP("x.0") + +call ApiDeregFunc3 + +exit diff --git a/modules/api/classic/unix/rexxapi3/readme.txt b/modules/api/classic/unix/rexxapi3/readme.txt new file mode 100644 index 0000000..bae5d0c --- /dev/null +++ b/modules/api/classic/unix/rexxapi3/readme.txt @@ -0,0 +1,20 @@ +To run the sample on Linux you may have to set LD_LIBRARY_PATH, e.g.: + + LD_LIBRARY_PATH=`pwd` rexx apitest3.rex + +or + export LD_LIBRARY_PATH=`pwd` + rexx apitest3.rex + +--- + +To compile on Linux use Makefile.linux: + + make -f Makefile.linux clean + make -f Makefile.linux + +To compile on MacOS use Makefile.apple: + + make -f Makefile.apple clean + make -f Makefile.apple + diff --git a/modules/api/classic/unix/rexxapi3/rexxapi3.c b/modules/api/classic/unix/rexxapi3/rexxapi3.c new file mode 100644 index 0000000..3b1dfa3 --- /dev/null +++ b/modules/api/classic/unix/rexxapi3/rexxapi3.c @@ -0,0 +1,368 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/***************************************************************************/ +/* */ +/* rexxapi3.c Open Object Rexx samples */ +/* */ +/* ----------------------------------------------------------------------- */ +/* */ +/* Description: functions used by Open Object Rexx script */ +/* */ +/***************************************************************************/ + +#include +#include +#include + +#include + +/*********************************************************************/ +/* Numeric Return calls */ +/*********************************************************************/ + +#define INVALID_ROUTINE 40 /* Raise Rexx error */ +#define VALID_ROUTINE 0 /* Successful completion */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/*********************************************************************/ +/* ApiFncTable */ +/* Array of names of the REXXAPI functions. */ +/* This list is used for registration and deregistration. */ +/*********************************************************************/ +static const char *ApiFncTable[] = + { + "Api_Exchange_Data", + "ApiDeregFunc3", + "Api_Read_All_Variables_From_REXX_VP", + "Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP" + }; + + +/************************************************************************* +* Function: ApiLoadFuncs * +* * +* Syntax: call ApiLoadFuncs * +* * +* Params: none * +* * +* Return: null string * +*************************************************************************/ + +RexxReturnCode REXXENTRY ApiLoadFuncs3( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + int entries; /* Num of entries */ + int j; /* Counter */ + + + entries = sizeof(ApiFncTable)/sizeof(const char *); + + for (j = 0; j < entries; j++) + { + RexxRegisterFunctionDll(ApiFncTable[j], "rexxapi3", ApiFncTable[j]); + } + return VALID_ROUTINE; +} + + +/************************************************************************* +* Function: ApiDeregFunc * +* * +* Syntax: call ApiDeregFuncs * +* * +* Params: none * +* * +* Return: null string * +*************************************************************************/ + +RexxReturnCode REXXENTRY ApiDeregFunc3( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + int entries; /* Num of entries */ + int j; /* Counter */ + + retstr->strlength = 0; /* set return value */ + + if (numargs > 0) + return INVALID_ROUTINE; + + + entries = sizeof(ApiFncTable)/sizeof(const char *); + + for (j = 0; j < entries; j++) + { + RexxDeregisterFunction(ApiFncTable[j]); + } + return VALID_ROUTINE; +} + +/************************************************************************* +* Function: Api_Read_All_Variables_From_REXX_VP * +* * +* Syntax: call Api_Read_All_Variables_From_REXX_VP * +* * +* Params: No parameter required. The function is called by APITEST. * +* It uses a while loop to read all the variables in the active* +* REXX-variable pool. The shared variable block request code * +* is RXSHV_NEXTV. Be aware that with this request code REXX * +* treads every Stem variable as a variable itself (not the * +* whole stem). This gives the calling C-routine a chance * +* to clear up memory which was previously allocated by REXX * +* for every returned variable. If you don't free memory the * +* system will get out of storage. * +* Be aware that the returned variables are NOT in any spe- * +* cified order. * +* Return: 0 - success, 1 - failure * +*************************************************************************/ + +RexxReturnCode REXXENTRY Api_Read_All_Variables_From_REXX_VP( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + SHVBLOCK *prxshv; + RexxReturnCode rc; + int i = 1; + + strcpy(retstr->strptr, "0"); + retstr->strlength = strlen(retstr->strptr); + + prxshv = (PSHVBLOCK)malloc(sizeof(SHVBLOCK)); + if (!prxshv) + { + strcpy(retstr->strptr, "Allocation error occured"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + prxshv->shvnext = NULL; + prxshv->shvname.strlength = 0; + prxshv->shvname.strptr = NULL; + prxshv->shvvalue.strptr = NULL; /*** let Rexx allocate for me ***/ + prxshv->shvcode = RXSHV_NEXTV; + +/* Now reading all variables from the Rexx-variable pool ***********/ + + rc = RexxVariablePool(prxshv); + if (rc) + { + if (rc != RXSHV_LVAR) + { + printf("ERROR: shvret is %x hex after var nr. %d \n",rc,i); + } + } + + printf("Name of the variable from the Variable Pool: %s, Value: %s \n", prxshv->shvname.strptr, prxshv->shvvalue.strptr); + i++; + + while (!prxshv->shvret) + { + + prxshv->shvnext = (PSHVBLOCK)malloc(sizeof(SHVBLOCK)); + prxshv = prxshv->shvnext; + if (!prxshv) + { + strcpy(retstr->strptr, "Allocation error occured"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + prxshv->shvnext = NULL; + prxshv->shvname.strlength = 0; + prxshv->shvname.strptr = NULL; + prxshv->shvvalue.strptr = NULL; /*** let Rexx allocate for me ***/ + prxshv->shvcode = RXSHV_NEXTV; + rc = RexxVariablePool(prxshv); + if (rc) + { + if (rc== RXSHV_MEMFL) + { + strcpy(retstr->strptr, "Allocation error occured"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + else if (rc != RXSHV_LVAR) + { + printf("ERROR: shvret is %x hex after var nr. %d\n",rc,i); + return INVALID_ROUTINE; + } + } + i++; + printf("Name of the variable from the Variable Pool: %s, Value: %s \n", prxshv->shvname.strptr, prxshv->shvvalue.strptr); + RexxFreeMemory((void *)prxshv->shvname.strptr); + RexxFreeMemory((void *)prxshv->shvvalue.strptr); + } + return VALID_ROUTINE; +} + +/************************************************************************* +* Function: Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP * +* * +* Syntax: call Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP * +* with the stem variable the values should be returned * +* * +* Params: A stem where all values of the stem variables should be * + returned. * +* The shared variable block request code is RXSHV_SYFET. * +* Only ONE call is necessary. If the stem contains to many * +* variables the memory resources are exhausted and Rexx * +* should return RXSHV_MEMFL. There is no change for the * +* calling routine to handle the problem with DosFreeMem * +* because it doesn't get any control before Rexx terminates. * +* The problem is during allocating memory for the values of * +* the stem-variables by DosAllocMem which allocates on 64k * +* boundary. * +* Return: 0 - success, 1 - failure * +*************************************************************************/ + +RexxReturnCode REXXENTRY Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + SHVBLOCK *prxshv, *temp, *interim, rxshv; + RexxReturnCode rc; + char array[20], value[11]; + char *pch, *result; + int chars; + int j, k = 0; + prxshv = &rxshv; + + if (numargs != 1 ) /* validate arg count */ + return INVALID_ROUTINE; + strcpy(retstr->strptr, "0"); + retstr->strlength = strlen(retstr->strptr); + + pch = (char *) malloc(strlen(args[0].strptr) +1); + strcpy(pch, args[0].strptr); + + prxshv->shvnext = NULL; + prxshv->shvname.strlength = strlen(pch); + prxshv->shvname.strptr = pch; + prxshv->shvvalue.strptr = NULL; /*** let Rexx allocate for me ***/ + prxshv->shvcode = RXSHV_SYFET; + + rc = RexxVariablePool(prxshv); + if (rc) + { + strcpy(retstr->strptr, "APIFETCH failed \n"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + + j = atoi(prxshv->shvvalue.strptr); + chars = '.'; + result = strrchr(pch, chars); + result++; + *result = 0x00; + + temp = prxshv; + + memset(array, 0x00, sizeof(array)); + memset(value, 0x00, sizeof(value)); + for (k = 1;k <= j; k++) + { + temp->shvnext = (PSHVBLOCK)malloc(sizeof(SHVBLOCK)); + temp = temp->shvnext; + if (!temp) + { + strcpy(retstr->strptr, "Allocation error occured"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + strcpy(array, pch); + sprintf(value, "%d", k); + strcat(array, value); + temp->shvnext = NULL; + temp->shvname.strlength = strlen(array); + temp->shvname.strptr = (char *) malloc(strlen(array)+1); + strcpy((char *)temp->shvname.strptr, array); + temp->shvvalue.strptr = NULL; /*** let Rexx allocate for me ***/ + temp->shvcode = RXSHV_SYFET; + } + rc = RexxVariablePool(prxshv->shvnext); + if (rc) + { + if (rc== RXSHV_MEMFL) + { + strcpy(retstr->strptr, "Allocation error occured"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + else if (rc != RXSHV_LVAR) + { + printf("ERROR: shvret is %x hex \n",rc); + return INVALID_ROUTINE; + } + } + temp = prxshv->shvnext; + + for (k = 1;k <= j; k++) + { + printf("Name of the Stem-variable from the Rexx Variable Pool: %s, Value: %s \n", temp->shvname.strptr, temp->shvvalue.strptr); + interim = temp; + RexxFreeMemory((void *)temp->shvname.strptr); + RexxFreeMemory((void *)temp->shvvalue.strptr); + temp = temp->shvnext; + free(interim); + } + + RexxFreeMemory((void *)prxshv->shvvalue.strptr); + free(pch); + + return VALID_ROUTINE; +} + +#ifdef __cplusplus +} +#endif + diff --git a/modules/api/classic/unix/trexx b/modules/api/classic/unix/trexx new file mode 100644 index 0000000..5c8ebd4 --- /dev/null +++ b/modules/api/classic/unix/trexx @@ -0,0 +1,47 @@ +#!/usr/bin/sh +#******************************************************************************* +# +# Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. +# Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. +# +# This program and the accompanying materials are made available under +# the terms of the Common Public License v1.0 which accompanies this +# distribution. A copy is also available at the following address: +# https://www.oorexx.org/license.html +# +# Redistribution and use in source and binary forms, with or +# without modification, are permitted provided that the following +# conditions are met: +# +# Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the distribution. +# +# Neither the name of Rexx Language Association nor the names +# of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +#*****************************************************************************/ +#-->>>__open_up_a_window_and_call_rexx_rexxtry.cmd__<<<-- +echo " A window for rexxtry has been started on host $DISPLAY " +if [ $# != 0 ] + then + A="$1 $2 $3 $4 $5 $6 $7 $8 $9 ;say press enter; pull;" +else + A="" +fi; +xterm -ah -rw -sb -T rexxtry -e rexx rexxtry.cmd $A & diff --git a/modules/api/classic/windows/CMakeLists.txt b/modules/api/classic/windows/CMakeLists.txt new file mode 100644 index 0000000..312f800 --- /dev/null +++ b/modules/api/classic/windows/CMakeLists.txt @@ -0,0 +1,62 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (samples-windows-api) + +add_subdirectory (callrxnt) +add_subdirectory (callrxwn) +add_subdirectory (rexxexit) +add_subdirectory (rexxapi1) +add_subdirectory (rexxapi2) +add_subdirectory (rexxapi3) + +install(FILES readme.txt COMPONENT Samples DESTINATION ${INSTALL_SAMPLES_DIR}/api/classic ) diff --git a/modules/api/classic/windows/callrxnt/CMakeLists.txt b/modules/api/classic/windows/callrxnt/CMakeLists.txt new file mode 100644 index 0000000..3ea369c --- /dev/null +++ b/modules/api/classic/windows/callrxnt/CMakeLists.txt @@ -0,0 +1,68 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (callrxnt) + +#################### callrxnt (executable) ######################### +# additional source files required by specific platforms +# Sources for callrxnt +add_executable(callrxnt callrxnt.c callrxnt.ico) +# Include file definition +target_include_directories(callrxnt PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +# Extra link library definitions +target_link_libraries(callrxnt rexx rexxapi) +set (DEST ${INSTALL_SAMPLES_DIR}/api/classic/callrxnt) +install(TARGETS callrxnt RUNTIME COMPONENT Samples DESTINATION ${DEST}) +install(FILES callrxnt.c callrxnt.ico callrxnt.mak COMPONENT Samples DESTINATION ${DEST}) +install(PROGRAMS ${PROJECT_SOURCE_DIR}/backward.fnc COMPONENT Samples DESTINATION ${DEST}) diff --git a/modules/api/classic/windows/callrxnt/backward.fnc b/modules/api/classic/windows/callrxnt/backward.fnc new file mode 100644 index 0000000..979ee6c --- /dev/null +++ b/modules/api/classic/windows/callrxnt/backward.fnc @@ -0,0 +1,58 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* BACKWARD.FNC - Reverse the words in a string */ +/* */ +/* This program is called by CALLRXNT.EXE. */ +/* */ +/* Input: A string of words */ +/* */ +/* Output: A string containing the same words but in opposite order */ +/* */ +/*********************************************************************/ + +Parse Arg Data /* get argument string */ +OutString = '' /* initialize output to empty */ +Count = Words(Data) /* find number of words */ +Do i = Count To 1 By -1 /* for each word in string */ + OutString = OutString Word(Data,i) /* add word to output string*/ + End /* end do */ +Return Strip(OutString) /* return reversed string, */ + /* removing any blanks on the */ + /* front or back. */ diff --git a/modules/api/classic/windows/callrxnt/callrxnt.c b/modules/api/classic/windows/callrxnt/callrxnt.c new file mode 100644 index 0000000..c7a67fd --- /dev/null +++ b/modules/api/classic/windows/callrxnt/callrxnt.c @@ -0,0 +1,102 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* File Name: CALLRXNT.C */ +/* */ +/* Description: Provides a sample call to the REXX */ +/* interpreter, passing in an environment name, */ +/* a file name, and a single argument string. */ +/* */ +/* Entry Points: main - main entry point */ +/* */ +/* Input: None */ +/* */ +/* Output: returns 0 in all cases. */ +/* */ +/*********************************************************************/ + +#include /* needed for RexxStart() */ +#include /* needed for printf() */ +#include /* needed for strlen() */ + +int main() +{ + CONSTRXSTRING arg; /* argument string for REXX */ + RXSTRING rexxretval; /* return value from REXX */ + + char *str = "These words will be swapped"; /* text to swap */ + + RexxReturnCode rc; /* return code from REXX */ + short rexxrc = 0; /* return code from function */ + + printf("\nThis program will call the REXX interpreter "); + printf("to reverse the order of the\n"); + printf("\twords in a string. "); + printf("The interpreter is invoked with an initial\n"); + printf("\tenvironment name of 'FNC' "); + printf("and a file name of 'BACKWARD.FNC'\n\n"); + + /* By setting the strlength of the output RXSTRING to zero, we */ + /* force the interpreter to allocate memory and return it to us. */ + /* We could provide a buffer for the interpreter to use instead. */ + rexxretval.strlength = 0L; /* initialize return to empty*/ + + MAKERXSTRING(arg, str, strlen(str));/* create input argument */ + + /* Here we call the interpreter. */ + rc=RexxStart(1, /* number of arguments */ + &arg, /* array of arguments */ + "BACKWARD.FNC", /* name of REXX file */ + 0, /* No INSTORE used */ + "FNC", /* Command env. name */ + RXSUBROUTINE, /* Code for how invoked */ + 0, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval ); /* Rexx program output */ + + printf("Interpreter Return Code: %d\n", rc); + printf("Function Return Code: %d\n", (int) rexxrc); + printf("Original String: '%s'\n", arg.strptr); + printf("Backwards String: '%s'\n", rexxretval.strptr); + + RexxFreeMemory(rexxretval.strptr); /* Release storage */ + /* given to us by REXX. */ + system("PAUSE"); + return 0; +} diff --git a/modules/api/classic/windows/callrxnt/callrxnt.ico b/modules/api/classic/windows/callrxnt/callrxnt.ico new file mode 100644 index 0000000000000000000000000000000000000000..319507f430cef43436a97f92ab5e13aa456c5d7a GIT binary patch literal 766 zcmah{F-`+95S(xniF8t^sITN1{3@+QL&}u+6?sB7y?=nXOGyV*NL*oNY)sBc1mlc% zXJ>bFrv#YsblnYv*DK(b@s8}sdvbuOkHL2iBn7T)7& zUBJ3@8Jg#PQ+?{6YVGG(#!oWUdfrR>mYQH=-WQj6&l-M%xlB=uvaWspfMx#d`}I8K z_12vK8~hI>^bcR-%Wk!L-fg%0$6@Fhd+I&wYA~QFlpa6dhJ&FIRWJE?KoiMn?Sr~d Je(KQ@;u{=&wPgSR literal 0 HcmV?d00001 diff --git a/modules/api/classic/windows/callrxnt/callrxnt.mak b/modules/api/classic/windows/callrxnt/callrxnt.mak new file mode 100644 index 0000000..4335ad2 --- /dev/null +++ b/modules/api/classic/windows/callrxnt/callrxnt.mak @@ -0,0 +1,65 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +#/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ +# NMAKE-compatible MAKE file to build the REXX sample program CALLRXNT.EXE. +# This example is a console mode application. +# +# Notes: +# - Make sure the path to rexx.lib and rexxapi.lib is in your LIB environment +# variable +# - Make sure the path to rexx.h is in your INCLUDE environment variable +# - Uses /D_CRT_SECURE_NO_DEPRECATE to eliminate deprecation warnings under +# MS Visual Studio 2005 + +!IF DEFINED(REXX_HOME) +INCLUDE = $(INCLUDE);$(REXX_HOME)\api +LIB = $(LIB);$(REXX_HOME)\api +!ENDIF + +all: callrxnt.exe + +callrxnt.exe: callrxnt.obj + link callrxnt.obj \ + /NOLOGO /SUBSYSTEM:Console user32.lib comdlg32.lib gdi32.lib kernel32.lib \ + rexx.lib rexxapi.lib + +callrxnt.obj: callrxnt.c + cl callrxnt.c \ + /nologo /D:_X86_ /DWIN32 /D_CRT_SECURE_NO_DEPRECATE /W3 -c -G3 /I. + +clean: + del *.exe *.dll *.obj *.ilk *.pdb *.lib *.exp *.suo *.cod 1>nul 2>&1 diff --git a/modules/api/classic/windows/callrxwn/CMakeLists.txt b/modules/api/classic/windows/callrxwn/CMakeLists.txt new file mode 100644 index 0000000..26bb507 --- /dev/null +++ b/modules/api/classic/windows/callrxwn/CMakeLists.txt @@ -0,0 +1,68 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (callrxwn) + +#################### callrxwn (executable) ######################### +# Sources for callrxwn +add_executable(callrxwn WIN32 callrxwn.c callrxwn.rc callrxwn.ico) +# Include file definition +target_include_directories(callrxwn PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +# Extra link library definitions +target_link_libraries(callrxwn rexx) +set (DEST ${INSTALL_SAMPLES_DIR}/api/classic/callrxwn) +install(TARGETS callrxwn RUNTIME COMPONENT Samples DESTINATION ${DEST}) +install(FILES callrxwn.c callrxwn.h callrxwn.ico callrxwn.mak callrxwn.rc + COMPONENT Samples DESTINATION ${DEST}) +install(PROGRAMS backward.fnc COMPONENT Samples DESTINATION ${DEST}) diff --git a/modules/api/classic/windows/callrxwn/backward.fnc b/modules/api/classic/windows/callrxwn/backward.fnc new file mode 100644 index 0000000..afee5a6 --- /dev/null +++ b/modules/api/classic/windows/callrxwn/backward.fnc @@ -0,0 +1,58 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* BACKWARD.FNC - Reverse the words in a string */ +/* */ +/* This program is called by CALLRXWN.EXE. */ +/* */ +/* Input: A string of words */ +/* */ +/* Output: A string containing the same words but in opposite order */ +/* */ +/*********************************************************************/ + +Parse Arg Data /* get argument string */ +OutString = '' /* initialize output to empty */ +Count = Words(Data) /* find number of words */ +Do i = Count To 1 By -1 /* for each word in string */ + OutString = OutString Word(Data,i) /* add word to output string */ + End /* end do */ +Return Strip(OutString) /* return reversed string, */ + /* removing any blanks on the */ + /* front or back. */ diff --git a/modules/api/classic/windows/callrxwn/callrxwn.c b/modules/api/classic/windows/callrxwn/callrxwn.c new file mode 100644 index 0000000..87002b9 --- /dev/null +++ b/modules/api/classic/windows/callrxwn/callrxwn.c @@ -0,0 +1,265 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* +/* File Name: CALLRXWN - Windows application +/* +/* Description: Provides a sample call to the REXX +/* interpreter, passing in an environment name, +/* a file name, and a single argument string. +/* +/* A dialog box is created for the output. +/* Note that you must define a REXX standard +/* input and output exit handler for Windows +/* applications. Console applications are +/* not required to do this. +/* +/* +/* Entry Points: main - main entry point +/* RexxIOExit - REXX input and output exit +/* +/* Input: None +/* +/* Output: returns 0 in all cases. +/* +\*********************************************************************/ + +#include /* needed for RexxStart() */ +#include /* needed for printf() */ +#include /* needed for strlen() */ +#include "callrxwn.h" /* prototypes, globals, const */ + +/*********************************************************************\ +* +* function: WinMain() +* +* input parameters: c.f. generic sample +* +\**********************************************************************/ +int REXXENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, + LPSTR lpCmdLine, int nCmdShow) +{ +int ret; + + UNREFERENCED_PARAMETER( hPrevInstance ); + UNREFERENCED_PARAMETER( lpCmdLine ); + UNREFERENCED_PARAMETER( nCmdShow); + // create a dialog box for REXX STDIO + ret = (int)DialogBox (hInstance, MAKEINTRESOURCE(IDD_CALLREXX_DLG), NULL, (DLGPROC)MainDlgProc); + return ret; +} + +/**********************************************************************\ +* +* function: MainDlgProc() +* +* input parameters: standard window procedure parameters. +* +* Description: at initialization time, call CallRexx routine to do +* rexxstart +* +\**********************************************************************/ +LRESULT CALLBACK MainDlgProc(HWND hwnd, WORD msg, WPARAM wParam, LPARAM lParam) +{ + + UNREFERENCED_PARAMETER(lParam); + + + switch (msg) { + + case WM_INITDIALOG: { + gHwnd=hwnd; // Save handle for exits + (VOID)CallRexx(hwnd); // call RexxStart + } break; + + + /******************************************************************\ + * WM_SYSCOMMAND + * + * ignore all syscommand messages, except for SC_CLOSE. + * on this one, call EndDialog(). + \******************************************************************/ + case WM_SYSCOMMAND: + if (wParam == SC_CLOSE) { + EndDialog (hwnd, TRUE); + return TRUE; + } else + return FALSE; + break; + + + default: return FALSE; + } /* end switch(message) */ + return 0; +} + + +/*********************************************************************\ +* function: CallRexx() +* +* Description: Provides a sample call to the REXX +* interpreter, passing in an environment name, +* a file name, and a single argument string. +* +* input parameters: +* hwnd - parent of the list box with the info. +* +* output: +* returns 0 +* +* +\*********************************************************************/ +int CallRexx(HWND hwnd) +{ + + RXSYSEXIT exitlist[9]; /* Exit list array */ + CONSTRXSTRING arg; /* argument string for REXX */ + RXSTRING rexxretval; /* return value from REXX */ + + CHAR *str = "These words will be swapped"; /* text to swap */ + + RexxReturnCode rc; /* return code from REXX */ + SHORT rexxrc = 0; /* return code from function */ + CHAR *chTextOut[]={ + "This program will call the REXX interpreter to reverse ", + " the order of the words in a string. The interpreter ", + " is invoked with an initial environment name of 'FNC'", + " and a file name of 'BACKWARD.FNC'" , + "" , + "Below is the result of invoking the interpreter:" , + "" , + "The example is finished, close the" , + "dialog when convenient." , + "" + }; + SHORT sIndex; /* index into output text */ + + /* put info text on dialog */ + for (sIndex=0; sIndex < 7; sIndex++) { + SendDlgItemMessage (hwnd, IDC_LISTBOX, LB_ADDSTRING, 0, (LPARAM)chTextOut[sIndex] ); + } + + /* By setting the strlength of the output RXSTRING to zero, we */ + /* force the interpreter to allocate memory and return it to us. */ + /* We could provide a buffer for the interpreter to use instead. */ + rexxretval.strlength = 0L; /* initialize return to empty */ + + MAKERXSTRING(arg, str, strlen(str));/* create input argument */ + + /* register exit handler */ + rc = RexxRegisterExitExe("RexxIOExit", + (REXXPFN)&RexxIOExit, /* located at this address */ + NULL); + + /* set up for RXSIO exit */ + exitlist[0].sysexit_name = "RexxIOExit"; + exitlist[0].sysexit_code = RXSIO; + exitlist[1].sysexit_code = RXENDLST; + + /* Here we call the interpreter. */ + rc=RexxStart(1, /* number of arguments */ + &arg, /* array of arguments */ + "BACKWARD.FNC", /* name of REXX file */ + 0, /* No INSTORE used */ + "FNC", /* Command env. name */ + RXSUBROUTINE, /* Code for how invoked */ + exitlist, /* No EXITs on this call */ + &rexxrc, /* Rexx program output */ + &rexxretval); /* Rexx program output */ + + /* send rc info to dialog box */ + wsprintf (chTxtBuffer," %s %d", "Interpreter Return Code:", rc); + SendDlgItemMessage (hwnd, IDC_LISTBOX, LB_ADDSTRING, 0, (LPARAM)chTxtBuffer); + + wsprintf (chTxtBuffer," %s %d", "Function Return Code: ", (int) rexxrc); + SendDlgItemMessage (hwnd, IDC_LISTBOX, LB_ADDSTRING, 0, (LPARAM)chTxtBuffer); + + wsprintf (chTxtBuffer," %s '%s'", "Original String: ", arg.strptr); + SendDlgItemMessage (hwnd, IDC_LISTBOX, LB_ADDSTRING, 0, (LPARAM)chTxtBuffer); + + wsprintf (chTxtBuffer," %s '%s'", "Backwards String: ", rexxretval.strptr); + SendDlgItemMessage (hwnd, IDC_LISTBOX, LB_ADDSTRING, 0, (LPARAM)chTxtBuffer); + + for (sIndex=6; sIndex < 10; sIndex++) { + SendDlgItemMessage (hwnd, IDC_LISTBOX, LB_ADDSTRING, 0, (LPARAM)chTextOut[sIndex] ); + } + + RexxFreeMemory(rexxretval.strptr); /* Release storage */ + /* given to us by REXX. */ + /* remove the exit */ + RexxDeregisterExit("RexxIOExit",NULL); + + return 0; + } + +/*********************************************************************\ +* function: CallRexx() +* +* Description: This is our REXX Standard input and output handler +* +\*********************************************************************/ +int REXXENTRY RexxIOExit( + int ExitNumber, /* code defining exit function*/ + int Subfunction, /* code defining exit subfunc */ + PEXIT parmblock) /* func dependent control bloc*/ +{ + RXSIOSAY_PARM *sparm ; + RXSIOTRC_PARM *tparm ; + + switch (Subfunction) { + case RXSIOSAY: /* write line to standard */ + /* output stream for SAY instr*/ + sparm = ( RXSIOSAY_PARM * )parmblock ; + SendDlgItemMessage (gHwnd, IDC_LISTBOX, LB_ADDSTRING, 0, (LPARAM)sparm->rxsio_string.strptr); + break; + case RXSIOTRC: /* write line to standard */ + /* error stream for trace or */ + /* error messages */ + tparm = ( RXSIOTRC_PARM * )parmblock ; + SendDlgItemMessage (gHwnd, IDC_LISTBOX, LB_ADDSTRING, 0, (LPARAM)tparm->rxsio_string.strptr); + break; + case RXSIOTRD: /* read line from standard */ + /* input stream (PULL) */ + case RXSIODTR: /* read line from standard */ + default: /* input stream for */ + break; /* interactive debug */ + } /* endswitch */ + + return RXEXIT_HANDLED; /* successfully handled */ + +} diff --git a/modules/api/classic/windows/callrxwn/callrxwn.h b/modules/api/classic/windows/callrxwn/callrxwn.h new file mode 100644 index 0000000..cf4a714 --- /dev/null +++ b/modules/api/classic/windows/callrxwn/callrxwn.h @@ -0,0 +1,54 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* function prototypes. Window procedures first. */ +LRESULT CALLBACK MainDlgProc(HWND hwnd, WORD msg, WPARAM wParam, LPARAM lParam); +int CallRexx(HWND hwnd); +int REXXENTRY RexxIOExit(int ExitNumber, int Subfunction, PEXIT ParmBlock); + +/* global for Window Handle */ +HWND gHwnd; + +/* */ +CHAR chTxtBuffer[128]; /* text buffer for formatting */ + +/* IDs for the dialog box. */ +#define IDI_APP_ICON 1 +#define IDD_CALLREXX_DLG 100 +#define IDC_LISTBOX 200 + diff --git a/modules/api/classic/windows/callrxwn/callrxwn.ico b/modules/api/classic/windows/callrxwn/callrxwn.ico new file mode 100644 index 0000000000000000000000000000000000000000..fe6573e30102138fbc41d693a4d8fd1e33e357b6 GIT binary patch literal 766 zcmb7CF;c@Y5Zqu2GUFl@wTFsl@T;_%G^9+4UXdr{((4BdcFJ@NRhYOiy9y$b$%J9$ z)!p8n&Pv9>gsW+05cW5~J>w(UkWb_Ux7-0o?=l=sI?kN}cc!F+nb8>HgJDoca;c>4 zFBs}Ngc=MaU@-0qaY;!>S4jv~2UA0$tg~-1J)e*L*?jgE@CATE`ro=ZEHNclKLJzk z@v=-{U7G(y#OG;VuE+jZYyMq!Ua!ox?)$HKepQ@@^usswRgAUXpZn73=Ph-ct4KF* z7svi>GoQb1*6Zza*R_l-^_F$@7*Hij_lNgxXQ)KgQ{L}T4P;*XpiYz@do+aj0x6FT A%>V!Z literal 0 HcmV?d00001 diff --git a/modules/api/classic/windows/callrxwn/callrxwn.mak b/modules/api/classic/windows/callrxwn/callrxwn.mak new file mode 100644 index 0000000..35622b2 --- /dev/null +++ b/modules/api/classic/windows/callrxwn/callrxwn.mak @@ -0,0 +1,75 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +#/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ +# NMAKE-compatible MAKE file to build REXX sample program callrxwn.exe. +# This example is a Windows mode (GUI) application. +# +# Notes: +# - Make sure the path to rexx.lib and rexxapi.lib is in your LIB environment +# variable +# - Make sure the path to rexx.h is in your INCLUDE environment variable +# - Uses /D_CRT_SECURE_NO_DEPRECATE to eliminate deprecation warnings under +# MS Visual Studio 2005 + +!IF DEFINED(REXX_HOME) +INCLUDE = $(INCLUDE);$(REXX_HOME)\api +LIB = $(LIB);$(REXX_HOME)\api +!ENDIF + +TARGET=callrxwn + +all: $(TARGET).exe + +callrxwn.exe: callrxwn.obj callrxwn.res + link callrxwn.obj callrxwn.res \ + /NOLOGO /SUBSYSTEM:Windows user32.lib gdi32.lib winspool.lib \ + comdlg32.lib advapi32.lib ole32.lib oleaut32.lib uuid.lib \ + shell32.lib kernel32.lib \ + rexx.lib rexxapi.lib + +callrxwn.obj: callrxwn.c + @ECHO Compiling $(@B).c + cl callrxwn.c \ + /nologo /D:_X86_ /DWIN32 /D_CRT_SECURE_NO_DEPRECATE /W3 -c + + +callrxwn.res: callrxwn.rc callrxwn.h + @ECHO ResourceCompiling $(@B).res + rc /DWIN32 -r -fo callrxwn.res callrxwn.rc + +clean: + del *.exe *.dll *.obj *.ilk *.pdb *.lib *.exp *.suo *.cod 1>nul 2>&1 diff --git a/modules/api/classic/windows/callrxwn/callrxwn.rc b/modules/api/classic/windows/callrxwn/callrxwn.rc new file mode 100644 index 0000000..3e496a6 --- /dev/null +++ b/modules/api/classic/windows/callrxwn/callrxwn.rc @@ -0,0 +1,51 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#include +#include "callrxwn.h" + +IDI_APP_ICON ICON "callrxwn.ico" + +// Dialog +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_CALLREXX_DLG DIALOGEX 30, 30, 256, 207 +STYLE DS_MODALFRAME | DS_SETFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU +CAPTION "Call RexxStart" +FONT 10, "Courier", 400, 0, 0 +BEGIN + LISTBOX IDC_LISTBOX, 8, 9, 243, 194, WS_VSCROLL +END diff --git a/modules/api/classic/windows/readme.txt b/modules/api/classic/windows/readme.txt new file mode 100644 index 0000000..9ecd803 --- /dev/null +++ b/modules/api/classic/windows/readme.txt @@ -0,0 +1,134 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +Open Object Rexx API samples + +This is the read me for the three API samples, callrxwn, callrxnt, and +rexxexit. Each sample is installed in its own directory. The wpipe samples +have their own read me file in the wpipe directory. + +The following notes on compiling the samples also apply to the wpipe samples. + +Make files, which are compatible with nmake, are included in each sample +directory so that you can rebuild the samples. In order to use the make files +to build the samples, you must set up the environment variables INCLUDE and +LIB. + +Compilation: +------------ +The environment variable INCLUDE must contain the path to rexx.h as well as +the regular compiler include paths. The rexx.h file is located in the top +level api\ directory of the ooRexx installation. + +Linking: +-------- +The environment variable LIB must contain the path to rexx.lib and rexxapi.lib +as well as the regular compiler library paths. These library files are +included in the same location as rexx.h, that is, in the top level api\ +directory of the ooRexx installation. + +Samples: +-------- + +callrxwn - Windows mode application + + - Provides a sample call to the REXX interpreter, passing + in an environment name, a file name, and a single argument + string. A dialog box is created for the output. + + - Note that you must define a REXX standard input and + output exit handler for a Windows mode application. + This is not necessary for Console mode applications, however. + + +callrxnt - Console mode application + + - Has similar functionality to callrxwn + + - Console mode applications calling Object REXX do not + require input and output exit handlers. + +rexxexit - Console mode application + + - Provides a sample call to the REXX interpreter, passing + in arguments from the command line. A REXX input and + output exit handler is also demonstrated. + + - An example input file, testRexxExit is provided. Using that file + an invocation of rexxexit.exe would look like: + + rexxexit testRexxExit "18 9" + + The two numbers need to be in quotes because rexxexit no more + than two arguments, the input file name and a single argument for + the input file. + +The API samples in the directories WPIPE1, WPIPE2, WPIPE3 demonstrate: + +- How to register external functions from within external functions + +- How you can provide external functions (written in C) in a dynamic link + library that can be accessed from Open Object Rexx (after they have been + registered) + +- How data can be returned from external functions. + +- How the REXX Variable Pool Interface can be used to access and modify Open + Object Rexx variables + +rexxapi1 +======== +Start: "rexx apitest1" +Description: Registers a number of functions that produce some screen output or + return some data. + +rexxapi2 +======== +Start: "rexx apitest2" +Description: Sets the value of a variable by using the REXX Variable Pool + Interface + +rexxapi3 +======== +Start: "rexx apitest3" +Description: Demonstrates a more extensive use of the REXX Variable Pool + Interface + +The demonstrated Open Object Rexx APIs are documented in "Chapter 2. +Classic Rexx Application Programming Interfaces" in rexxapi.pdf, "ooRexx +APIs (Application Programming Interfaces)". + diff --git a/modules/api/classic/windows/rexxapi1/CMakeLists.txt b/modules/api/classic/windows/rexxapi1/CMakeLists.txt new file mode 100644 index 0000000..0689ebc --- /dev/null +++ b/modules/api/classic/windows/rexxapi1/CMakeLists.txt @@ -0,0 +1,68 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (rexxapi1) + +#################### rexxapi1 (executable) ######################### +# Sources for rexxapi1 +add_library(rexxapi1 SHARED rexxapi1.c rexxapi1.def) +# Include file definition +target_include_directories(rexxapi1 PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +# Extra link library definitions +set (DEST ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi1) +target_link_libraries(rexxapi1 rexx rexxapi) +install(TARGETS rexxapi1 RUNTIME COMPONENT Samples DESTINATION ${DEST}) +install(FILES rexxapi1.c rexxapi1.def rexxapi1.mak COMPONENT Samples DESTINATION ${DEST}) +install(PROGRAMS apitest1.rex COMPONENT Samples DESTINATION ${DEST}) + diff --git a/modules/api/classic/windows/rexxapi1/apitest1.rex b/modules/api/classic/windows/rexxapi1/apitest1.rex new file mode 100755 index 0000000..578dab7 --- /dev/null +++ b/modules/api/classic/windows/rexxapi1/apitest1.rex @@ -0,0 +1,56 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: apitest1.rex */ +/* Type: ooRexx Script */ +/* Description: calls the external functions provided in REXXAPI1.DLL */ +/* */ +/****************************************************************************/ +Call RxFuncAdd "ApiLoadFuncs", "REXXAPI1", "ApiLoadFuncs" +Call ApiLoadFuncs + +call Api_Output_From_C + +call Api_Output_From_REXX +say RESULT + +Say Api_Exchange_Data(23456,888,"ReadBuf") + +call ApiDeregFunc + +exit diff --git a/modules/api/classic/windows/rexxapi1/rexxapi1.c b/modules/api/classic/windows/rexxapi1/rexxapi1.c new file mode 100644 index 0000000..aa38cb5 --- /dev/null +++ b/modules/api/classic/windows/rexxapi1/rexxapi1.c @@ -0,0 +1,246 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include + +#include + +#include + +/*********************************************************************/ +/* Numeric Return calls */ +/*********************************************************************/ + +#define INVALID_ROUTINE 40 /* Raise Rexx error */ +#define VALID_ROUTINE 0 /* Successful completion */ + + +/*********************************************************************/ +/* ApiFncTable */ +/* Array of names of the REXXASP1 functions. */ +/* This list is used for registration and deregistration. */ +/*********************************************************************/ +static PSZ ApiFncTable[] = + { + "Api_Output_From_C", + "Api_Output_From_REXX", + "Api_Exchange_Data", + "ApiDeregFunc" + }; + + +/************************************************************************* +* Function: ApiLoadFuncs * +* * +* Syntax: call ApiLoadFuncs * +* * +* Params: none * +* * +* Return: null string * +*************************************************************************/ + +LONG REXXENTRY ApiLoadFuncs( + PSZ name, /* Function name */ + LONG numargs, /* Number of arguments */ + RXSTRING args[], /* Argument array */ + PSZ queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + INT entries; /* Num of entries */ + INT j; /* Counter */ + + + entries = sizeof(ApiFncTable)/sizeof(PSZ); + + for (j = 0; j < entries; j++) + { + RexxRegisterFunctionDll(ApiFncTable[j], + "REXXAPI1", ApiFncTable[j]); + } + return VALID_ROUTINE; +} + + +/************************************************************************* +* Function: ApiDeregFunc * +* * +* Syntax: call ApiDeregFuncs * +* * +* Params: none * +* * +* Return: null string * +*************************************************************************/ + +LONG REXXENTRY ApiDeregFunc( + PSZ name, /* Function name */ + LONG numargs, /* Number of arguments */ + RXSTRING args[], /* Argument array */ + PSZ queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + INT entries; /* Num of entries */ + INT j; /* Counter */ + + retstr->strlength = 0; /* set return value */ + + if (numargs > 0) + return INVALID_ROUTINE; + + + entries = sizeof(ApiFncTable)/sizeof(PSZ); + + for (j = 0; j < entries; j++) + { + RexxDeregisterFunction(ApiFncTable[j]); + } + RexxDeregisterFunction("ApiLoadFuncs"); + return VALID_ROUTINE; +} + + + +/************************************************************************* +* Function: Api_Output_From_C * +* * +* Syntax: call Api_Output_From_C * +* * +* Params: none * +* * +* Return: Version of this API support DLL * +*************************************************************************/ + +LONG REXXENTRY Api_Output_From_C( + PSZ name, /* Function name */ + LONG numargs, /* Number of arguments */ + RXSTRING args[], /* Argument array */ + PSZ queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + + if (numargs > 0) + { + strcpy(retstr->strptr, "Api_OutPut_From_C does not support any arguments"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + + printf("This output was generated and displayed by the C-function Api_Output_From_C\n"); + fflush(NULL); + return VALID_ROUTINE; +} + + +/************************************************************************* +* Function: Api_Output_From_REXX * +* * +* Syntax: call Api_Output_From_REXX * +* * +* Params: none * +* * +* Return: Version of this API support DLL * +*************************************************************************/ + +LONG REXXENTRY Api_Output_From_REXX( + PSZ name, /* Function name */ + LONG numargs, /* Number of arguments */ + RXSTRING args[], /* Argument array */ + PSZ queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + if (numargs > 0) + { + strcpy(retstr->strptr, "Api_OutPut_From_REXX does not support any arguments"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + + strcpy(retstr->strptr, "This output was returned from the C-function Api_Output_From_REXX and is displayed by REXX"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; +} + +/************************************************************************* +* Function: Api_Exchange_Data * +* * +* Syntax: call Api_Exchange_Data startsect, numsects, outbuf * +* * +* Params: parm1 - numeric value given by REXX * +* parm2 - numeric value given by REXX * +* outbuf - variable given by REXX * +* * +* Return: 0 - success, 1 - failure * +*************************************************************************/ + +LONG REXXENTRY Api_Exchange_Data( + PSZ name, /* Function name */ + LONG numargs, /* Number of arguments */ + RXSTRING args[], /* Argument array */ + PSZ queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + int parm1 = 0; + int parm2 = 0; + char outbuf[255]; + + /* we expect 3 arguments */ + + if (numargs != 3 ) + { + strcpy(retstr->strptr, "Api_Exchange_Data function expects 3 arguments"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + + strcpy(retstr->strptr, "\0"); + retstr->strlength = strlen(retstr->strptr); + + /* read the values from the parameters */ + + parm1 = atoi(args[0].strptr); + parm2 = atoi(args[1].strptr); + strcpy(outbuf, args[2].strptr); + + printf("Api_Exchange_Data function has received the following arguments: Argument 1: %d, Argument 2: %d, Argument 3 %s\n", + parm1, parm2, outbuf); + fflush(NULL); + + return VALID_ROUTINE; + +} diff --git a/modules/api/classic/windows/rexxapi1/rexxapi1.def b/modules/api/classic/windows/rexxapi1/rexxapi1.def new file mode 100644 index 0000000..8cb4eb0 --- /dev/null +++ b/modules/api/classic/windows/rexxapi1/rexxapi1.def @@ -0,0 +1,7 @@ +LIBRARY rexxapi1 +EXPORTS + APILOADFUNCS = ApiLoadFuncs + APIDEREGFUNC = ApiDeregFunc + API_OUTPUT_FROM_C = Api_Output_From_C + API_OUTPUT_FROM_REXX = Api_Output_From_REXX + API_EXCHANGE_DATA = Api_Exchange_Data diff --git a/modules/api/classic/windows/rexxapi1/rexxapi1.mak b/modules/api/classic/windows/rexxapi1/rexxapi1.mak new file mode 100644 index 0000000..23faaef --- /dev/null +++ b/modules/api/classic/windows/rexxapi1/rexxapi1.mak @@ -0,0 +1,61 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +#/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ +# NMAKE-compatible MAKE file to build the REXX sample REXXAPI1.DLL +# +# Notes: +# Uses /D_CRT_SECURE_NO_DEPRECATE to eliminate deprecation warnings under +# MS Visual Studio 2005 + +!IF DEFINED(REXX_HOME) +INCLUDE = $(INCLUDE);$(REXX_HOME)\api +LIB = $(LIB);$(REXX_HOME)\api +!ENDIF + +all: rexxapi1.dll + +rexxapi1.dll: rexxapi1.obj + link rexxapi1.obj \ + /NOLOGO user32.lib comdlg32.lib gdi32.lib kernel32.lib \ + rexx.lib rexxapi.lib /DLL /DEF:REXXAPI1.DEF + +rexxapi1.obj: rexxapi1.c + cl rexxapi1.c /nologo /D:_X86_ /DWIN32 /D_CRT_SECURE_NO_DEPRECATE /W3 /I. -c -G3 + +clean: + del *.exe *.dll *.obj *.ilk *.pdb *.lib *.exp *.suo *.cod 1>nul 2>&1 + diff --git a/modules/api/classic/windows/rexxapi2/CMakeLists.txt b/modules/api/classic/windows/rexxapi2/CMakeLists.txt new file mode 100644 index 0000000..e6c3f4d --- /dev/null +++ b/modules/api/classic/windows/rexxapi2/CMakeLists.txt @@ -0,0 +1,68 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (rexxapi2) + +#################### wpipe1 (executable) ######################### +# Sources for rexxapi2 +add_library(rexxapi2 SHARED ${PROJECT_SOURCE_DIR}/rexxapi2.c + ${PROJECT_SOURCE_DIR}/rexxapi2.def) +# Include file definition +target_include_directories(rexxapi2 PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +# Extra link library definitions +target_link_libraries(rexxapi2 rexx rexxapi) +set (DEST ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi2) +install(TARGETS rexxapi2 RUNTIME COMPONENT Samples DESTINATION ${DEST}) +install(FILES rexxapi2.c rexxapi2.def rexxapi2.mak COMPONENT Samples DESTINATION ${DEST}) +install(PROGRAMS apitest2.rex COMPONENT Samples DESTINATION ${DEST}) diff --git a/modules/api/classic/windows/rexxapi2/apitest2.rex b/modules/api/classic/windows/rexxapi2/apitest2.rex new file mode 100755 index 0000000..c63b3fc --- /dev/null +++ b/modules/api/classic/windows/rexxapi2/apitest2.rex @@ -0,0 +1,73 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* Testing the REXX-API *****************************************************************/ +/* */ +/* REXX calls the Function Api_Fill_REXX_Variable_Pool and hands over the name of */ +/* a buffer. The C-function creates a REXX variable with the specified name and */ +/* initializes the variable. REXX is able to access the variable using the buffer name. */ +/* */ +/****************************************************************************************/ + +/****************************************************************************/ +/* Name: apitest2.rex */ +/* Type: ooRexx Script */ +/* Description: */ +/* */ +/* REXX calls the Function Api_Fill_REXX_Variable_Pool and hands over the */ +/* name of a buffer. The C-function creates a REXX variable with the */ +/* specified name and initializes the variable. */ +/* REXX is able to access the variable using the buffer name. */ +/* */ +/****************************************************************************/ + +Call RxFuncAdd "ApiLoadFuncs", "REXXAPI2", "ApiLoadFuncs" +Call ApiLoadFuncs + +call Api_Fill_REXX_Variable_Pool "ReadBuf" +Say 'Length of buffer created by external function: ' Length(ReadBuf) + + +Say 'The C-function Api_Fill_REXX_Variable_Pool has put the following data into the buffer: ' + +Do i = 1 To Length(ReadBuf) + Say 'Position in buffer:' i 'Decimal Value:' C2D(SubStr(ReadBuf, i, 1)) 'Hex Value: ' C2X(SubStr(ReadBuf, i, 1)) +End + +call ApiDeregFunc + +exit diff --git a/modules/api/classic/windows/rexxapi2/rexxapi2.c b/modules/api/classic/windows/rexxapi2/rexxapi2.c new file mode 100644 index 0000000..fd13fbe --- /dev/null +++ b/modules/api/classic/windows/rexxapi2/rexxapi2.c @@ -0,0 +1,207 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include + +#include +#include + +/*********************************************************************/ +/* Numeric Return calls */ +/*********************************************************************/ + +#define INVALID_ROUTINE 40 /* Raise Rexx error */ +#define VALID_ROUTINE 0 /* Successful completion */ + + +/*********************************************************************/ +/* ApiFncTable */ +/* Array of names of the REXXApi functions. */ +/* This list is used for registration and deregistration. */ +/*********************************************************************/ +static PSZ ApiFncTable[] = + { + "Api_Exchange_Data", + "ApiDeregFunc", + "Api_Fill_REXX_Variable_Pool" + }; + + +/************************************************************************* +* Function: ApiLoadFuncs * +* * +* Syntax: call ApiLoadFuncs * +* * +* Params: none * +* * +* Return: null string * +*************************************************************************/ + +LONG REXXENTRY ApiLoadFuncs( + PSZ name, /* Function name */ + LONG numargs, /* Number of arguments */ + RXSTRING args[], /* Argument array */ + PSZ queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + INT entries; /* Num of entries */ + INT j; /* Counter */ + + + entries = sizeof(ApiFncTable)/sizeof(PSZ); + + for (j = 0; j < entries; j++) + { + RexxRegisterFunctionDll(ApiFncTable[j], + "REXXAPI2", ApiFncTable[j]); + } + return VALID_ROUTINE; +} + + +/************************************************************************* +* Function: ApiDeregFunc * +* * +* Syntax: call ApiDeregFuncs * +* * +* Params: none * +* * +* Return: null string * +*************************************************************************/ + +LONG REXXENTRY ApiDeregFunc( + PSZ name, /* Function name */ + LONG numargs, /* Number of arguments */ + RXSTRING args[], /* Argument array */ + PSZ queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + INT entries; /* Num of entries */ + INT j; /* Counter */ + + retstr->strlength = 0; /* set return value */ + + if (numargs > 0) + return INVALID_ROUTINE; + + + entries = sizeof(ApiFncTable)/sizeof(PSZ); + + for (j = 0; j < entries; j++) + { + RexxDeregisterFunction(ApiFncTable[j]); + } + return VALID_ROUTINE; + RexxDeregisterFunction("ApiLoadFuncs"); +} + + + +/************************************************************************* +* Function: ApiRead * +* * +* Syntax: call Api_Fill_REXX_Variable_Pool * +* * +* Params: outbuf - variable that will be filled with data * +* Return: 0 - success, 1 - failure * +*************************************************************************/ + +LONG REXXENTRY Api_Fill_REXX_Variable_Pool( + PSZ name, /* Function name */ + LONG numargs, /* Number of arguments */ + RXSTRING args[], /* Argument array */ + PSZ queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + char *outbuf = NULL; + char *ptr; + int i; + SHVBLOCK shvb; + + /* we expect 1 argument */ + + if (numargs != 1 ) /* validate arg count */ + { + strcpy(retstr->strptr, "Api_Fill_REXX_Variable_Pool expects 1 arguments"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + + /* preset the return value */ + + strcpy(retstr->strptr, "0"); + retstr->strlength = 1; + + outbuf = malloc(300); + if (outbuf == NULL) + { + strcpy(retstr->strptr, "Memory allocation error in Api_Fill_REXX_Variable_Pool!"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + + ptr = outbuf; + for (i=0; i<300; i++) + { + *ptr = i % 256; + ptr++; + } + +/* Create a new variable in the REXX Variable Pool ****************/ + + shvb.shvnext = NULL; + shvb.shvname.strptr = args[0].strptr; + shvb.shvname.strlength = strlen(args[0].strptr); + shvb.shvnamelen = shvb.shvname.strlength; + shvb.shvvalue.strptr = outbuf; + shvb.shvvalue.strlength = 300; + shvb.shvvaluelen = 300; + shvb.shvcode = RXSHV_SYSET; + shvb.shvret = 0; + if (RexxVariablePool(&shvb) == RXSHV_BADN) + { + free(outbuf); + strcpy(retstr->strptr, "1"); + return INVALID_ROUTINE; + } + + free(outbuf); + return VALID_ROUTINE; +} diff --git a/modules/api/classic/windows/rexxapi2/rexxapi2.def b/modules/api/classic/windows/rexxapi2/rexxapi2.def new file mode 100644 index 0000000..4a34b4f --- /dev/null +++ b/modules/api/classic/windows/rexxapi2/rexxapi2.def @@ -0,0 +1,5 @@ +LIBRARY rexxapi2 +EXPORTS + APILOADFUNCS = ApiLoadFuncs + APIDEREGFUNC = ApiDeregFunc + API_FILL_REXX_VARIABLE_POOL = Api_Fill_REXX_Variable_Pool diff --git a/modules/api/classic/windows/rexxapi2/rexxapi2.mak b/modules/api/classic/windows/rexxapi2/rexxapi2.mak new file mode 100644 index 0000000..29dbed2 --- /dev/null +++ b/modules/api/classic/windows/rexxapi2/rexxapi2.mak @@ -0,0 +1,62 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +#/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ +# NMAKE-compatible MAKE file to build the REXX sample program rexxapi2.dll +# +# Notes: +# Uses /D_CRT_SECURE_NO_DEPRECATE to eliminate deprecation warnings under +# MS Visual Studio 2005 + +!IF DEFINED(REXX_HOME) +INCLUDE = $(INCLUDE);$(REXX_HOME)\api +LIB = $(LIB);$(REXX_HOME)\api +!ENDIF + +all: rexxapi2.dll + +rexxapi2.dll: rexxapi2.obj + link rexxapi2.obj \ + /NOLOGO user32.lib comdlg32.lib gdi32.lib kernel32.lib \ + rexx.lib rexxapi.lib /DLL /DEF:REXXAPI2.DEF + +rexxapi2.obj: rexxapi2.c + cl rexxapi2.c /nologo /D:_X86_ /DWIN32 /D_CRT_SECURE_NO_DEPRECATE /W3 /I. -c -G3 + +clean: + del *.exe *.dll *.obj *.ilk *.pdb *.lib *.exp *.suo *.cod 1>nul 2>&1 + + diff --git a/modules/api/classic/windows/rexxapi3/CMakeLists.txt b/modules/api/classic/windows/rexxapi3/CMakeLists.txt new file mode 100644 index 0000000..ccf39fe --- /dev/null +++ b/modules/api/classic/windows/rexxapi3/CMakeLists.txt @@ -0,0 +1,68 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (rexxapi3) + +#################### rexxapi3 (executable) ######################### +# Sources for rexxapi3 +add_library(rexxapi3 SHARED ${PROJECT_SOURCE_DIR}/rexxapi3.c + ${PROJECT_SOURCE_DIR}/rexxapi3.def) +# Include file definition +target_include_directories(rexxapi3 PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +# Extra link library definitions +set (DEST ${INSTALL_SAMPLES_DIR}/api/classic/rexxapi3) +target_link_libraries(rexxapi3 rexx rexxapi) +install(TARGETS rexxapi3 RUNTIME COMPONENT Samples DESTINATION ${DEST}) +install(FILES rexxapi3.c rexxapi3.def rexxapi3.mak COMPONENT Samples DESTINATION ${DEST}) +install(PROGRAMS apitest3.rex COMPONENT Samples DESTINATION ${DEST}) diff --git a/modules/api/classic/windows/rexxapi3/apitest3.rex b/modules/api/classic/windows/rexxapi3/apitest3.rex new file mode 100755 index 0000000..7ba7d37 --- /dev/null +++ b/modules/api/classic/windows/rexxapi3/apitest3.rex @@ -0,0 +1,65 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: apitest3.rex */ +/* Type: ooRexx Script */ +/* Description: */ +/* The function Api_Read_All_Variables_From_REXX_VP reads all variables */ +/* from the REXX Variable Pool one by one. */ +/* The function Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP */ +/* reads all elements of a specific stem located in the REXX variable Pool. */ +/* */ +/****************************************************************************/ + +Call RxFuncAdd "ApiLoadFuncs", "REXXAPI3", "ApiLoadFuncs" +Call ApiLoadFuncs + +do j = 1 to 20 + x.j = j * j +end + +x.0 = 20 +RESULT = 0 + +call Api_Read_All_Variables_From_REXX_VP + +call Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP "x.0" + +call ApiDeregFunc + +exit diff --git a/modules/api/classic/windows/rexxapi3/rexxapi3.c b/modules/api/classic/windows/rexxapi3/rexxapi3.c new file mode 100644 index 0000000..2317605 --- /dev/null +++ b/modules/api/classic/windows/rexxapi3/rexxapi3.c @@ -0,0 +1,347 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include + +#include +#include + +/*********************************************************************/ +/* Numeric Return calls */ +/*********************************************************************/ + +#define INVALID_ROUTINE 40 /* Raise Rexx error */ +#define VALID_ROUTINE 0 /* Successful completion */ + + +/*********************************************************************/ +/* ApiFncTable */ +/* Array of names of the REXXApi functions. */ +/* This list is used for registration and deregistration. */ +/*********************************************************************/ +static PSZ ApiFncTable[] = + { + "Api_Exchange_Data", + "ApiDeregFunc", + "Api_Read_All_Variables_From_REXX_VP", + "Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP" + }; + + +/************************************************************************* +* Function: ApiLoadFuncs * +* * +* Syntax: call ApiLoadFuncs * +* * +* Params: none * +* * +* Return: null string * +*************************************************************************/ + +LONG REXXENTRY ApiLoadFuncs( + PSZ name, /* Function name */ + LONG numargs, /* Number of arguments */ + RXSTRING args[], /* Argument array */ + PSZ queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + INT entries; /* Num of entries */ + INT j; /* Counter */ + + + entries = sizeof(ApiFncTable)/sizeof(PSZ); + + for (j = 0; j < entries; j++) + { + RexxRegisterFunctionDll(ApiFncTable[j], + "REXXAPI3", ApiFncTable[j]); + } + return VALID_ROUTINE; +} + + +/************************************************************************* +* Function: ApiDeregFunc * +* * +* Syntax: call ApiDeregFuncs * +* * +* Params: none * +* * +* Return: null string * +*************************************************************************/ + +LONG REXXENTRY ApiDeregFunc( + PSZ name, /* Function name */ + LONG numargs, /* Number of arguments */ + RXSTRING args[], /* Argument array */ + PSZ queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + INT entries; /* Num of entries */ + INT j; /* Counter */ + + retstr->strlength = 0; /* set return value */ + + if (numargs > 0) + return INVALID_ROUTINE; + + + entries = sizeof(ApiFncTable)/sizeof(PSZ); + + for (j = 0; j < entries; j++) + { + RexxDeregisterFunction(ApiFncTable[j]); + } + RexxDeregisterFunction("ApiLoadFuncs"); + return VALID_ROUTINE; +} + +/************************************************************************* +* Function: Api_Read_All_Variables_From_REXX_VP * +* * +* Syntax: call Api_Read_All_Variables_From_REXX_VP * +* * +* Params: No parameter required. The function is called by Apitest3. * +* It uses a while loop to read all the variables in the active* +* REXX-variable pool. The shared variable block request code * +* is RXSHV_NEXTV. Be aware that with this request code REXX * +* treads every Stem variable as a variable itself (not the * +* whole stem). This gives the calling C-routine a chance * +* to clear up memory which was previously allocated by REXX * +* for every returned variable. If you don't free memory, the * +* system will run out of storage. * +* Be aware that the returned variables are NOT in any spe- * +* cified order. * +*************************************************************************/ + +LONG REXXENTRY Api_Read_All_Variables_From_REXX_VP( + PSZ name, /* Function name */ + LONG numargs, /* Number of arguments */ + RXSTRING args[], /* Argument array */ + PSZ queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + SHVBLOCK rxshv; + SHVBLOCK *prxshv = &rxshv; + RexxReturnCode rc; + int i = 1; + + strcpy(retstr->strptr, "0"); + retstr->strlength = strlen(retstr->strptr); + + prxshv->shvnext = NULL; + prxshv->shvname.strlength = 0; + prxshv->shvname.strptr = NULL; /* let rexx allocate it for me */ + prxshv->shvvalue.strptr = NULL; /* let rexx allocate it for me */ + /* Another way would be to assign an existing buffer and specify its max. length */ + prxshv->shvcode = RXSHV_NEXTV; + +/* Now reading all variables from the REXX-variable pool ***********/ + + rc = RexxVariablePool(prxshv); + if (rc) + { + if (rc != RXSHV_LVAR) + { + printf("ERROR: shvret is %x hex after var nr. %d \n",rc,i); + return INVALID_ROUTINE; + } + } + + if (prxshv->shvvalue.strlength) + printf("Name of the variable from the Variable Pool: %s, Value: %s \n", prxshv->shvname.strptr, prxshv->shvvalue.strptr); + else + printf("Name of the variable from the Variable Pool: %s, Empty\n", prxshv->shvname.strptr); + i++; + RexxFreeMemory((void *)prxshv->shvname.strptr); /* free pointers allocated by REXX */ + RexxFreeMemory(prxshv->shvvalue.strptr); /* free pointers allocated by REXX */ + + while (!prxshv->shvret) + { + prxshv->shvret = 0; + prxshv->shvnext = NULL; + prxshv->shvname.strlength = 0; + prxshv->shvname.strptr = NULL; /* let rexx allocate it for me */ + prxshv->shvvalue.strptr = NULL; /* let rexx allocate it for me */ + prxshv->shvcode = RXSHV_NEXTV; + rc = RexxVariablePool(prxshv); + if (rc) + { + if (rc== RXSHV_MEMFL) + { + strcpy(retstr->strptr, "Allocation error occured"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + else if (rc != RXSHV_LVAR) + { + printf("ERROR: shvret is %x hex after var nr. %d\n",rc,i); + return INVALID_ROUTINE; + } + } + i++; + if (!prxshv->shvret) + { + if (prxshv->shvvalue.strlength) + printf("Name of the variable from the Variable Pool: %s, Value: %s \n", prxshv->shvname.strptr, prxshv->shvvalue.strptr); + else + printf("Name of the variable from the Variable Pool: %s, Empty\n", prxshv->shvname.strptr); + RexxFreeMemory((void *)prxshv->shvname.strptr); /* free pointers allocated by REXX */ + RexxFreeMemory(prxshv->shvvalue.strptr); /* free pointers allocated by REXX */ + } + } + return VALID_ROUTINE; +} + +/************************************************************************* +* Function: Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP * +* * +* Syntax: call Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP * +* with the stem variable the values should be returned * +* * +* Params: A stem where all values of the stem variables should be * +* returned. * +* The shared variable block request code is RXSHV_SYFET. * +* Only ONE call is necessary * +* * +*************************************************************************/ + +LONG REXXENTRY Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP( + PSZ name, /* Function name */ + LONG numargs, /* Number of arguments */ + RXSTRING args[], /* Argument array */ + PSZ queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + SHVBLOCK rxshv; + SHVBLOCK *prxshv = &rxshv, *temp, *interim; + RexxReturnCode rc; + char array[20], value[10]; + char pch[64], *result; + char *varName; + + int chars; + int j, k = 0; + + if (numargs != 1 ) /* validate arg count */ + return INVALID_ROUTINE; + strcpy(retstr->strptr, "0"); + retstr->strlength = strlen(retstr->strptr); + + strncpy(pch, args[0].strptr, 64); + + prxshv->shvnext = NULL; + prxshv->shvname.strptr = pch; /* here we use our own buffer that is limited to 64 characters */ + prxshv->shvname.strlength = strlen(pch); + prxshv->shvvalue.strptr = NULL; /* let rexx allocate for me */ + prxshv->shvcode = RXSHV_SYFET; + + rc = RexxVariablePool(prxshv); + if (rc) + { + strcpy(retstr->strptr, "ApiFETCH failed \n"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + + j = atoi(prxshv->shvvalue.strptr); + + chars = '.'; + result = strrchr(pch, chars); + result++; + *result = 0x00; + + temp = prxshv; + + memset(array, 0x00, sizeof(array)); + memset(value, 0x00, sizeof(value)); + for (k = 1;k <= j; k++) + { + temp->shvnext = (PSHVBLOCK)malloc(sizeof(SHVBLOCK)); /* allocate a new node */ + temp = temp->shvnext; + if (!temp) + { + strcpy(retstr->strptr, "Allocation error occured"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + strcpy(array, pch); + sprintf(value, "%d", k); + strcat(array, value); + temp->shvnext = NULL; + temp->shvname.strlength = strlen(array); + varName = malloc(strlen(array)+1); + strcpy(varName, array); + temp->shvname.strptr = varName; + temp->shvvalue.strptr = NULL; /* let rexx allocate it for me */ + temp->shvcode = RXSHV_SYFET; + } + + temp = prxshv->shvnext; /* first allocated one */ + rc = RexxVariablePool(temp); + if (rc) + { + if (rc== RXSHV_MEMFL) + { + strcpy(retstr->strptr, "Allocation error occured"); + retstr->strlength = strlen(retstr->strptr); + return VALID_ROUTINE; + } + else if (rc != RXSHV_LVAR) + { + printf("ERROR: shvret is %x hex after var nr. %d\n",rc,k); + return INVALID_ROUTINE; + } + } + + for (k = 1;k <= j; k++) + { + printf("Name of the Stem-variable from the Variable Pool: %s, Value: %s \n", temp->shvname.strptr,temp->shvvalue.strptr); + free((void *)temp->shvname.strptr); /* allocated by us and therefore freed with free */ + RexxFreeMemory(temp->shvvalue.strptr); /* allocated by REXX and therefore freed by RexxFreeMemory */ + interim = temp; + temp = temp->shvnext; /* process next in list */ + free(interim); /* free current node */ + } + RexxFreeMemory(prxshv->shvvalue.strptr); /* allocated by REXX and freed by RexxFreeMemory */ + + return VALID_ROUTINE; +} + diff --git a/modules/api/classic/windows/rexxapi3/rexxapi3.def b/modules/api/classic/windows/rexxapi3/rexxapi3.def new file mode 100644 index 0000000..e827f6a --- /dev/null +++ b/modules/api/classic/windows/rexxapi3/rexxapi3.def @@ -0,0 +1,6 @@ +LIBRARY REXXAPI3 +EXPORTS + APILOADFUNCS = ApiLoadFuncs + APIDEREGFUNC = ApiDeregFunc + API_READ_ALL_VARIABLES_FROM_REXX_VP = Api_Read_All_Variables_From_REXX_VP + API_READ_ALL_ELEMENTS_OF_A_SPECIFIC_STEM_FROM_REXX_VP = Api_Read_All_Elements_Of_A_Specific_Stem_From_REXX_VP diff --git a/modules/api/classic/windows/rexxapi3/rexxapi3.mak b/modules/api/classic/windows/rexxapi3/rexxapi3.mak new file mode 100644 index 0000000..f8258b3 --- /dev/null +++ b/modules/api/classic/windows/rexxapi3/rexxapi3.mak @@ -0,0 +1,60 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +#/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ +# NMAKE-compatible MAKE file to build the REXX sample program rexxapi3.dll +# +# Notes: +# Uses /D_CRT_SECURE_NO_DEPRECATE to eliminate deprecation warnings under +# MS Visual Studio 2005 + +!IF DEFINED(REXX_HOME) +INCLUDE = $(INCLUDE);$(REXX_HOME)\api +LIB = $(LIB);$(REXX_HOME)\api +!ENDIF + +all: rexxapi3.dll + +rexxapi3.dll: rexxapi3.obj + link rexxapi3.obj \ + /NOLOGO user32.lib comdlg32.lib gdi32.lib kernel32.lib \ + rexx.lib rexxapi.lib /DLL /DEF:REXXAPI3.DEF + +rexxapi3.obj: rexxapi3.c + cl rexxapi3.c /nologo /D:_X86_ /DWIN32 /D_CRT_SECURE_NO_DEPRECATE /W3 /I. -c -G3 + +clean: + del *.exe *.dll *.obj *.ilk *.pdb *.lib *.exp *.suo *.cod 1>nul 2>&1 diff --git a/modules/api/classic/windows/rexxexit/CMakeLists.txt b/modules/api/classic/windows/rexxexit/CMakeLists.txt new file mode 100644 index 0000000..68ac3e2 --- /dev/null +++ b/modules/api/classic/windows/rexxexit/CMakeLists.txt @@ -0,0 +1,67 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (rexxexit) + +#################### rexxexit (executable) ######################### +# Sources for rexxexit +add_executable(rexxexit rexxexit.c rexxexit.ico) +# Include file definition +target_include_directories(rexxexit PUBLIC + ${build_api_dir} + ${build_api_platform_dir}) +# Extra link library definitions +target_link_libraries(rexxexit rexx rexxapi) +set (DEST ${INSTALL_SAMPLES_DIR}/api/classic/rexxexit) +install(TARGETS rexxexit RUNTIME COMPONENT Samples DESTINATION ${DEST}) +install(FILES rexxexit.c rexxexit.ico rexxexit.mak COMPONENT Samples DESTINATION ${DEST}) +install(PROGRAMS testRexxExit COMPONENT Samples DESTINATION ${DEST}) diff --git a/modules/api/classic/windows/rexxexit/rexxexit.c b/modules/api/classic/windows/rexxexit/rexxexit.c new file mode 100644 index 0000000..e12e1fa --- /dev/null +++ b/modules/api/classic/windows/rexxexit/rexxexit.c @@ -0,0 +1,168 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2018 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*********************************************************************/ +/* */ +/* File Name: REXXEXIT.C */ +/* */ +/* Description: Provides a sample call to the REXX */ +/* interpreter, passing in an environment name, */ +/* a file name, and a single argument string. */ +/* */ +/* Entry Points: main - main entry point */ +/* */ +/* Input: None */ +/* */ +/* Output: returns 0 in all cases. */ +/* */ +/*********************************************************************/ +#include +#include /* needed for RexxStart() */ +#include /* needed for printf() */ +#include /* needed for strlen() */ + +// +// Prototypes +// +int __cdecl main(int argc, char *argv[]); /* main entry point */ +RexxReturnCode REXXENTRY MY_IOEXIT( int ExitNumber, int Subfunction, PEXIT ParmBlock); + +// +// MAIN program +// +int __cdecl main(int argc, char *argv[]) +{ + RXSYSEXIT exit_list[9]; /* Exit list array */ + short rexxrc = 0; /* return code from rexx */ + int rc; /* actually running program RC */ + CONSTRXSTRING argument; /* rexxstart argument */ + RXSTRING rxretbuf; // program return buffer + + rc = 0; /* set default return */ + + /* just one argument is accepted by this program */ + if ((argc < 2) || (argc > 3)) + { + printf("Wrong arguments: REXXEXIT program [argument]\n"); + exit(-1); + } + + /* + * Convert the input array into a single string for the Object REXX + * argument string. Initialize the RXSTRING variable to point to this + * string. Keep the string null terminated so we can print it for debug. + * First argument is name of the REXX program + * Next argument(s) are parameters to be passed + */ + + /* By setting the strlength of the output RXSTRING to zero, we */ + /* force the interpreter to allocate memory and return it to us. */ + /* We could provide a buffer for the interpreter to use instead. */ + rxretbuf.strlength = 0L; /* initialize return to empty*/ + + if (argc == 3) + { + MAKERXSTRING(argument, argv[2], strlen(argv[2]));/* create input argument */ + } + else + MAKERXSTRING(argument, "", 0);/* create blank argument */ + + // register IO exit + rc = RexxRegisterExitExe("MY_IOC", (REXXPFN)&MY_IOEXIT, NULL); + + /* run this via RexxStart */ + exit_list[0].sysexit_name = "MY_IOC"; + exit_list[0].sysexit_code = RXSIO; + exit_list[1].sysexit_code = RXENDLST; + + /* Here we call the interpreter. */ + rc=REXXSTART(1, /* number of arguments */ + &argument, /* array of arguments */ + argv[1], /* name of REXX file */ + NULL, /* No INSTORE used */ + "CMD", /* Command env. name */ + RXCOMMAND, /* Code for how invoked */ + exit_list, /* exits for this call */ + &rexxrc, /* Rexx program output */ + &rxretbuf ); /* Rexx program output */ + + /* free memory allocated for the return result */ + if (rc==0) + { + RexxFreeMemory(rxretbuf.strptr); + } + RexxDeregisterExit("MY_IOC",NULL); // remove the exit in exe exit list + // return interpeter or rexx program return code + return rc ? rc : rexxrc; +} + + +RexxReturnCode REXXENTRY MY_IOEXIT(int ExitNumber, int Subfunction, PEXIT parmblock) +{ + RXSIOSAY_PARM *sparm; + RXSIOTRC_PARM *tparm; + RXSIOTRD_PARM *rparm; + RXSIODTR_PARM *dparm; + + switch (Subfunction) + { + case RXSIOSAY: + sparm = ( RXSIOSAY_PARM * )parmblock ; + printf("%s\n",sparm->rxsio_string.strptr); + break; + case RXSIOTRC: + tparm = ( RXSIOTRC_PARM * )parmblock ; + printf("%s\n",tparm->rxsio_string.strptr); + break; + case RXSIOTRD: + rparm = (RXSIOTRD_PARM * )parmblock ; + gets_s(rparm->rxsiotrd_retc.strptr, rparm->rxsiotrd_retc.strlength); + rparm->rxsiotrd_retc.strlength=strlen(rparm->rxsiotrd_retc.strptr); + break; + case RXSIODTR: + dparm = (RXSIODTR_PARM * )parmblock ; + gets_s(dparm->rxsiodtr_retc.strptr, dparm->rxsiodtr_retc.strlength); + dparm->rxsiodtr_retc.strlength=strlen(dparm->rxsiodtr_retc.strptr); + break; + default: + break; + } + + return RXEXIT_HANDLED; +} + + diff --git a/modules/api/classic/windows/rexxexit/rexxexit.ico b/modules/api/classic/windows/rexxexit/rexxexit.ico new file mode 100644 index 0000000000000000000000000000000000000000..9c9460e1865fb4f5877541033f610cd50b222dc8 GIT binary patch literal 766 zcmaiyu};H45JV@KBGFk26?IBJfe!vEtpx>k)9ud`69^OR9%su0TQW?Wl0r?G15r( zLrSVBK5A+CFCy~1EORhXKt$xKWRFN}u8OjZc^Ng(O4iYDVYjK1f5nH|!Qu^kqu)9j``~&q5rS5*xesHHq)zC&+gkn@n!QgT9ex z=puGG)fR`u|A0kx^|^goj>nJ7`FwS=URTT&dBwg4B9OHbZ$CEcIwGr!rf)U*rAD@) VG~4!`$x=nul 2>&1 + diff --git a/modules/api/classic/windows/rexxexit/testRexxExit b/modules/api/classic/windows/rexxexit/testRexxExit new file mode 100644 index 0000000..6b92c71 --- /dev/null +++ b/modules/api/classic/windows/rexxexit/testRexxExit @@ -0,0 +1,77 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * File Name: testRexxExit + * + * Description: Provides an input file for the rexxexit.exe example. This + * particular input file is designed to be used in the Start Menu + * item that is set up by the Windows installation. However, it + * also serves as an input file when rexxexit is run from the + * command prompt. + */ + +say "Hello World!" +say + +num1 = 6 +num2 = 5 + +if arg(1, 'E') then do + say 'Argument:' arg(1) + parse value arg(1) with n1 n2 . + if n1~datatype('W') then num1 = n1 + if n2~datatype('W') then num2 = n2 + + if arg(1)~words <> 2 | \n1~datatype('W') | \n2~datatype('W') then do + say "The argument should be two numbers, in quotes. I.e.:" + say 'rexxexit testRexxExit "6 5"' + say + end +end +else do + say "No argumet." + say "You could pass in two numbers, in quotes. I.e.:" + say 'rexxexit testRexxExit "6 5"' + say +end + +say num1 "+" num2 "is" (num1 + num2) +say +say 'Press ENTER key to exit...' +pull + diff --git a/modules/api/readme.txt b/modules/api/readme.txt new file mode 100644 index 0000000..9345687 --- /dev/null +++ b/modules/api/readme.txt @@ -0,0 +1,54 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + + +readme.txt +---------- + +This directory contains examples that demonstrate how to interact with ooRexx +via the classic ("SAA") application programming interfaces (APIs) and +the powerful ooRexx C++ APIs introduced with ooRexx 4.0. + +The ooRexx API documentation can be found in rexxapi.pdf: + + Chapter 1. Rexx C++ Application Programming Interfaces + Chapter 2. Classic Rexx Application Programming Interfaces + +Clearly, the subdirectory "c++" demonstrates C++ APIs and the subdirectory +"classic" demonstrates the classic SAA APIs. + diff --git a/modules/c++/CMakeFiles/CMakeDirectoryInformation.cmake b/modules/c++/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..46ef49d --- /dev/null +++ b/modules/c++/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/gmgauthier/Projects/code/rexx/api") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/gmgauthier/Projects/code/rexx") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/modules/c++/CMakeFiles/progress.marks b/modules/c++/CMakeFiles/progress.marks new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/modules/c++/CMakeFiles/progress.marks @@ -0,0 +1 @@ +10 diff --git a/modules/c++/Makefile b/modules/c++/Makefile new file mode 100644 index 0000000..3decabb --- /dev/null +++ b/modules/c++/Makefile @@ -0,0 +1,189 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Samples\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles /home/gmgauthier/Projects/code/rexx/c++//CMakeFiles/progress.marks + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/c++/call.example/CMakeFiles/CMakeDirectoryInformation.cmake b/modules/c++/call.example/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..46ef49d --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/gmgauthier/Projects/code/rexx/api") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/gmgauthier/Projects/code/rexx") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/modules/c++/call.example/CMakeFiles/progress.marks b/modules/c++/call.example/CMakeFiles/progress.marks new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/progress.marks @@ -0,0 +1 @@ +4 diff --git a/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/DependInfo.cmake b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/DependInfo.cmake new file mode 100644 index 0000000..76b9a31 --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/gmgauthier/Projects/code/rexx/api/c++/call.example/runRexxProgram.cpp" "c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o" "gcc" "c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/build.make b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/build.make new file mode 100644 index 0000000..38c3749 --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/build.make @@ -0,0 +1,110 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +# Include any dependencies generated for this target. +include c++/call.example/CMakeFiles/runRexxProgram.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include c++/call.example/CMakeFiles/runRexxProgram.dir/compiler_depend.make + +# Include the progress variables for this target. +include c++/call.example/CMakeFiles/runRexxProgram.dir/progress.make + +# Include the compile flags for this target's objects. +include c++/call.example/CMakeFiles/runRexxProgram.dir/flags.make + +c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o: c++/call.example/CMakeFiles/runRexxProgram.dir/flags.make +c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o: /home/gmgauthier/Projects/code/rexx/api/c++/call.example/runRexxProgram.cpp +c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o: c++/call.example/CMakeFiles/runRexxProgram.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o" + cd /home/gmgauthier/Projects/code/rexx/c++/call.example && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o -MF CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o.d -o CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o -c /home/gmgauthier/Projects/code/rexx/api/c++/call.example/runRexxProgram.cpp + +c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.i" + cd /home/gmgauthier/Projects/code/rexx/c++/call.example && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/gmgauthier/Projects/code/rexx/api/c++/call.example/runRexxProgram.cpp > CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.i + +c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.s" + cd /home/gmgauthier/Projects/code/rexx/c++/call.example && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/gmgauthier/Projects/code/rexx/api/c++/call.example/runRexxProgram.cpp -o CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.s + +# Object files for target runRexxProgram +runRexxProgram_OBJECTS = \ +"CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o" + +# External object files for target runRexxProgram +runRexxProgram_EXTERNAL_OBJECTS = + +c++/call.example/runRexxProgram: c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o +c++/call.example/runRexxProgram: c++/call.example/CMakeFiles/runRexxProgram.dir/build.make +c++/call.example/runRexxProgram: c++/call.example/CMakeFiles/runRexxProgram.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable runRexxProgram" + cd /home/gmgauthier/Projects/code/rexx/c++/call.example && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/runRexxProgram.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +c++/call.example/CMakeFiles/runRexxProgram.dir/build: c++/call.example/runRexxProgram +.PHONY : c++/call.example/CMakeFiles/runRexxProgram.dir/build + +c++/call.example/CMakeFiles/runRexxProgram.dir/clean: + cd /home/gmgauthier/Projects/code/rexx/c++/call.example && $(CMAKE_COMMAND) -P CMakeFiles/runRexxProgram.dir/cmake_clean.cmake +.PHONY : c++/call.example/CMakeFiles/runRexxProgram.dir/clean + +c++/call.example/CMakeFiles/runRexxProgram.dir/depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/gmgauthier/Projects/code/rexx/api /home/gmgauthier/Projects/code/rexx/api/c++/call.example /home/gmgauthier/Projects/code/rexx /home/gmgauthier/Projects/code/rexx/c++/call.example /home/gmgauthier/Projects/code/rexx/c++/call.example/CMakeFiles/runRexxProgram.dir/DependInfo.cmake "--color=$(COLOR)" +.PHONY : c++/call.example/CMakeFiles/runRexxProgram.dir/depend + diff --git a/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/cmake_clean.cmake b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/cmake_clean.cmake new file mode 100644 index 0000000..d2444bc --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o" + "CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o.d" + "runRexxProgram" + "runRexxProgram.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/runRexxProgram.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/compiler_depend.make b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/compiler_depend.make new file mode 100644 index 0000000..9f09d26 --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for runRexxProgram. +# This may be replaced when dependencies are built. diff --git a/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/compiler_depend.ts b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/compiler_depend.ts new file mode 100644 index 0000000..4f2c4df --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for runRexxProgram. diff --git a/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/depend.make b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/depend.make new file mode 100644 index 0000000..29202c2 --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for runRexxProgram. +# This may be replaced when dependencies are built. diff --git a/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/flags.make b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/flags.make new file mode 100644 index 0000000..179c101 --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = + +CXX_INCLUDES = + +CXX_FLAGS = + diff --git a/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/link.txt b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/link.txt new file mode 100644 index 0000000..6ea6d6a --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -rdynamic CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o -o runRexxProgram -lrexx -lrexxapi -lrexx -lrexxapi diff --git a/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/progress.make b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/progress.make new file mode 100644 index 0000000..5a7451d --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/runRexxProgram.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 17 +CMAKE_PROGRESS_2 = 18 + diff --git a/modules/c++/call.example/CMakeFiles/stackOverflow.dir/DependInfo.cmake b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/DependInfo.cmake new file mode 100644 index 0000000..1e3f9b4 --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/gmgauthier/Projects/code/rexx/api/c++/call.example/stackOverflow.cpp" "c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o" "gcc" "c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/modules/c++/call.example/CMakeFiles/stackOverflow.dir/build.make b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/build.make new file mode 100644 index 0000000..cda733f --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/build.make @@ -0,0 +1,110 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +# Include any dependencies generated for this target. +include c++/call.example/CMakeFiles/stackOverflow.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include c++/call.example/CMakeFiles/stackOverflow.dir/compiler_depend.make + +# Include the progress variables for this target. +include c++/call.example/CMakeFiles/stackOverflow.dir/progress.make + +# Include the compile flags for this target's objects. +include c++/call.example/CMakeFiles/stackOverflow.dir/flags.make + +c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o: c++/call.example/CMakeFiles/stackOverflow.dir/flags.make +c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o: /home/gmgauthier/Projects/code/rexx/api/c++/call.example/stackOverflow.cpp +c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o: c++/call.example/CMakeFiles/stackOverflow.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o" + cd /home/gmgauthier/Projects/code/rexx/c++/call.example && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o -MF CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o.d -o CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o -c /home/gmgauthier/Projects/code/rexx/api/c++/call.example/stackOverflow.cpp + +c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/stackOverflow.dir/stackOverflow.cpp.i" + cd /home/gmgauthier/Projects/code/rexx/c++/call.example && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/gmgauthier/Projects/code/rexx/api/c++/call.example/stackOverflow.cpp > CMakeFiles/stackOverflow.dir/stackOverflow.cpp.i + +c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/stackOverflow.dir/stackOverflow.cpp.s" + cd /home/gmgauthier/Projects/code/rexx/c++/call.example && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/gmgauthier/Projects/code/rexx/api/c++/call.example/stackOverflow.cpp -o CMakeFiles/stackOverflow.dir/stackOverflow.cpp.s + +# Object files for target stackOverflow +stackOverflow_OBJECTS = \ +"CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o" + +# External object files for target stackOverflow +stackOverflow_EXTERNAL_OBJECTS = + +c++/call.example/stackOverflow: c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o +c++/call.example/stackOverflow: c++/call.example/CMakeFiles/stackOverflow.dir/build.make +c++/call.example/stackOverflow: c++/call.example/CMakeFiles/stackOverflow.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable stackOverflow" + cd /home/gmgauthier/Projects/code/rexx/c++/call.example && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/stackOverflow.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +c++/call.example/CMakeFiles/stackOverflow.dir/build: c++/call.example/stackOverflow +.PHONY : c++/call.example/CMakeFiles/stackOverflow.dir/build + +c++/call.example/CMakeFiles/stackOverflow.dir/clean: + cd /home/gmgauthier/Projects/code/rexx/c++/call.example && $(CMAKE_COMMAND) -P CMakeFiles/stackOverflow.dir/cmake_clean.cmake +.PHONY : c++/call.example/CMakeFiles/stackOverflow.dir/clean + +c++/call.example/CMakeFiles/stackOverflow.dir/depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/gmgauthier/Projects/code/rexx/api /home/gmgauthier/Projects/code/rexx/api/c++/call.example /home/gmgauthier/Projects/code/rexx /home/gmgauthier/Projects/code/rexx/c++/call.example /home/gmgauthier/Projects/code/rexx/c++/call.example/CMakeFiles/stackOverflow.dir/DependInfo.cmake "--color=$(COLOR)" +.PHONY : c++/call.example/CMakeFiles/stackOverflow.dir/depend + diff --git a/modules/c++/call.example/CMakeFiles/stackOverflow.dir/cmake_clean.cmake b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/cmake_clean.cmake new file mode 100644 index 0000000..40b735d --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o" + "CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o.d" + "stackOverflow" + "stackOverflow.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/stackOverflow.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/modules/c++/call.example/CMakeFiles/stackOverflow.dir/compiler_depend.make b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/compiler_depend.make new file mode 100644 index 0000000..6e9e79b --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for stackOverflow. +# This may be replaced when dependencies are built. diff --git a/modules/c++/call.example/CMakeFiles/stackOverflow.dir/compiler_depend.ts b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/compiler_depend.ts new file mode 100644 index 0000000..8ea33a4 --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for stackOverflow. diff --git a/modules/c++/call.example/CMakeFiles/stackOverflow.dir/depend.make b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/depend.make new file mode 100644 index 0000000..02c305a --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for stackOverflow. +# This may be replaced when dependencies are built. diff --git a/modules/c++/call.example/CMakeFiles/stackOverflow.dir/flags.make b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/flags.make new file mode 100644 index 0000000..179c101 --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = + +CXX_INCLUDES = + +CXX_FLAGS = + diff --git a/modules/c++/call.example/CMakeFiles/stackOverflow.dir/link.txt b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/link.txt new file mode 100644 index 0000000..f9238c3 --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -rdynamic CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o -o stackOverflow -lrexx -lrexxapi diff --git a/modules/c++/call.example/CMakeFiles/stackOverflow.dir/progress.make b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/progress.make new file mode 100644 index 0000000..48b3d8a --- /dev/null +++ b/modules/c++/call.example/CMakeFiles/stackOverflow.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 19 +CMAKE_PROGRESS_2 = 20 + diff --git a/modules/c++/call.example/Makefile b/modules/c++/call.example/Makefile new file mode 100644 index 0000000..43e5031 --- /dev/null +++ b/modules/c++/call.example/Makefile @@ -0,0 +1,273 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Samples\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles /home/gmgauthier/Projects/code/rexx/c++/call.example//CMakeFiles/progress.marks + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/call.example/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/call.example/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/call.example/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/call.example/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +c++/call.example/CMakeFiles/stackOverflow.dir/rule: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/call.example/CMakeFiles/stackOverflow.dir/rule +.PHONY : c++/call.example/CMakeFiles/stackOverflow.dir/rule + +# Convenience name for target. +stackOverflow: c++/call.example/CMakeFiles/stackOverflow.dir/rule +.PHONY : stackOverflow + +# fast build rule for target. +stackOverflow/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/stackOverflow.dir/build.make c++/call.example/CMakeFiles/stackOverflow.dir/build +.PHONY : stackOverflow/fast + +# Convenience name for target. +c++/call.example/CMakeFiles/runRexxProgram.dir/rule: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/call.example/CMakeFiles/runRexxProgram.dir/rule +.PHONY : c++/call.example/CMakeFiles/runRexxProgram.dir/rule + +# Convenience name for target. +runRexxProgram: c++/call.example/CMakeFiles/runRexxProgram.dir/rule +.PHONY : runRexxProgram + +# fast build rule for target. +runRexxProgram/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/runRexxProgram.dir/build.make c++/call.example/CMakeFiles/runRexxProgram.dir/build +.PHONY : runRexxProgram/fast + +runRexxProgram.o: runRexxProgram.cpp.o +.PHONY : runRexxProgram.o + +# target to build an object file +runRexxProgram.cpp.o: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/runRexxProgram.dir/build.make c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.o +.PHONY : runRexxProgram.cpp.o + +runRexxProgram.i: runRexxProgram.cpp.i +.PHONY : runRexxProgram.i + +# target to preprocess a source file +runRexxProgram.cpp.i: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/runRexxProgram.dir/build.make c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.i +.PHONY : runRexxProgram.cpp.i + +runRexxProgram.s: runRexxProgram.cpp.s +.PHONY : runRexxProgram.s + +# target to generate assembly for a file +runRexxProgram.cpp.s: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/runRexxProgram.dir/build.make c++/call.example/CMakeFiles/runRexxProgram.dir/runRexxProgram.cpp.s +.PHONY : runRexxProgram.cpp.s + +stackOverflow.o: stackOverflow.cpp.o +.PHONY : stackOverflow.o + +# target to build an object file +stackOverflow.cpp.o: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/stackOverflow.dir/build.make c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.o +.PHONY : stackOverflow.cpp.o + +stackOverflow.i: stackOverflow.cpp.i +.PHONY : stackOverflow.i + +# target to preprocess a source file +stackOverflow.cpp.i: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/stackOverflow.dir/build.make c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.i +.PHONY : stackOverflow.cpp.i + +stackOverflow.s: stackOverflow.cpp.s +.PHONY : stackOverflow.s + +# target to generate assembly for a file +stackOverflow.cpp.s: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/call.example/CMakeFiles/stackOverflow.dir/build.make c++/call.example/CMakeFiles/stackOverflow.dir/stackOverflow.cpp.s +.PHONY : stackOverflow.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" + @echo "... runRexxProgram" + @echo "... stackOverflow" + @echo "... runRexxProgram.o" + @echo "... runRexxProgram.i" + @echo "... runRexxProgram.s" + @echo "... stackOverflow.o" + @echo "... stackOverflow.i" + @echo "... stackOverflow.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/c++/call.example/cmake_install.cmake b/modules/c++/call.example/cmake_install.cmake new file mode 100644 index 0000000..144d100 --- /dev/null +++ b/modules/c++/call.example/cmake_install.cmake @@ -0,0 +1,180 @@ +# Install script for directory: /home/gmgauthier/Projects/code/rexx/api/c++/call.example + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + if(EXISTS "$ENV{DESTDIR}/api/c++/callsample/stackOverflow" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/c++/callsample/stackOverflow") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}/api/c++/callsample/stackOverflow" + RPATH "") + endif() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/callsample/stackOverflow") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/callsample" TYPE EXECUTABLE PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE FILES "/home/gmgauthier/Projects/code/rexx/c++/call.example/stackOverflow") + if(EXISTS "$ENV{DESTDIR}/api/c++/callsample/stackOverflow" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/c++/callsample/stackOverflow") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/api/c++/callsample/stackOverflow") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/callsample/stackOverflow.cpp") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/callsample" TYPE FILE PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ FILES "/home/gmgauthier/Projects/code/rexx/api/c++/call.example/stackOverflow.cpp") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + if(EXISTS "$ENV{DESTDIR}/api/c++/callsample/runRexxProgram" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/c++/callsample/runRexxProgram") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}/api/c++/callsample/runRexxProgram" + RPATH "") + endif() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/callsample/runRexxProgram") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/callsample" TYPE EXECUTABLE PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE FILES "/home/gmgauthier/Projects/code/rexx/c++/call.example/runRexxProgram") + if(EXISTS "$ENV{DESTDIR}/api/c++/callsample/runRexxProgram" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/c++/callsample/runRexxProgram") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/api/c++/callsample/runRexxProgram") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/callsample/runRexxProgram.cpp") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/callsample" TYPE FILE PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ FILES "/home/gmgauthier/Projects/code/rexx/api/c++/call.example/runRexxProgram.cpp") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/callsample/HelloWorld.rex") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/callsample" TYPE PROGRAM PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ FILES "/home/gmgauthier/Projects/code/rexx/api/c++/call.example/HelloWorld.rex") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/callsample/backward.fnc") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/callsample" TYPE PROGRAM PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ FILES "/home/gmgauthier/Projects/code/rexx/api/c++/call.example/backward.fnc") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/callsample/tooRecursiveTrapped.rex") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/callsample" TYPE PROGRAM PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ FILES "/home/gmgauthier/Projects/code/rexx/api/c++/call.example/tooRecursiveTrapped.rex") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/callsample/tooRecursiveUnhandled.rex") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/callsample" TYPE PROGRAM PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ FILES "/home/gmgauthier/Projects/code/rexx/api/c++/call.example/tooRecursiveUnhandled.rex") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/callsample/readme.txt;/api/c++/callsample/Makefile.windows;/api/c++/callsample/Makefile.unix") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/callsample" TYPE FILE FILES + "/home/gmgauthier/Projects/code/rexx/api/c++/call.example/readme.txt" + "/home/gmgauthier/Projects/code/rexx/api/c++/call.example/Makefile.windows" + "/home/gmgauthier/Projects/code/rexx/api/c++/call.example/Makefile.unix" + ) +endif() + diff --git a/modules/c++/cmake_install.cmake b/modules/c++/cmake_install.cmake new file mode 100644 index 0000000..a06712b --- /dev/null +++ b/modules/c++/cmake_install.cmake @@ -0,0 +1,63 @@ +# Install script for directory: /home/gmgauthier/Projects/code/rexx/api/c++ + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/readme.txt") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++" TYPE FILE FILES "/home/gmgauthier/Projects/code/rexx/api/c++/readme.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/gmgauthier/Projects/code/rexx/c++/call.example/cmake_install.cmake") + include("/home/gmgauthier/Projects/code/rexx/c++/external/cmake_install.cmake") + +endif() + diff --git a/modules/c++/external/CMakeFiles/CMakeDirectoryInformation.cmake b/modules/c++/external/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..46ef49d --- /dev/null +++ b/modules/c++/external/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/gmgauthier/Projects/code/rexx/api") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/gmgauthier/Projects/code/rexx") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/modules/c++/external/CMakeFiles/external_methods.dir/DependInfo.cmake b/modules/c++/external/CMakeFiles/external_methods.dir/DependInfo.cmake new file mode 100644 index 0000000..75cb574 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/gmgauthier/Projects/code/rexx/api/c++/external/external_methods.cpp" "c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.o" "gcc" "c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/modules/c++/external/CMakeFiles/external_methods.dir/build.make b/modules/c++/external/CMakeFiles/external_methods.dir/build.make new file mode 100644 index 0000000..0ad8ef0 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods.dir/build.make @@ -0,0 +1,110 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +# Include any dependencies generated for this target. +include c++/external/CMakeFiles/external_methods.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include c++/external/CMakeFiles/external_methods.dir/compiler_depend.make + +# Include the progress variables for this target. +include c++/external/CMakeFiles/external_methods.dir/progress.make + +# Include the compile flags for this target's objects. +include c++/external/CMakeFiles/external_methods.dir/flags.make + +c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.o: c++/external/CMakeFiles/external_methods.dir/flags.make +c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.o: /home/gmgauthier/Projects/code/rexx/api/c++/external/external_methods.cpp +c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.o: c++/external/CMakeFiles/external_methods.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.o" + cd /home/gmgauthier/Projects/code/rexx/c++/external && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.o -MF CMakeFiles/external_methods.dir/external_methods.cpp.o.d -o CMakeFiles/external_methods.dir/external_methods.cpp.o -c /home/gmgauthier/Projects/code/rexx/api/c++/external/external_methods.cpp + +c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/external_methods.dir/external_methods.cpp.i" + cd /home/gmgauthier/Projects/code/rexx/c++/external && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/gmgauthier/Projects/code/rexx/api/c++/external/external_methods.cpp > CMakeFiles/external_methods.dir/external_methods.cpp.i + +c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/external_methods.dir/external_methods.cpp.s" + cd /home/gmgauthier/Projects/code/rexx/c++/external && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/gmgauthier/Projects/code/rexx/api/c++/external/external_methods.cpp -o CMakeFiles/external_methods.dir/external_methods.cpp.s + +# Object files for target external_methods +external_methods_OBJECTS = \ +"CMakeFiles/external_methods.dir/external_methods.cpp.o" + +# External object files for target external_methods +external_methods_EXTERNAL_OBJECTS = + +c++/external/libexternal_methods.so: c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.o +c++/external/libexternal_methods.so: c++/external/CMakeFiles/external_methods.dir/build.make +c++/external/libexternal_methods.so: c++/external/CMakeFiles/external_methods.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX shared library libexternal_methods.so" + cd /home/gmgauthier/Projects/code/rexx/c++/external && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/external_methods.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +c++/external/CMakeFiles/external_methods.dir/build: c++/external/libexternal_methods.so +.PHONY : c++/external/CMakeFiles/external_methods.dir/build + +c++/external/CMakeFiles/external_methods.dir/clean: + cd /home/gmgauthier/Projects/code/rexx/c++/external && $(CMAKE_COMMAND) -P CMakeFiles/external_methods.dir/cmake_clean.cmake +.PHONY : c++/external/CMakeFiles/external_methods.dir/clean + +c++/external/CMakeFiles/external_methods.dir/depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/gmgauthier/Projects/code/rexx/api /home/gmgauthier/Projects/code/rexx/api/c++/external /home/gmgauthier/Projects/code/rexx /home/gmgauthier/Projects/code/rexx/c++/external /home/gmgauthier/Projects/code/rexx/c++/external/CMakeFiles/external_methods.dir/DependInfo.cmake "--color=$(COLOR)" +.PHONY : c++/external/CMakeFiles/external_methods.dir/depend + diff --git a/modules/c++/external/CMakeFiles/external_methods.dir/cmake_clean.cmake b/modules/c++/external/CMakeFiles/external_methods.dir/cmake_clean.cmake new file mode 100644 index 0000000..188a8a7 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/external_methods.dir/external_methods.cpp.o" + "CMakeFiles/external_methods.dir/external_methods.cpp.o.d" + "libexternal_methods.pdb" + "libexternal_methods.so" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/external_methods.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/modules/c++/external/CMakeFiles/external_methods.dir/compiler_depend.make b/modules/c++/external/CMakeFiles/external_methods.dir/compiler_depend.make new file mode 100644 index 0000000..4082ae1 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for external_methods. +# This may be replaced when dependencies are built. diff --git a/modules/c++/external/CMakeFiles/external_methods.dir/compiler_depend.ts b/modules/c++/external/CMakeFiles/external_methods.dir/compiler_depend.ts new file mode 100644 index 0000000..502acc4 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for external_methods. diff --git a/modules/c++/external/CMakeFiles/external_methods.dir/depend.make b/modules/c++/external/CMakeFiles/external_methods.dir/depend.make new file mode 100644 index 0000000..75805d9 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for external_methods. +# This may be replaced when dependencies are built. diff --git a/modules/c++/external/CMakeFiles/external_methods.dir/flags.make b/modules/c++/external/CMakeFiles/external_methods.dir/flags.make new file mode 100644 index 0000000..d433a2f --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -Dexternal_methods_EXPORTS + +CXX_INCLUDES = + +CXX_FLAGS = -fPIC + diff --git a/modules/c++/external/CMakeFiles/external_methods.dir/link.txt b/modules/c++/external/CMakeFiles/external_methods.dir/link.txt new file mode 100644 index 0000000..be05c16 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -fPIC -shared -Wl,-soname,libexternal_methods.so -o libexternal_methods.so CMakeFiles/external_methods.dir/external_methods.cpp.o -lrexxapi diff --git a/modules/c++/external/CMakeFiles/external_methods.dir/progress.make b/modules/c++/external/CMakeFiles/external_methods.dir/progress.make new file mode 100644 index 0000000..3a86673 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 5 +CMAKE_PROGRESS_2 = 6 + diff --git a/modules/c++/external/CMakeFiles/external_methods_routines.dir/DependInfo.cmake b/modules/c++/external/CMakeFiles/external_methods_routines.dir/DependInfo.cmake new file mode 100644 index 0000000..83b7ac1 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods_routines.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/gmgauthier/Projects/code/rexx/api/c++/external/external_methods_routines.cpp" "c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o" "gcc" "c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/modules/c++/external/CMakeFiles/external_methods_routines.dir/build.make b/modules/c++/external/CMakeFiles/external_methods_routines.dir/build.make new file mode 100644 index 0000000..bb71185 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods_routines.dir/build.make @@ -0,0 +1,110 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +# Include any dependencies generated for this target. +include c++/external/CMakeFiles/external_methods_routines.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include c++/external/CMakeFiles/external_methods_routines.dir/compiler_depend.make + +# Include the progress variables for this target. +include c++/external/CMakeFiles/external_methods_routines.dir/progress.make + +# Include the compile flags for this target's objects. +include c++/external/CMakeFiles/external_methods_routines.dir/flags.make + +c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o: c++/external/CMakeFiles/external_methods_routines.dir/flags.make +c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o: /home/gmgauthier/Projects/code/rexx/api/c++/external/external_methods_routines.cpp +c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o: c++/external/CMakeFiles/external_methods_routines.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o" + cd /home/gmgauthier/Projects/code/rexx/c++/external && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o -MF CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o.d -o CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o -c /home/gmgauthier/Projects/code/rexx/api/c++/external/external_methods_routines.cpp + +c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.i" + cd /home/gmgauthier/Projects/code/rexx/c++/external && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/gmgauthier/Projects/code/rexx/api/c++/external/external_methods_routines.cpp > CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.i + +c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.s" + cd /home/gmgauthier/Projects/code/rexx/c++/external && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/gmgauthier/Projects/code/rexx/api/c++/external/external_methods_routines.cpp -o CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.s + +# Object files for target external_methods_routines +external_methods_routines_OBJECTS = \ +"CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o" + +# External object files for target external_methods_routines +external_methods_routines_EXTERNAL_OBJECTS = + +c++/external/libexternal_methods_routines.so: c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o +c++/external/libexternal_methods_routines.so: c++/external/CMakeFiles/external_methods_routines.dir/build.make +c++/external/libexternal_methods_routines.so: c++/external/CMakeFiles/external_methods_routines.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX shared library libexternal_methods_routines.so" + cd /home/gmgauthier/Projects/code/rexx/c++/external && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/external_methods_routines.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +c++/external/CMakeFiles/external_methods_routines.dir/build: c++/external/libexternal_methods_routines.so +.PHONY : c++/external/CMakeFiles/external_methods_routines.dir/build + +c++/external/CMakeFiles/external_methods_routines.dir/clean: + cd /home/gmgauthier/Projects/code/rexx/c++/external && $(CMAKE_COMMAND) -P CMakeFiles/external_methods_routines.dir/cmake_clean.cmake +.PHONY : c++/external/CMakeFiles/external_methods_routines.dir/clean + +c++/external/CMakeFiles/external_methods_routines.dir/depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/gmgauthier/Projects/code/rexx/api /home/gmgauthier/Projects/code/rexx/api/c++/external /home/gmgauthier/Projects/code/rexx /home/gmgauthier/Projects/code/rexx/c++/external /home/gmgauthier/Projects/code/rexx/c++/external/CMakeFiles/external_methods_routines.dir/DependInfo.cmake "--color=$(COLOR)" +.PHONY : c++/external/CMakeFiles/external_methods_routines.dir/depend + diff --git a/modules/c++/external/CMakeFiles/external_methods_routines.dir/cmake_clean.cmake b/modules/c++/external/CMakeFiles/external_methods_routines.dir/cmake_clean.cmake new file mode 100644 index 0000000..81df358 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods_routines.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o" + "CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o.d" + "libexternal_methods_routines.pdb" + "libexternal_methods_routines.so" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/external_methods_routines.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/modules/c++/external/CMakeFiles/external_methods_routines.dir/compiler_depend.make b/modules/c++/external/CMakeFiles/external_methods_routines.dir/compiler_depend.make new file mode 100644 index 0000000..f997a70 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods_routines.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for external_methods_routines. +# This may be replaced when dependencies are built. diff --git a/modules/c++/external/CMakeFiles/external_methods_routines.dir/compiler_depend.ts b/modules/c++/external/CMakeFiles/external_methods_routines.dir/compiler_depend.ts new file mode 100644 index 0000000..81ffa4a --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods_routines.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for external_methods_routines. diff --git a/modules/c++/external/CMakeFiles/external_methods_routines.dir/depend.make b/modules/c++/external/CMakeFiles/external_methods_routines.dir/depend.make new file mode 100644 index 0000000..be76d7b --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods_routines.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for external_methods_routines. +# This may be replaced when dependencies are built. diff --git a/modules/c++/external/CMakeFiles/external_methods_routines.dir/flags.make b/modules/c++/external/CMakeFiles/external_methods_routines.dir/flags.make new file mode 100644 index 0000000..4432e48 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods_routines.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -Dexternal_methods_routines_EXPORTS + +CXX_INCLUDES = + +CXX_FLAGS = -fPIC + diff --git a/modules/c++/external/CMakeFiles/external_methods_routines.dir/link.txt b/modules/c++/external/CMakeFiles/external_methods_routines.dir/link.txt new file mode 100644 index 0000000..5eec5ac --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods_routines.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -fPIC -shared -Wl,-soname,libexternal_methods_routines.so -o libexternal_methods_routines.so CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o -lrexxapi diff --git a/modules/c++/external/CMakeFiles/external_methods_routines.dir/progress.make b/modules/c++/external/CMakeFiles/external_methods_routines.dir/progress.make new file mode 100644 index 0000000..72bb7dd --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_methods_routines.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 7 +CMAKE_PROGRESS_2 = 8 + diff --git a/modules/c++/external/CMakeFiles/external_routines.dir/DependInfo.cmake b/modules/c++/external/CMakeFiles/external_routines.dir/DependInfo.cmake new file mode 100644 index 0000000..5e3a4d5 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_routines.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/gmgauthier/Projects/code/rexx/api/c++/external/external_routines.cpp" "c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.o" "gcc" "c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/modules/c++/external/CMakeFiles/external_routines.dir/build.make b/modules/c++/external/CMakeFiles/external_routines.dir/build.make new file mode 100644 index 0000000..d214a3c --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_routines.dir/build.make @@ -0,0 +1,110 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +# Include any dependencies generated for this target. +include c++/external/CMakeFiles/external_routines.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include c++/external/CMakeFiles/external_routines.dir/compiler_depend.make + +# Include the progress variables for this target. +include c++/external/CMakeFiles/external_routines.dir/progress.make + +# Include the compile flags for this target's objects. +include c++/external/CMakeFiles/external_routines.dir/flags.make + +c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.o: c++/external/CMakeFiles/external_routines.dir/flags.make +c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.o: /home/gmgauthier/Projects/code/rexx/api/c++/external/external_routines.cpp +c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.o: c++/external/CMakeFiles/external_routines.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.o" + cd /home/gmgauthier/Projects/code/rexx/c++/external && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.o -MF CMakeFiles/external_routines.dir/external_routines.cpp.o.d -o CMakeFiles/external_routines.dir/external_routines.cpp.o -c /home/gmgauthier/Projects/code/rexx/api/c++/external/external_routines.cpp + +c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/external_routines.dir/external_routines.cpp.i" + cd /home/gmgauthier/Projects/code/rexx/c++/external && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/gmgauthier/Projects/code/rexx/api/c++/external/external_routines.cpp > CMakeFiles/external_routines.dir/external_routines.cpp.i + +c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/external_routines.dir/external_routines.cpp.s" + cd /home/gmgauthier/Projects/code/rexx/c++/external && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/gmgauthier/Projects/code/rexx/api/c++/external/external_routines.cpp -o CMakeFiles/external_routines.dir/external_routines.cpp.s + +# Object files for target external_routines +external_routines_OBJECTS = \ +"CMakeFiles/external_routines.dir/external_routines.cpp.o" + +# External object files for target external_routines +external_routines_EXTERNAL_OBJECTS = + +c++/external/libexternal_routines.so: c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.o +c++/external/libexternal_routines.so: c++/external/CMakeFiles/external_routines.dir/build.make +c++/external/libexternal_routines.so: c++/external/CMakeFiles/external_routines.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX shared library libexternal_routines.so" + cd /home/gmgauthier/Projects/code/rexx/c++/external && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/external_routines.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +c++/external/CMakeFiles/external_routines.dir/build: c++/external/libexternal_routines.so +.PHONY : c++/external/CMakeFiles/external_routines.dir/build + +c++/external/CMakeFiles/external_routines.dir/clean: + cd /home/gmgauthier/Projects/code/rexx/c++/external && $(CMAKE_COMMAND) -P CMakeFiles/external_routines.dir/cmake_clean.cmake +.PHONY : c++/external/CMakeFiles/external_routines.dir/clean + +c++/external/CMakeFiles/external_routines.dir/depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/gmgauthier/Projects/code/rexx/api /home/gmgauthier/Projects/code/rexx/api/c++/external /home/gmgauthier/Projects/code/rexx /home/gmgauthier/Projects/code/rexx/c++/external /home/gmgauthier/Projects/code/rexx/c++/external/CMakeFiles/external_routines.dir/DependInfo.cmake "--color=$(COLOR)" +.PHONY : c++/external/CMakeFiles/external_routines.dir/depend + diff --git a/modules/c++/external/CMakeFiles/external_routines.dir/cmake_clean.cmake b/modules/c++/external/CMakeFiles/external_routines.dir/cmake_clean.cmake new file mode 100644 index 0000000..84d169f --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_routines.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/external_routines.dir/external_routines.cpp.o" + "CMakeFiles/external_routines.dir/external_routines.cpp.o.d" + "libexternal_routines.pdb" + "libexternal_routines.so" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/external_routines.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/modules/c++/external/CMakeFiles/external_routines.dir/compiler_depend.make b/modules/c++/external/CMakeFiles/external_routines.dir/compiler_depend.make new file mode 100644 index 0000000..9feff1d --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_routines.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for external_routines. +# This may be replaced when dependencies are built. diff --git a/modules/c++/external/CMakeFiles/external_routines.dir/compiler_depend.ts b/modules/c++/external/CMakeFiles/external_routines.dir/compiler_depend.ts new file mode 100644 index 0000000..936c6be --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_routines.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for external_routines. diff --git a/modules/c++/external/CMakeFiles/external_routines.dir/depend.make b/modules/c++/external/CMakeFiles/external_routines.dir/depend.make new file mode 100644 index 0000000..590f6c9 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_routines.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for external_routines. +# This may be replaced when dependencies are built. diff --git a/modules/c++/external/CMakeFiles/external_routines.dir/flags.make b/modules/c++/external/CMakeFiles/external_routines.dir/flags.make new file mode 100644 index 0000000..37ecd13 --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_routines.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -Dexternal_routines_EXPORTS + +CXX_INCLUDES = + +CXX_FLAGS = -fPIC + diff --git a/modules/c++/external/CMakeFiles/external_routines.dir/link.txt b/modules/c++/external/CMakeFiles/external_routines.dir/link.txt new file mode 100644 index 0000000..25583bd --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_routines.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -fPIC -shared -Wl,-soname,libexternal_routines.so -o libexternal_routines.so CMakeFiles/external_routines.dir/external_routines.cpp.o -lrexxapi diff --git a/modules/c++/external/CMakeFiles/external_routines.dir/progress.make b/modules/c++/external/CMakeFiles/external_routines.dir/progress.make new file mode 100644 index 0000000..b700c2c --- /dev/null +++ b/modules/c++/external/CMakeFiles/external_routines.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 9 +CMAKE_PROGRESS_2 = 10 + diff --git a/modules/c++/external/CMakeFiles/progress.marks b/modules/c++/external/CMakeFiles/progress.marks new file mode 100644 index 0000000..1e8b314 --- /dev/null +++ b/modules/c++/external/CMakeFiles/progress.marks @@ -0,0 +1 @@ +6 diff --git a/modules/c++/external/Makefile b/modules/c++/external/Makefile new file mode 100644 index 0000000..02ac2a3 --- /dev/null +++ b/modules/c++/external/Makefile @@ -0,0 +1,315 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Samples\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles /home/gmgauthier/Projects/code/rexx/c++/external//CMakeFiles/progress.marks + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/external/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/external/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/external/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/external/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +c++/external/CMakeFiles/external_routines.dir/rule: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/external/CMakeFiles/external_routines.dir/rule +.PHONY : c++/external/CMakeFiles/external_routines.dir/rule + +# Convenience name for target. +external_routines: c++/external/CMakeFiles/external_routines.dir/rule +.PHONY : external_routines + +# fast build rule for target. +external_routines/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_routines.dir/build.make c++/external/CMakeFiles/external_routines.dir/build +.PHONY : external_routines/fast + +# Convenience name for target. +c++/external/CMakeFiles/external_methods.dir/rule: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/external/CMakeFiles/external_methods.dir/rule +.PHONY : c++/external/CMakeFiles/external_methods.dir/rule + +# Convenience name for target. +external_methods: c++/external/CMakeFiles/external_methods.dir/rule +.PHONY : external_methods + +# fast build rule for target. +external_methods/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods.dir/build.make c++/external/CMakeFiles/external_methods.dir/build +.PHONY : external_methods/fast + +# Convenience name for target. +c++/external/CMakeFiles/external_methods_routines.dir/rule: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 c++/external/CMakeFiles/external_methods_routines.dir/rule +.PHONY : c++/external/CMakeFiles/external_methods_routines.dir/rule + +# Convenience name for target. +external_methods_routines: c++/external/CMakeFiles/external_methods_routines.dir/rule +.PHONY : external_methods_routines + +# fast build rule for target. +external_methods_routines/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods_routines.dir/build.make c++/external/CMakeFiles/external_methods_routines.dir/build +.PHONY : external_methods_routines/fast + +external_methods.o: external_methods.cpp.o +.PHONY : external_methods.o + +# target to build an object file +external_methods.cpp.o: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods.dir/build.make c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.o +.PHONY : external_methods.cpp.o + +external_methods.i: external_methods.cpp.i +.PHONY : external_methods.i + +# target to preprocess a source file +external_methods.cpp.i: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods.dir/build.make c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.i +.PHONY : external_methods.cpp.i + +external_methods.s: external_methods.cpp.s +.PHONY : external_methods.s + +# target to generate assembly for a file +external_methods.cpp.s: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods.dir/build.make c++/external/CMakeFiles/external_methods.dir/external_methods.cpp.s +.PHONY : external_methods.cpp.s + +external_methods_routines.o: external_methods_routines.cpp.o +.PHONY : external_methods_routines.o + +# target to build an object file +external_methods_routines.cpp.o: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods_routines.dir/build.make c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.o +.PHONY : external_methods_routines.cpp.o + +external_methods_routines.i: external_methods_routines.cpp.i +.PHONY : external_methods_routines.i + +# target to preprocess a source file +external_methods_routines.cpp.i: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods_routines.dir/build.make c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.i +.PHONY : external_methods_routines.cpp.i + +external_methods_routines.s: external_methods_routines.cpp.s +.PHONY : external_methods_routines.s + +# target to generate assembly for a file +external_methods_routines.cpp.s: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_methods_routines.dir/build.make c++/external/CMakeFiles/external_methods_routines.dir/external_methods_routines.cpp.s +.PHONY : external_methods_routines.cpp.s + +external_routines.o: external_routines.cpp.o +.PHONY : external_routines.o + +# target to build an object file +external_routines.cpp.o: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_routines.dir/build.make c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.o +.PHONY : external_routines.cpp.o + +external_routines.i: external_routines.cpp.i +.PHONY : external_routines.i + +# target to preprocess a source file +external_routines.cpp.i: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_routines.dir/build.make c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.i +.PHONY : external_routines.cpp.i + +external_routines.s: external_routines.cpp.s +.PHONY : external_routines.s + +# target to generate assembly for a file +external_routines.cpp.s: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f c++/external/CMakeFiles/external_routines.dir/build.make c++/external/CMakeFiles/external_routines.dir/external_routines.cpp.s +.PHONY : external_routines.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" + @echo "... external_methods" + @echo "... external_methods_routines" + @echo "... external_routines" + @echo "... external_methods.o" + @echo "... external_methods.i" + @echo "... external_methods.s" + @echo "... external_methods_routines.o" + @echo "... external_methods_routines.i" + @echo "... external_methods_routines.s" + @echo "... external_routines.o" + @echo "... external_routines.i" + @echo "... external_routines.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/c++/external/cmake_install.cmake b/modules/c++/external/cmake_install.cmake new file mode 100644 index 0000000..a9f52d6 --- /dev/null +++ b/modules/c++/external/cmake_install.cmake @@ -0,0 +1,216 @@ +# Install script for directory: /home/gmgauthier/Projects/code/rexx/api/c++/external + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/external/readme.txt;/api/c++/external/Makefile.unix;/api/c++/external/Makefile.windows") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/external" TYPE FILE PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ FILES + "/home/gmgauthier/Projects/code/rexx/api/c++/external/readme.txt" + "/home/gmgauthier/Projects/code/rexx/api/c++/external/Makefile.unix" + "/home/gmgauthier/Projects/code/rexx/api/c++/external/Makefile.windows" + ) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + if(EXISTS "$ENV{DESTDIR}/api/c++/external/libexternal_routines.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/c++/external/libexternal_routines.so") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}/api/c++/external/libexternal_routines.so" + RPATH "") + endif() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/external/libexternal_routines.so") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/external" TYPE SHARED_LIBRARY PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE FILES "/home/gmgauthier/Projects/code/rexx/c++/external/libexternal_routines.so") + if(EXISTS "$ENV{DESTDIR}/api/c++/external/libexternal_routines.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/c++/external/libexternal_routines.so") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/api/c++/external/libexternal_routines.so") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/external/external_routines.cpp") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/external" TYPE FILE PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ FILES "/home/gmgauthier/Projects/code/rexx/api/c++/external/external_routines.cpp") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/external/useExternalRoutines.rex;/api/c++/external/useExternalRoutines2.rex") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/external" TYPE PROGRAM PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE FILES + "/home/gmgauthier/Projects/code/rexx/api/c++/external/useExternalRoutines.rex" + "/home/gmgauthier/Projects/code/rexx/api/c++/external/useExternalRoutines2.rex" + ) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + if(EXISTS "$ENV{DESTDIR}/api/c++/external/libexternal_methods.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/c++/external/libexternal_methods.so") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}/api/c++/external/libexternal_methods.so" + RPATH "") + endif() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/external/libexternal_methods.so") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/external" TYPE SHARED_LIBRARY PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE FILES "/home/gmgauthier/Projects/code/rexx/c++/external/libexternal_methods.so") + if(EXISTS "$ENV{DESTDIR}/api/c++/external/libexternal_methods.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/c++/external/libexternal_methods.so") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/api/c++/external/libexternal_methods.so") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/external/external_methods.cpp") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/external" TYPE FILE PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ FILES "/home/gmgauthier/Projects/code/rexx/api/c++/external/external_methods.cpp") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/external/useExternalMethods.rex") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/external" TYPE PROGRAM PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE FILES "/home/gmgauthier/Projects/code/rexx/api/c++/external/useExternalMethods.rex") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + if(EXISTS "$ENV{DESTDIR}/api/c++/external/libexternal_methods_routines.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/c++/external/libexternal_methods_routines.so") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}/api/c++/external/libexternal_methods_routines.so" + RPATH "") + endif() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/external/libexternal_methods_routines.so") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/external" TYPE SHARED_LIBRARY PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE FILES "/home/gmgauthier/Projects/code/rexx/c++/external/libexternal_methods_routines.so") + if(EXISTS "$ENV{DESTDIR}/api/c++/external/libexternal_methods_routines.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/c++/external/libexternal_methods_routines.so") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/api/c++/external/libexternal_methods_routines.so") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/external/external_methods_routines.cpp") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/external" TYPE FILE PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ FILES "/home/gmgauthier/Projects/code/rexx/api/c++/external/external_methods_routines.cpp") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/c++/external/useExternalMethodsRoutines.rex") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/c++/external" TYPE PROGRAM PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE FILES "/home/gmgauthier/Projects/code/rexx/api/c++/external/useExternalMethodsRoutines.rex") +endif() + diff --git a/modules/classic/CMakeFiles/CMakeDirectoryInformation.cmake b/modules/classic/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..46ef49d --- /dev/null +++ b/modules/classic/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/gmgauthier/Projects/code/rexx/api") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/gmgauthier/Projects/code/rexx") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/modules/classic/CMakeFiles/progress.marks b/modules/classic/CMakeFiles/progress.marks new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/modules/classic/CMakeFiles/progress.marks @@ -0,0 +1 @@ +10 diff --git a/modules/classic/Makefile b/modules/classic/Makefile new file mode 100644 index 0000000..b6a6f3d --- /dev/null +++ b/modules/classic/Makefile @@ -0,0 +1,189 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Samples\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles /home/gmgauthier/Projects/code/rexx/classic//CMakeFiles/progress.marks + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/classic/cmake_install.cmake b/modules/classic/cmake_install.cmake new file mode 100644 index 0000000..a4d609c --- /dev/null +++ b/modules/classic/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/gmgauthier/Projects/code/rexx/api/classic + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/gmgauthier/Projects/code/rexx/classic/unix/cmake_install.cmake") + +endif() + diff --git a/modules/classic/unix/CMakeFiles/CMakeDirectoryInformation.cmake b/modules/classic/unix/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..46ef49d --- /dev/null +++ b/modules/classic/unix/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/gmgauthier/Projects/code/rexx/api") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/gmgauthier/Projects/code/rexx") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/modules/classic/unix/CMakeFiles/progress.marks b/modules/classic/unix/CMakeFiles/progress.marks new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/modules/classic/unix/CMakeFiles/progress.marks @@ -0,0 +1 @@ +10 diff --git a/modules/classic/unix/Makefile b/modules/classic/unix/Makefile new file mode 100644 index 0000000..e9e4fc3 --- /dev/null +++ b/modules/classic/unix/Makefile @@ -0,0 +1,189 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Samples\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles /home/gmgauthier/Projects/code/rexx/classic/unix//CMakeFiles/progress.marks + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/classic/unix/callrexx/CMakeFiles/CMakeDirectoryInformation.cmake b/modules/classic/unix/callrexx/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..46ef49d --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/gmgauthier/Projects/code/rexx/api") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/gmgauthier/Projects/code/rexx") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/DependInfo.cmake b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/DependInfo.cmake new file mode 100644 index 0000000..5aa20e9 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/callrexx1.cpp" "classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.o" "gcc" "classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make new file mode 100644 index 0000000..acba096 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make @@ -0,0 +1,110 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +# Include any dependencies generated for this target. +include classic/unix/callrexx/CMakeFiles/callrexx1.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include classic/unix/callrexx/CMakeFiles/callrexx1.dir/compiler_depend.make + +# Include the progress variables for this target. +include classic/unix/callrexx/CMakeFiles/callrexx1.dir/progress.make + +# Include the compile flags for this target's objects. +include classic/unix/callrexx/CMakeFiles/callrexx1.dir/flags.make + +classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.o: classic/unix/callrexx/CMakeFiles/callrexx1.dir/flags.make +classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.o: /home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/callrexx1.cpp +classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.o: classic/unix/callrexx/CMakeFiles/callrexx1.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.o" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.o -MF CMakeFiles/callrexx1.dir/callrexx1.cpp.o.d -o CMakeFiles/callrexx1.dir/callrexx1.cpp.o -c /home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/callrexx1.cpp + +classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/callrexx1.dir/callrexx1.cpp.i" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/callrexx1.cpp > CMakeFiles/callrexx1.dir/callrexx1.cpp.i + +classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/callrexx1.dir/callrexx1.cpp.s" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/callrexx1.cpp -o CMakeFiles/callrexx1.dir/callrexx1.cpp.s + +# Object files for target callrexx1 +callrexx1_OBJECTS = \ +"CMakeFiles/callrexx1.dir/callrexx1.cpp.o" + +# External object files for target callrexx1 +callrexx1_EXTERNAL_OBJECTS = + +classic/unix/callrexx/callrexx1: classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.o +classic/unix/callrexx/callrexx1: classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make +classic/unix/callrexx/callrexx1: classic/unix/callrexx/CMakeFiles/callrexx1.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable callrexx1" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/callrexx1.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +classic/unix/callrexx/CMakeFiles/callrexx1.dir/build: classic/unix/callrexx/callrexx1 +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx1.dir/build + +classic/unix/callrexx/CMakeFiles/callrexx1.dir/clean: + cd /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx && $(CMAKE_COMMAND) -P CMakeFiles/callrexx1.dir/cmake_clean.cmake +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx1.dir/clean + +classic/unix/callrexx/CMakeFiles/callrexx1.dir/depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/gmgauthier/Projects/code/rexx/api /home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx /home/gmgauthier/Projects/code/rexx /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/CMakeFiles/callrexx1.dir/DependInfo.cmake "--color=$(COLOR)" +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx1.dir/depend + diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/cmake_clean.cmake b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/cmake_clean.cmake new file mode 100644 index 0000000..98601db --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/callrexx1.dir/callrexx1.cpp.o" + "CMakeFiles/callrexx1.dir/callrexx1.cpp.o.d" + "callrexx1" + "callrexx1.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/callrexx1.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/compiler_depend.make b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/compiler_depend.make new file mode 100644 index 0000000..2b6e436 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for callrexx1. +# This may be replaced when dependencies are built. diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/compiler_depend.ts b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/compiler_depend.ts new file mode 100644 index 0000000..57863e1 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for callrexx1. diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/depend.make b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/depend.make new file mode 100644 index 0000000..b46e8d5 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for callrexx1. +# This may be replaced when dependencies are built. diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/flags.make b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/flags.make new file mode 100644 index 0000000..179c101 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = + +CXX_INCLUDES = + +CXX_FLAGS = + diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/link.txt b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/link.txt new file mode 100644 index 0000000..b1aa8e7 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -rdynamic CMakeFiles/callrexx1.dir/callrexx1.cpp.o -o callrexx1 -lrexx -lrexxapi diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/progress.make b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/progress.make new file mode 100644 index 0000000..abadeb0 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx1.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 1 +CMAKE_PROGRESS_2 = 2 + diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/DependInfo.cmake b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/DependInfo.cmake new file mode 100644 index 0000000..e888911 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/callrexx2.c" "classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.o" "gcc" "classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make new file mode 100644 index 0000000..8e9a150 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make @@ -0,0 +1,110 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +# Include any dependencies generated for this target. +include classic/unix/callrexx/CMakeFiles/callrexx2.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include classic/unix/callrexx/CMakeFiles/callrexx2.dir/compiler_depend.make + +# Include the progress variables for this target. +include classic/unix/callrexx/CMakeFiles/callrexx2.dir/progress.make + +# Include the compile flags for this target's objects. +include classic/unix/callrexx/CMakeFiles/callrexx2.dir/flags.make + +classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.o: classic/unix/callrexx/CMakeFiles/callrexx2.dir/flags.make +classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.o: /home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/callrexx2.c +classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.o: classic/unix/callrexx/CMakeFiles/callrexx2.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.o" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.o -MF CMakeFiles/callrexx2.dir/callrexx2.c.o.d -o CMakeFiles/callrexx2.dir/callrexx2.c.o -c /home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/callrexx2.c + +classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/callrexx2.dir/callrexx2.c.i" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/callrexx2.c > CMakeFiles/callrexx2.dir/callrexx2.c.i + +classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/callrexx2.dir/callrexx2.c.s" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/callrexx2.c -o CMakeFiles/callrexx2.dir/callrexx2.c.s + +# Object files for target callrexx2 +callrexx2_OBJECTS = \ +"CMakeFiles/callrexx2.dir/callrexx2.c.o" + +# External object files for target callrexx2 +callrexx2_EXTERNAL_OBJECTS = + +classic/unix/callrexx/callrexx2: classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.o +classic/unix/callrexx/callrexx2: classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make +classic/unix/callrexx/callrexx2: classic/unix/callrexx/CMakeFiles/callrexx2.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking C executable callrexx2" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/callrexx2.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +classic/unix/callrexx/CMakeFiles/callrexx2.dir/build: classic/unix/callrexx/callrexx2 +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx2.dir/build + +classic/unix/callrexx/CMakeFiles/callrexx2.dir/clean: + cd /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx && $(CMAKE_COMMAND) -P CMakeFiles/callrexx2.dir/cmake_clean.cmake +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx2.dir/clean + +classic/unix/callrexx/CMakeFiles/callrexx2.dir/depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/gmgauthier/Projects/code/rexx/api /home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx /home/gmgauthier/Projects/code/rexx /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/CMakeFiles/callrexx2.dir/DependInfo.cmake "--color=$(COLOR)" +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx2.dir/depend + diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/cmake_clean.cmake b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/cmake_clean.cmake new file mode 100644 index 0000000..d21d527 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/callrexx2.dir/callrexx2.c.o" + "CMakeFiles/callrexx2.dir/callrexx2.c.o.d" + "callrexx2" + "callrexx2.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C) + include(CMakeFiles/callrexx2.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/compiler_depend.make b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/compiler_depend.make new file mode 100644 index 0000000..4710ea8 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for callrexx2. +# This may be replaced when dependencies are built. diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/compiler_depend.ts b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/compiler_depend.ts new file mode 100644 index 0000000..acb37f8 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for callrexx2. diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/depend.make b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/depend.make new file mode 100644 index 0000000..86add49 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for callrexx2. +# This may be replaced when dependencies are built. diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/flags.make b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/flags.make new file mode 100644 index 0000000..7dbb39f --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# compile C with /usr/bin/cc +C_DEFINES = + +C_INCLUDES = + +C_FLAGS = + diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/link.txt b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/link.txt new file mode 100644 index 0000000..4896481 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -rdynamic CMakeFiles/callrexx2.dir/callrexx2.c.o -o callrexx2 -lrexx -lrexxapi diff --git a/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/progress.make b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/progress.make new file mode 100644 index 0000000..8c8fb6f --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/callrexx2.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 3 +CMAKE_PROGRESS_2 = 4 + diff --git a/modules/classic/unix/callrexx/CMakeFiles/progress.marks b/modules/classic/unix/callrexx/CMakeFiles/progress.marks new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/modules/classic/unix/callrexx/CMakeFiles/progress.marks @@ -0,0 +1 @@ +4 diff --git a/modules/classic/unix/callrexx/Makefile b/modules/classic/unix/callrexx/Makefile new file mode 100644 index 0000000..bb7e338 --- /dev/null +++ b/modules/classic/unix/callrexx/Makefile @@ -0,0 +1,273 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Samples\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles /home/gmgauthier/Projects/code/rexx/classic/unix/callrexx//CMakeFiles/progress.marks + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/callrexx/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/callrexx/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/callrexx/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/callrexx/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +classic/unix/callrexx/CMakeFiles/callrexx1.dir/rule: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/callrexx/CMakeFiles/callrexx1.dir/rule +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx1.dir/rule + +# Convenience name for target. +callrexx1: classic/unix/callrexx/CMakeFiles/callrexx1.dir/rule +.PHONY : callrexx1 + +# fast build rule for target. +callrexx1/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx1.dir/build +.PHONY : callrexx1/fast + +# Convenience name for target. +classic/unix/callrexx/CMakeFiles/callrexx2.dir/rule: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/callrexx/CMakeFiles/callrexx2.dir/rule +.PHONY : classic/unix/callrexx/CMakeFiles/callrexx2.dir/rule + +# Convenience name for target. +callrexx2: classic/unix/callrexx/CMakeFiles/callrexx2.dir/rule +.PHONY : callrexx2 + +# fast build rule for target. +callrexx2/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx2.dir/build +.PHONY : callrexx2/fast + +callrexx1.o: callrexx1.cpp.o +.PHONY : callrexx1.o + +# target to build an object file +callrexx1.cpp.o: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.o +.PHONY : callrexx1.cpp.o + +callrexx1.i: callrexx1.cpp.i +.PHONY : callrexx1.i + +# target to preprocess a source file +callrexx1.cpp.i: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.i +.PHONY : callrexx1.cpp.i + +callrexx1.s: callrexx1.cpp.s +.PHONY : callrexx1.s + +# target to generate assembly for a file +callrexx1.cpp.s: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx1.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx1.dir/callrexx1.cpp.s +.PHONY : callrexx1.cpp.s + +callrexx2.o: callrexx2.c.o +.PHONY : callrexx2.o + +# target to build an object file +callrexx2.c.o: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.o +.PHONY : callrexx2.c.o + +callrexx2.i: callrexx2.c.i +.PHONY : callrexx2.i + +# target to preprocess a source file +callrexx2.c.i: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.i +.PHONY : callrexx2.c.i + +callrexx2.s: callrexx2.c.s +.PHONY : callrexx2.s + +# target to generate assembly for a file +callrexx2.c.s: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/callrexx/CMakeFiles/callrexx2.dir/build.make classic/unix/callrexx/CMakeFiles/callrexx2.dir/callrexx2.c.s +.PHONY : callrexx2.c.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" + @echo "... callrexx1" + @echo "... callrexx2" + @echo "... callrexx1.o" + @echo "... callrexx1.i" + @echo "... callrexx1.s" + @echo "... callrexx2.o" + @echo "... callrexx2.i" + @echo "... callrexx2.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/classic/unix/callrexx/cmake_install.cmake b/modules/classic/unix/callrexx/cmake_install.cmake new file mode 100644 index 0000000..3e5e6a3 --- /dev/null +++ b/modules/classic/unix/callrexx/cmake_install.cmake @@ -0,0 +1,139 @@ +# Install script for directory: /home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT) + if(EXISTS "$ENV{DESTDIR}/api/classic/callrexx/callrexx1" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/classic/callrexx/callrexx1") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}/api/classic/callrexx/callrexx1" + RPATH "") + endif() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/callrexx/callrexx1") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/callrexx" TYPE EXECUTABLE PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE FILES "/home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/callrexx1") + if(EXISTS "$ENV{DESTDIR}/api/classic/callrexx/callrexx1" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/classic/callrexx/callrexx1") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/api/classic/callrexx/callrexx1") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/callrexx/callrexx1.cpp;/api/classic/callrexx/Makefile.unix") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/callrexx" TYPE FILE PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/callrexx1.cpp" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/Makefile.unix" + ) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT) + if(EXISTS "$ENV{DESTDIR}/api/classic/callrexx/callrexx2" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/classic/callrexx/callrexx2") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}/api/classic/callrexx/callrexx2" + RPATH "") + endif() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/callrexx/callrexx2") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/callrexx" TYPE EXECUTABLE PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE FILES "/home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/callrexx2") + if(EXISTS "$ENV{DESTDIR}/api/classic/callrexx/callrexx2" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/classic/callrexx/callrexx2") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/api/classic/callrexx/callrexx2") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/callrexx/callrexx2.c") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/callrexx" TYPE FILE PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ FILES "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/callrexx2.c") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/callrexx/del_macro.rex;/api/classic/callrexx/example.rex;/api/classic/callrexx/load_macro.rex;/api/classic/callrexx/macros.rex;/api/classic/callrexx/startrx1.rex;/api/classic/callrexx/startrx2.rex;/api/classic/callrexx/startrx3.rex") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/callrexx" TYPE PROGRAM PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/del_macro.rex" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/example.rex" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/load_macro.rex" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/macros.rex" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/startrx1.rex" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/startrx2.rex" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx/startrx3.rex" + ) +endif() + diff --git a/modules/classic/unix/cmake_install.cmake b/modules/classic/unix/cmake_install.cmake new file mode 100644 index 0000000..01cf853 --- /dev/null +++ b/modules/classic/unix/cmake_install.cmake @@ -0,0 +1,68 @@ +# Install script for directory: /home/gmgauthier/Projects/code/rexx/api/classic/unix + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi.README;/api/classic/callrexx.README") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic" TYPE FILE FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi.README" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/callrexx.README" + ) +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/gmgauthier/Projects/code/rexx/classic/unix/callrexx/cmake_install.cmake") + include("/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1/cmake_install.cmake") + include("/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2/cmake_install.cmake") + include("/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3/cmake_install.cmake") + +endif() + diff --git a/modules/classic/unix/rexxapi1/CMakeFiles/CMakeDirectoryInformation.cmake b/modules/classic/unix/rexxapi1/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..46ef49d --- /dev/null +++ b/modules/classic/unix/rexxapi1/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/gmgauthier/Projects/code/rexx/api") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/gmgauthier/Projects/code/rexx") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/modules/classic/unix/rexxapi1/CMakeFiles/progress.marks b/modules/classic/unix/rexxapi1/CMakeFiles/progress.marks new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/modules/classic/unix/rexxapi1/CMakeFiles/progress.marks @@ -0,0 +1 @@ +2 diff --git a/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/DependInfo.cmake b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/DependInfo.cmake new file mode 100644 index 0000000..cfbda53 --- /dev/null +++ b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/rexxapi1.c" "classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.o" "gcc" "classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make new file mode 100644 index 0000000..bca90fd --- /dev/null +++ b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make @@ -0,0 +1,110 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +# Include any dependencies generated for this target. +include classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/compiler_depend.make + +# Include the progress variables for this target. +include classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/progress.make + +# Include the compile flags for this target's objects. +include classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/flags.make + +classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.o: classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/flags.make +classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.o: /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/rexxapi1.c +classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.o: classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.o" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1 && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.o -MF CMakeFiles/rexxapi1.dir/rexxapi1.c.o.d -o CMakeFiles/rexxapi1.dir/rexxapi1.c.o -c /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/rexxapi1.c + +classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/rexxapi1.dir/rexxapi1.c.i" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1 && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/rexxapi1.c > CMakeFiles/rexxapi1.dir/rexxapi1.c.i + +classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/rexxapi1.dir/rexxapi1.c.s" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1 && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/rexxapi1.c -o CMakeFiles/rexxapi1.dir/rexxapi1.c.s + +# Object files for target rexxapi1 +rexxapi1_OBJECTS = \ +"CMakeFiles/rexxapi1.dir/rexxapi1.c.o" + +# External object files for target rexxapi1 +rexxapi1_EXTERNAL_OBJECTS = + +classic/unix/rexxapi1/librexxapi1.so: classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.o +classic/unix/rexxapi1/librexxapi1.so: classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make +classic/unix/rexxapi1/librexxapi1.so: classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking C shared library librexxapi1.so" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1 && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rexxapi1.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build: classic/unix/rexxapi1/librexxapi1.so +.PHONY : classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build + +classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/clean: + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1 && $(CMAKE_COMMAND) -P CMakeFiles/rexxapi1.dir/cmake_clean.cmake +.PHONY : classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/clean + +classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/gmgauthier/Projects/code/rexx/api /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1 /home/gmgauthier/Projects/code/rexx /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1 /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/DependInfo.cmake "--color=$(COLOR)" +.PHONY : classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/depend + diff --git a/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/cmake_clean.cmake b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/cmake_clean.cmake new file mode 100644 index 0000000..d980a69 --- /dev/null +++ b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/rexxapi1.dir/rexxapi1.c.o" + "CMakeFiles/rexxapi1.dir/rexxapi1.c.o.d" + "librexxapi1.pdb" + "librexxapi1.so" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C) + include(CMakeFiles/rexxapi1.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/compiler_depend.make b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/compiler_depend.make new file mode 100644 index 0000000..95727db --- /dev/null +++ b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for rexxapi1. +# This may be replaced when dependencies are built. diff --git a/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/compiler_depend.ts b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/compiler_depend.ts new file mode 100644 index 0000000..2aec347 --- /dev/null +++ b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for rexxapi1. diff --git a/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/depend.make b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/depend.make new file mode 100644 index 0000000..1efbde0 --- /dev/null +++ b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for rexxapi1. +# This may be replaced when dependencies are built. diff --git a/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/flags.make b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/flags.make new file mode 100644 index 0000000..60197ff --- /dev/null +++ b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# compile C with /usr/bin/cc +C_DEFINES = -Drexxapi1_EXPORTS + +C_INCLUDES = + +C_FLAGS = -fPIC + diff --git a/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/link.txt b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/link.txt new file mode 100644 index 0000000..ffe6654 --- /dev/null +++ b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -fPIC -shared -Wl,-soname,librexxapi1.so -o librexxapi1.so CMakeFiles/rexxapi1.dir/rexxapi1.c.o -lrexx -lrexxapi diff --git a/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/progress.make b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/progress.make new file mode 100644 index 0000000..596289c --- /dev/null +++ b/modules/classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 11 +CMAKE_PROGRESS_2 = 12 + diff --git a/modules/classic/unix/rexxapi1/Makefile b/modules/classic/unix/rexxapi1/Makefile new file mode 100644 index 0000000..8e01f8b --- /dev/null +++ b/modules/classic/unix/rexxapi1/Makefile @@ -0,0 +1,231 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Samples\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1//CMakeFiles/progress.marks + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi1/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi1/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi1/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi1/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rule: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rule +.PHONY : classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rule + +# Convenience name for target. +rexxapi1: classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rule +.PHONY : rexxapi1 + +# fast build rule for target. +rexxapi1/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build +.PHONY : rexxapi1/fast + +rexxapi1.o: rexxapi1.c.o +.PHONY : rexxapi1.o + +# target to build an object file +rexxapi1.c.o: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.o +.PHONY : rexxapi1.c.o + +rexxapi1.i: rexxapi1.c.i +.PHONY : rexxapi1.i + +# target to preprocess a source file +rexxapi1.c.i: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.i +.PHONY : rexxapi1.c.i + +rexxapi1.s: rexxapi1.c.s +.PHONY : rexxapi1.s + +# target to generate assembly for a file +rexxapi1.c.s: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/build.make classic/unix/rexxapi1/CMakeFiles/rexxapi1.dir/rexxapi1.c.s +.PHONY : rexxapi1.c.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" + @echo "... rexxapi1" + @echo "... rexxapi1.o" + @echo "... rexxapi1.i" + @echo "... rexxapi1.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/classic/unix/rexxapi1/cmake_install.cmake b/modules/classic/unix/rexxapi1/cmake_install.cmake new file mode 100644 index 0000000..359e368 --- /dev/null +++ b/modules/classic/unix/rexxapi1/cmake_install.cmake @@ -0,0 +1,113 @@ +# Install script for directory: /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1 + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT) + if(EXISTS "$ENV{DESTDIR}/api/classic/rexxapi1/librexxapi1.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/classic/rexxapi1/librexxapi1.so") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}/api/classic/rexxapi1/librexxapi1.so" + RPATH "") + endif() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi1/librexxapi1.so") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi1" TYPE SHARED_LIBRARY PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE FILES "/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi1/librexxapi1.so") + if(EXISTS "$ENV{DESTDIR}/api/classic/rexxapi1/librexxapi1.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/classic/rexxapi1/librexxapi1.so") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/api/classic/rexxapi1/librexxapi1.so") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi1/rexxapi1.c;/api/classic/rexxapi1/readme.txt") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi1" TYPE FILE FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/rexxapi1.c" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/readme.txt" + ) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi1/Makefile.apple;/api/classic/rexxapi1/Makefile.linux") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi1" TYPE FILE FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/Makefile.apple" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/Makefile.linux" + ) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi1/apitest1.rex") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi1" TYPE PROGRAM FILES "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi1/apitest1.rex") +endif() + diff --git a/modules/classic/unix/rexxapi2/CMakeFiles/CMakeDirectoryInformation.cmake b/modules/classic/unix/rexxapi2/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..46ef49d --- /dev/null +++ b/modules/classic/unix/rexxapi2/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/gmgauthier/Projects/code/rexx/api") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/gmgauthier/Projects/code/rexx") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/modules/classic/unix/rexxapi2/CMakeFiles/progress.marks b/modules/classic/unix/rexxapi2/CMakeFiles/progress.marks new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/modules/classic/unix/rexxapi2/CMakeFiles/progress.marks @@ -0,0 +1 @@ +2 diff --git a/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/DependInfo.cmake b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/DependInfo.cmake new file mode 100644 index 0000000..2bac385 --- /dev/null +++ b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2/rexxapi2.c" "classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.o" "gcc" "classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make new file mode 100644 index 0000000..a665136 --- /dev/null +++ b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make @@ -0,0 +1,110 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +# Include any dependencies generated for this target. +include classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/compiler_depend.make + +# Include the progress variables for this target. +include classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/progress.make + +# Include the compile flags for this target's objects. +include classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/flags.make + +classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.o: classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/flags.make +classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.o: /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2/rexxapi2.c +classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.o: classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.o" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2 && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.o -MF CMakeFiles/rexxapi2.dir/rexxapi2.c.o.d -o CMakeFiles/rexxapi2.dir/rexxapi2.c.o -c /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2/rexxapi2.c + +classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/rexxapi2.dir/rexxapi2.c.i" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2 && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2/rexxapi2.c > CMakeFiles/rexxapi2.dir/rexxapi2.c.i + +classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/rexxapi2.dir/rexxapi2.c.s" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2 && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2/rexxapi2.c -o CMakeFiles/rexxapi2.dir/rexxapi2.c.s + +# Object files for target rexxapi2 +rexxapi2_OBJECTS = \ +"CMakeFiles/rexxapi2.dir/rexxapi2.c.o" + +# External object files for target rexxapi2 +rexxapi2_EXTERNAL_OBJECTS = + +classic/unix/rexxapi2/librexxapi2.so: classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.o +classic/unix/rexxapi2/librexxapi2.so: classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make +classic/unix/rexxapi2/librexxapi2.so: classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking C shared library librexxapi2.so" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2 && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rexxapi2.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build: classic/unix/rexxapi2/librexxapi2.so +.PHONY : classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build + +classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/clean: + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2 && $(CMAKE_COMMAND) -P CMakeFiles/rexxapi2.dir/cmake_clean.cmake +.PHONY : classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/clean + +classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/gmgauthier/Projects/code/rexx/api /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2 /home/gmgauthier/Projects/code/rexx /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2 /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/DependInfo.cmake "--color=$(COLOR)" +.PHONY : classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/depend + diff --git a/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/cmake_clean.cmake b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/cmake_clean.cmake new file mode 100644 index 0000000..f4f6082 --- /dev/null +++ b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/rexxapi2.dir/rexxapi2.c.o" + "CMakeFiles/rexxapi2.dir/rexxapi2.c.o.d" + "librexxapi2.pdb" + "librexxapi2.so" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C) + include(CMakeFiles/rexxapi2.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/compiler_depend.make b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/compiler_depend.make new file mode 100644 index 0000000..6063914 --- /dev/null +++ b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for rexxapi2. +# This may be replaced when dependencies are built. diff --git a/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/compiler_depend.ts b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/compiler_depend.ts new file mode 100644 index 0000000..4b2593a --- /dev/null +++ b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for rexxapi2. diff --git a/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/depend.make b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/depend.make new file mode 100644 index 0000000..be85bb8 --- /dev/null +++ b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for rexxapi2. +# This may be replaced when dependencies are built. diff --git a/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/flags.make b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/flags.make new file mode 100644 index 0000000..8830b81 --- /dev/null +++ b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# compile C with /usr/bin/cc +C_DEFINES = -Drexxapi2_EXPORTS + +C_INCLUDES = + +C_FLAGS = -fPIC + diff --git a/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/link.txt b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/link.txt new file mode 100644 index 0000000..4381070 --- /dev/null +++ b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -fPIC -shared -Wl,-soname,librexxapi2.so -o librexxapi2.so CMakeFiles/rexxapi2.dir/rexxapi2.c.o -lrexx -lrexxapi diff --git a/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/progress.make b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/progress.make new file mode 100644 index 0000000..d92f75a --- /dev/null +++ b/modules/classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 13 +CMAKE_PROGRESS_2 = 14 + diff --git a/modules/classic/unix/rexxapi2/Makefile b/modules/classic/unix/rexxapi2/Makefile new file mode 100644 index 0000000..81fe898 --- /dev/null +++ b/modules/classic/unix/rexxapi2/Makefile @@ -0,0 +1,231 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Samples\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2//CMakeFiles/progress.marks + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi2/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi2/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi2/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi2/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rule: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rule +.PHONY : classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rule + +# Convenience name for target. +rexxapi2: classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rule +.PHONY : rexxapi2 + +# fast build rule for target. +rexxapi2/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build +.PHONY : rexxapi2/fast + +rexxapi2.o: rexxapi2.c.o +.PHONY : rexxapi2.o + +# target to build an object file +rexxapi2.c.o: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.o +.PHONY : rexxapi2.c.o + +rexxapi2.i: rexxapi2.c.i +.PHONY : rexxapi2.i + +# target to preprocess a source file +rexxapi2.c.i: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.i +.PHONY : rexxapi2.c.i + +rexxapi2.s: rexxapi2.c.s +.PHONY : rexxapi2.s + +# target to generate assembly for a file +rexxapi2.c.s: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/build.make classic/unix/rexxapi2/CMakeFiles/rexxapi2.dir/rexxapi2.c.s +.PHONY : rexxapi2.c.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" + @echo "... rexxapi2" + @echo "... rexxapi2.o" + @echo "... rexxapi2.i" + @echo "... rexxapi2.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/classic/unix/rexxapi2/cmake_install.cmake b/modules/classic/unix/rexxapi2/cmake_install.cmake new file mode 100644 index 0000000..78bb61c --- /dev/null +++ b/modules/classic/unix/rexxapi2/cmake_install.cmake @@ -0,0 +1,100 @@ +# Install script for directory: /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2 + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT) + if(EXISTS "$ENV{DESTDIR}/api/classic/rexxapi2/librexxapi2.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/classic/rexxapi2/librexxapi2.so") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}/api/classic/rexxapi2/librexxapi2.so" + RPATH "") + endif() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi2/librexxapi2.so") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi2" TYPE SHARED_LIBRARY FILES "/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi2/librexxapi2.so") + if(EXISTS "$ENV{DESTDIR}/api/classic/rexxapi2/librexxapi2.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/classic/rexxapi2/librexxapi2.so") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/api/classic/rexxapi2/librexxapi2.so") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi2/rexxapi2.c;/api/classic/rexxapi2/readme.txt;/api/classic/rexxapi2/Makefile.linux;/api/classic/rexxapi2/Makefile.apple") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi2" TYPE FILE FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2/rexxapi2.c" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2/readme.txt" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2/Makefile.linux" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2/Makefile.apple" + ) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi2/apitest2.rex") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi2" TYPE PROGRAM FILES "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi2/apitest2.rex") +endif() + diff --git a/modules/classic/unix/rexxapi3/CMakeFiles/CMakeDirectoryInformation.cmake b/modules/classic/unix/rexxapi3/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..46ef49d --- /dev/null +++ b/modules/classic/unix/rexxapi3/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/gmgauthier/Projects/code/rexx/api") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/gmgauthier/Projects/code/rexx") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/modules/classic/unix/rexxapi3/CMakeFiles/progress.marks b/modules/classic/unix/rexxapi3/CMakeFiles/progress.marks new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/modules/classic/unix/rexxapi3/CMakeFiles/progress.marks @@ -0,0 +1 @@ +2 diff --git a/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/DependInfo.cmake b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/DependInfo.cmake new file mode 100644 index 0000000..64d5fe0 --- /dev/null +++ b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3/rexxapi3.c" "classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.o" "gcc" "classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make new file mode 100644 index 0000000..d739c15 --- /dev/null +++ b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make @@ -0,0 +1,110 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +# Include any dependencies generated for this target. +include classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/compiler_depend.make + +# Include the progress variables for this target. +include classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/progress.make + +# Include the compile flags for this target's objects. +include classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/flags.make + +classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.o: classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/flags.make +classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.o: /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3/rexxapi3.c +classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.o: classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.o" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3 && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.o -MF CMakeFiles/rexxapi3.dir/rexxapi3.c.o.d -o CMakeFiles/rexxapi3.dir/rexxapi3.c.o -c /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3/rexxapi3.c + +classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/rexxapi3.dir/rexxapi3.c.i" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3 && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3/rexxapi3.c > CMakeFiles/rexxapi3.dir/rexxapi3.c.i + +classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/rexxapi3.dir/rexxapi3.c.s" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3 && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3/rexxapi3.c -o CMakeFiles/rexxapi3.dir/rexxapi3.c.s + +# Object files for target rexxapi3 +rexxapi3_OBJECTS = \ +"CMakeFiles/rexxapi3.dir/rexxapi3.c.o" + +# External object files for target rexxapi3 +rexxapi3_EXTERNAL_OBJECTS = + +classic/unix/rexxapi3/librexxapi3.so: classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.o +classic/unix/rexxapi3/librexxapi3.so: classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make +classic/unix/rexxapi3/librexxapi3.so: classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/gmgauthier/Projects/code/rexx/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking C shared library librexxapi3.so" + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3 && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rexxapi3.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build: classic/unix/rexxapi3/librexxapi3.so +.PHONY : classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build + +classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/clean: + cd /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3 && $(CMAKE_COMMAND) -P CMakeFiles/rexxapi3.dir/cmake_clean.cmake +.PHONY : classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/clean + +classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/gmgauthier/Projects/code/rexx/api /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3 /home/gmgauthier/Projects/code/rexx /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3 /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/DependInfo.cmake "--color=$(COLOR)" +.PHONY : classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/depend + diff --git a/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/cmake_clean.cmake b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/cmake_clean.cmake new file mode 100644 index 0000000..7a0dc3e --- /dev/null +++ b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/rexxapi3.dir/rexxapi3.c.o" + "CMakeFiles/rexxapi3.dir/rexxapi3.c.o.d" + "librexxapi3.pdb" + "librexxapi3.so" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C) + include(CMakeFiles/rexxapi3.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/compiler_depend.make b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/compiler_depend.make new file mode 100644 index 0000000..b8275a2 --- /dev/null +++ b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty compiler generated dependencies file for rexxapi3. +# This may be replaced when dependencies are built. diff --git a/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/compiler_depend.ts b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/compiler_depend.ts new file mode 100644 index 0000000..8f30b33 --- /dev/null +++ b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for rexxapi3. diff --git a/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/depend.make b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/depend.make new file mode 100644 index 0000000..bd73999 --- /dev/null +++ b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for rexxapi3. +# This may be replaced when dependencies are built. diff --git a/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/flags.make b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/flags.make new file mode 100644 index 0000000..f1dafaf --- /dev/null +++ b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# compile C with /usr/bin/cc +C_DEFINES = -Drexxapi3_EXPORTS + +C_INCLUDES = + +C_FLAGS = -fPIC + diff --git a/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/link.txt b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/link.txt new file mode 100644 index 0000000..089cd2f --- /dev/null +++ b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -fPIC -shared -Wl,-soname,librexxapi3.so -o librexxapi3.so CMakeFiles/rexxapi3.dir/rexxapi3.c.o -lrexx -lrexxapi diff --git a/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/progress.make b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/progress.make new file mode 100644 index 0000000..a35c33b --- /dev/null +++ b/modules/classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 15 +CMAKE_PROGRESS_2 = 16 + diff --git a/modules/classic/unix/rexxapi3/Makefile b/modules/classic/unix/rexxapi3/Makefile new file mode 100644 index 0000000..763d128 --- /dev/null +++ b/modules/classic/unix/rexxapi3/Makefile @@ -0,0 +1,231 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.28 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/gmgauthier/Projects/code/rexx/api + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/gmgauthier/Projects/code/rexx + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Samples\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles /home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3//CMakeFiles/progress.marks + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi3/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/gmgauthier/Projects/code/rexx/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi3/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi3/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi3/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rule: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rule +.PHONY : classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rule + +# Convenience name for target. +rexxapi3: classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rule +.PHONY : rexxapi3 + +# fast build rule for target. +rexxapi3/fast: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build +.PHONY : rexxapi3/fast + +rexxapi3.o: rexxapi3.c.o +.PHONY : rexxapi3.o + +# target to build an object file +rexxapi3.c.o: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.o +.PHONY : rexxapi3.c.o + +rexxapi3.i: rexxapi3.c.i +.PHONY : rexxapi3.i + +# target to preprocess a source file +rexxapi3.c.i: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.i +.PHONY : rexxapi3.c.i + +rexxapi3.s: rexxapi3.c.s +.PHONY : rexxapi3.s + +# target to generate assembly for a file +rexxapi3.c.s: + cd /home/gmgauthier/Projects/code/rexx && $(MAKE) $(MAKESILENT) -f classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/build.make classic/unix/rexxapi3/CMakeFiles/rexxapi3.dir/rexxapi3.c.s +.PHONY : rexxapi3.c.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" + @echo "... rexxapi3" + @echo "... rexxapi3.o" + @echo "... rexxapi3.i" + @echo "... rexxapi3.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/gmgauthier/Projects/code/rexx && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/modules/classic/unix/rexxapi3/cmake_install.cmake b/modules/classic/unix/rexxapi3/cmake_install.cmake new file mode 100644 index 0000000..bc81ba1 --- /dev/null +++ b/modules/classic/unix/rexxapi3/cmake_install.cmake @@ -0,0 +1,100 @@ +# Install script for directory: /home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3 + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT) + if(EXISTS "$ENV{DESTDIR}/api/classic/rexxapi3/librexxapi3.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/classic/rexxapi3/librexxapi3.so") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}/api/classic/rexxapi3/librexxapi3.so" + RPATH "") + endif() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi3/librexxapi3.so") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi3" TYPE SHARED_LIBRARY FILES "/home/gmgauthier/Projects/code/rexx/classic/unix/rexxapi3/librexxapi3.so") + if(EXISTS "$ENV{DESTDIR}/api/classic/rexxapi3/librexxapi3.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/api/classic/rexxapi3/librexxapi3.so") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/api/classic/rexxapi3/librexxapi3.so") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi3/rexxapi3.c;/api/classic/rexxapi3/readme.txt;/api/classic/rexxapi3/Makefile.linux;/api/classic/rexxapi3/Makefile.apple") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi3" TYPE FILE FILES + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3/rexxapi3.c" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3/readme.txt" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3/Makefile.linux" + "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3/Makefile.apple" + ) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/classic/rexxapi3/apitest3.rex") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api/classic/rexxapi3" TYPE PROGRAM FILES "/home/gmgauthier/Projects/code/rexx/api/classic/unix/rexxapi3/apitest3.rex") +endif() + diff --git a/modules/cmake_install.cmake b/modules/cmake_install.cmake new file mode 100644 index 0000000..1250601 --- /dev/null +++ b/modules/cmake_install.cmake @@ -0,0 +1,73 @@ +# Install script for directory: /home/gmgauthier/Projects/code/rexx/api + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "Samples" OR NOT CMAKE_INSTALL_COMPONENT) + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/api/readme.txt") + if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + endif() + file(INSTALL DESTINATION "/api" TYPE FILE FILES "/home/gmgauthier/Projects/code/rexx/api/readme.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/gmgauthier/Projects/code/rexx/c++/cmake_install.cmake") + include("/home/gmgauthier/Projects/code/rexx/classic/cmake_install.cmake") + +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/home/gmgauthier/Projects/code/rexx/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/modules/windows/0ReadMe.first b/modules/windows/0ReadMe.first new file mode 100644 index 0000000..6019421 --- /dev/null +++ b/modules/windows/0ReadMe.first @@ -0,0 +1,81 @@ + + + Windows ooRexx Example Programs + =============================== + + The Windows distribution of ooRexx comes with a large number of example + programs that demonstrate programming with ooRexx. Many of these + programs are primarily used to show features of one of the extensions + to ooRexx, such as the ooDialog framework, or the OleObject class. + + To make locating a program of interest easier, the example programs are + grouped in subdirectories. This read me file serves as an additional + resource to help document the location of different examples. + + samples\ + + This top-level directory, (the directory containing this read me file,) + contains samples that run unchanged on any platform supported by + ooRexx. Subdirectories, with the exception of samples\native.api, + contain examples that use Windows only extensions. + + samples\api\classic\ + + This directory contains Windows only examples using the old API to + write Rexx extensions. The use of the old API to write new Rexx + extensions is discouraged and the examples may be removed in future + distributions. + + samples\misc\ + + This directory contains miscellaneous Windows only examples that do not + fit well in the other categories. + + samples\api\c++\ + + This directory contains platform independent samples using the C++ API + introduced in ooRexx 4.0.0 to write ooRexx extensions. nMake + compatible make files for the examples are included in this directory. + + samples\ole + + This directory and its subdirectories contain examples using the + OleObject class, a Windows only class that gives the programmer access + OLE objects. + + A few additional samples that combine using the OleObject class and the + ooDialog framework are located under samples\oodialog. + + samples\oodialog + + This directory and its subdirectories contain all example programs that + use the ooDialog framework. The ooDialog framework allows the Rexx + programmer to easy create programs that have a graphical user + interface. + + A number of the programs included with the ooDialog examples + demonstrate combining other Windows only extensions with the ooDialog + framework. + + samples\rexxutils + + This directory contains example programs that use some of the Windows + only functions from RexxUtils. + + Note: + ----- + + One of the interesting Windows only extensions is the winsystm.cls. + The example programs for this class all make use of the ooDialog + framework. The examples for the winsystm.cls are located at: + + samples\oodialog\winsystm\ + + Two excellent examples of using the OleObject, oleinfo.rex and + sysinfo.rex, are also located under the oodialog subdirectory. These + examples are located at: + + samples\oodialog\oleinfo + + samples\oodialog\sysinfo + diff --git a/modules/windows/CMakeLists.txt b/modules/windows/CMakeLists.txt new file mode 100644 index 0000000..3e58ee3 --- /dev/null +++ b/modules/windows/CMakeLists.txt @@ -0,0 +1,56 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2014-2021 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +#/*----------------------------------------------------------------------------*/ +#/* Global settings */ +#/*----------------------------------------------------------------------------*/ +if (APPLE) +# apple build with lower cmake version have an @rpath problem + cmake_minimum_required (VERSION 3.12) +else() +#for other platforms + cmake_minimum_required (VERSION 2.8.12) +endif() +cmake_policy(VERSION 2.8...3.3) + +#/*----------------------------------------------------------------------------*/ +#/* Project settings */ +#/*----------------------------------------------------------------------------*/ +project (samples-windows) + +# add_subdirectory (api) + diff --git a/modules/windows/misc/fileDrop.ReadMe b/modules/windows/misc/fileDrop.ReadMe new file mode 100644 index 0000000..e9b9a8e --- /dev/null +++ b/modules/windows/misc/fileDrop.ReadMe @@ -0,0 +1,18 @@ + fileDrop.rex + +The fileDrop.rex program demonstrates how Rexx programs with the .rex +extensions act as Drop Handlers. During the installation process on +Windows, files with the extension of .rex are registered with the operating +system as 'drop handlers.' + +In Windows explorer, the user can drag and drop any file over the icon for +any Rexx program (one with the .rex extension.) The icon drawn for the drag +operation will change over the Rexx program to one indicating that the Rexx +program accepts dropping. If the user drops the file on the Rexx program, +the operating system executes the Rexx program and provides the full path +name for the file as the argument to the program. + +In Windows Explorer, drag any file over fileDrop.rex and drop it. The +program demonstrates 'handling' the dropped file. The file: fileDrop.input +is used to simulate a data input file. When dropped on fileDrop.rex, the +program will process the data and produce a result. diff --git a/modules/windows/misc/fileDrop.empty b/modules/windows/misc/fileDrop.empty new file mode 100644 index 0000000..e69de29 diff --git a/modules/windows/misc/fileDrop.input b/modules/windows/misc/fileDrop.input new file mode 100644 index 0000000..793830d --- /dev/null +++ b/modules/windows/misc/fileDrop.input @@ -0,0 +1,14 @@ +/* Don't move or moditfy the third line. */ +/* The record processor searches for this marker. */ +----data input file---- + +This is +just +a fake +file +to +simulate processing a data input +file. +It +has no +meaning. diff --git a/modules/windows/misc/fileDrop.rex b/modules/windows/misc/fileDrop.rex new file mode 100644 index 0000000..1a99401 --- /dev/null +++ b/modules/windows/misc/fileDrop.rex @@ -0,0 +1,164 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Demonstrates handling files 'dropped' on this program. In Windows explorer, + * drag any file over this program and drop it. The OS will then execute this + * program and provide the complete path name of the 'dropped' file as the + * argument to this program. The program then 'handles' the dropped file. Use + * fileDrop.input to simulate processing a data input file. + * + * Note that you can also run this program from the command prompt by supplying + * the correct file name argument. I.e.: + * + * rexx fileDrop.rex fileDrop.input + * + */ +use arg fileName + + -- Note that the OS seems to tack an extra space on the end of the file name + -- argument. So, we strip it off to start with. + fileName = fileName~strip + + -- Display the fileName argument. + msg = "Got file name argument:" || .endOfLine || .endOfLine || fileName + j = RxMessageBox(msg, "ooRexx File Drop Handling", "OK", "INFORMATION") + + -- Check if the file exists. If not, this program was probably invoked from + -- the command line rather than through drag-and-drop. + if \ SysFileExists(fileName) then do + msg = "The file does not exist." || .endOfLine || .endOfLine || - + "Perhaps you are not using drag and drop?" || .endOfLine || - + "In Windows explorer, drag a file and drop" || .endOfLine || - + "it on this program's icon." + j = RxMessageBox(msg, "ooRexx File Drop Handling", "OK", "INFORMATION") + return 9 + end + + -- Check if it is a directory. + if SysIsFileDirectory(fileName) then do + msg = 'Dropped file is a directory. Will print out directory contents.' + j = RxMessageBox(msg, "ooRexx File Drop Handling", "OK", "INFORMATION") + + count = printDirectory(fileName) + msg = 'There were' count 'entries in the directory. Quitting.' + j = RxMessageBox(msg, "ooRexx File Drop Handling", "OK", "INFORMATION") + return 0 + end + + -- Should be a file, be sure we can read it. + f = .stream~new(fileName) + if f~open("READ") \== "READY:" then do + msg = "Could not open:" || .endOfLine || .endOfLine || - + fileName || .endOfLine || .endOfLine || - + "for reading. Quitting" + j = RxMessageBox(msg, "ooRexx File Drop Handling", "OK", "INFORMATION") + return 9 + end + + -- Collect some data on the file and then display it. + count = f~lines + if count >= 3 then do + line = f~linein(3) + number = 3 + end + else if count >= 1 then do + line = f~linein(1) + number = 1 + end + else do + line = "The file is empty." + number = 0 + end + f~close + + msg = "The file has" count "lines." || .endOfLine || .endOfLine + if number == 0 then do + msg = msg || line + end + else do + msg = msg || "Line number" number "reads as follows:" || .endOfLine || .endOfLine || line + end + + j = RxMessageBox(msg, "ooRexx File Drop Handling", "OK", "INFORMATION") + + -- This would be a check that the file is a correct data input file. + if line == "----data input file----" then do + recordCount = updateDataBase(f) + msg = "Processed" recordCount "database records. Finished." + end + else do + msg = "Invalid data file. Quitting" + end + + j = RxMessageBox(msg, "ooRexx File Drop Handling", "OK", "INFORMATION") + return 0 + +-- Print out the directory entries in the specified directory +::routine printDirectory + use strict arg directoryName + + dir = directoryName || '\*.*' + count = -1 + + j = SysFileTree(dir, f., 'BT') + if j == 0 then do + do i = 1 to f.0 + say f.i + end + count = f.0 + end + + return count + +-- Update the database use the specified information. +::routine updateDataBase + use strict arg f + + -- Simulate processing / updating database records using the data input file. + -- We just fake it. + countProcessed = 0 + ret = f~seek('=1 READ') + do while f~state == "READY" + line = f~linein + countProcessed += 1 + end + + countProcessed *= random(2, 9) + + f~close + return countProcessed diff --git a/modules/windows/ole/ReadMe.first b/modules/windows/ole/ReadMe.first new file mode 100644 index 0000000..66f7122 --- /dev/null +++ b/modules/windows/ole/ReadMe.first @@ -0,0 +1,17 @@ + + + OLE Object Examples + =================== + + This directory and its subdirectories contain a number of example + programs that use the OleObject class. + + There are two other nice example programs that combine using the + OleObject class and the ooDialog framework. Those programs are + included in the ooDialog examples in the following directories: + + samples\oodialog\oleinfo + + and + + samples\oodialog\sysinfo diff --git a/modules/windows/ole/adsi/adsi1.rex b/modules/windows/ole/adsi/adsi1.rex new file mode 100755 index 0000000..b6a72f0 --- /dev/null +++ b/modules/windows/ole/adsi/adsi1.rex @@ -0,0 +1,58 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*******************************************************************/ +/* ADSI Sample 1: */ +/* */ +/* Retrieve information about a computer with ADSI. */ +/* */ +/* */ +/*******************************************************************/ + +ComputerName = value("COMPUTERNAME",,"ENVIRONMENT") +myComputer = .OLEObject~GetObject("WinNT://"||ComputerName||",computer") + +say "Standard properties of this computer:" +say left("Name:", 10) myComputer~name +say left("Class:", 10) myComputer~class +say left("GUID:", 10) myComputer~guid +say left("ADsPath:",10) myComputer~adspath +say left("Parent:", 10) myComputer~parent +say left("Schema:", 10) myComputer~schema + +return 0 + diff --git a/modules/windows/ole/adsi/adsi2.rex b/modules/windows/ole/adsi/adsi2.rex new file mode 100755 index 0000000..24b9750 --- /dev/null +++ b/modules/windows/ole/adsi/adsi2.rex @@ -0,0 +1,77 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*******************************************************************/ +/* ADSI Sample 2: */ +/* */ +/* Get a users' full name and change it. */ +/* */ +/*******************************************************************/ + +ComputerName = value("COMPUTERNAME",,"ENVIRONMENT") -- get ComputerName +UserID = value("USERNAME",,"ENVIRONMENT" ) -- get UserName + +userObject = .OLEObject~GetObject("WinNT://"||ComputerName||"/"||UserID||",user") + +/* using the object property */ +say "The full name for" UserID "is" userObject~FullName + +/* using the standard get method for ADSI objects */ +say "The full name for" UserID "is" userObject~Get("FullName") + +say "Would you like to rename the full name (y/n)?" +pull answer + +if answer = "Y" then do + say "New full name:" + parse pull answer + + /* set the property */ + /* as an alternative, the property can also be set with the standard put */ + /* method of ADSI objects: */ + /* userObject~Put("FullName",answer) */ + userObject~FullName=answer + + /* because properties are cached to avoid network calls, changing the */ + /* properties of an object will only affect the cache at first. */ + /* the object gets updated with the SetInfo method: */ + userObject~SetInfo + + say "updated the full name for" UserID +end + +return 0 diff --git a/modules/windows/ole/adsi/adsi3.rex b/modules/windows/ole/adsi/adsi3.rex new file mode 100755 index 0000000..5716111 --- /dev/null +++ b/modules/windows/ole/adsi/adsi3.rex @@ -0,0 +1,65 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*******************************************************************/ +/* ADSI Sample 3: */ +/* */ +/* Showing the use of ADSI containers. */ +/* */ +/*******************************************************************/ + +computerName = value("COMPUTERNAME",,"ENVIRONMENT") -- alternatively: '.' +groupName = getLocalAdministratorGroupName(computerName) +container = .OLEObject~GetObject("WinNT://"computerName||"/"groupName",group") +do member over container~members + say member~class ":" member~name "["member~description"]" +end + +/* Cf. (as of 2022-05-07): + + , +*/ + +::routine getLocalAdministratorGroupName -- return local name of the administrator group + use arg computer + sid="S-1-5-32-544" -- SID for local administrator group + wmiService = .oleObject~getObject("winmgmts:\\"computer"\root\cimv2") + -- will return a collection with a single element + groups=wmiService~execQuery("select * from Win32_Group where LocalAccount = TRUE and sid='"sid"'") + if groups=.nil then return "Administrators" -- default: return English name + return groups~itemIndex(0)~name -- return local group name + diff --git a/modules/windows/ole/adsi/adsi4.rex b/modules/windows/ole/adsi/adsi4.rex new file mode 100755 index 0000000..d6fe938 --- /dev/null +++ b/modules/windows/ole/adsi/adsi4.rex @@ -0,0 +1,56 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*******************************************************************/ +/* ADSI Sample 4: */ +/* */ +/* Using filters with ADSI collections. */ +/* */ +/*******************************************************************/ + +ComputerName = value("COMPUTERNAME",,"ENVIRONMENT") + +computerObject = .OLEObject~GetObject("WinNT://"||ComputerName) + +computerObject~Filter = .array~of("Group","Service") + +/* show only objects of type Group and Service: */ +do item over computerObject + say item~class ":" item~name +end + +return 0 diff --git a/modules/windows/ole/adsi/adsi5.rex b/modules/windows/ole/adsi/adsi5.rex new file mode 100755 index 0000000..f6a30c9 --- /dev/null +++ b/modules/windows/ole/adsi/adsi5.rex @@ -0,0 +1,57 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*******************************************************************/ +/* ADSI Sample 5: */ +/* */ +/* Displaying namespaces and domains. */ +/* */ +/*******************************************************************/ + +myADS = .OLEObject~GetObject("ADs:") + +do namespace over myADS + say "Domains in" namespace~Name + do domain over namespace + if domain \= .nil then + say " " domain~name + else + say domain + end +end + +return 0 diff --git a/modules/windows/ole/adsi/adsi6.rex b/modules/windows/ole/adsi/adsi6.rex new file mode 100755 index 0000000..d42af0f --- /dev/null +++ b/modules/windows/ole/adsi/adsi6.rex @@ -0,0 +1,74 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*******************************************************************/ +/* ADSI Sample 6: */ +/* */ +/* Inspecting properties of an object. */ +/* */ +/*******************************************************************/ + +ComputerName = value("COMPUTERNAME",,"ENVIRONMENT") + +myDomain = .OLEObject~GetObject("WinNT://"||ComputerName) +mySchemaClass = .OLEObject~GetObject(myDomain~schema) + +say "Properties for the" myDomain~name "object:" +say + +if mySchemaClass~container = 1 then do + say myDomain~name "may contain the following objects:" + do i over mySchemaClass~Containment + say " " i + end +end +else + say myDomain~name "is not a container." + +say +say "Mandatory properties:" +do i over mySchemaClass~MandatoryProperties + say " " i +end + +say +say "Optional properties:" +do i over mySchemaClass~OptionalProperties + say " " i +end + +return 0 diff --git a/modules/windows/ole/adsi/adsi7.rex b/modules/windows/ole/adsi/adsi7.rex new file mode 100755 index 0000000..23971e7 --- /dev/null +++ b/modules/windows/ole/adsi/adsi7.rex @@ -0,0 +1,81 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*******************************************************************/ +/* ADSI Sample 7: */ +/* */ +/* Create a group and several users in it. */ +/* */ +/*******************************************************************/ + +ComputerName = value("COMPUTERNAME",,"ENVIRONMENT") -- get ComputerName + +computer = .OLEObject~GetObject("WinNT://"||ComputerName) + +/* create a new group */ +newGroup = computer~Create("group", "REXX-TestGroup") +newGroup~Description = "A test group created with REXX" +newGroup~SetInfo + +/* make sure the information in the object cache is up-to-date */ +newGroup~GetInfo + +say "Created new group" newGroup~Name +say "Description:" newGroup~Description + +say +say "Creating 15 users in this group:" +say "User01..User15 with passwords demo01..demo15" +/* create several new users */ +do i = 1 to 15 + /* create name and other information */ + userName = "User"right(i,2,'0') + userFullName = "Demo User Number" i + userDescription = "A demo user that was created with REXX" + userPassword = "demo"right(i,2,'0') + + newUser = computer~Create("user", userName) + newUser~FullName = userFullName + newUser~Description = userDescription + newUser~SetPassword(userPassword) + newUser~SetInfo + newGroup~Add(newUser~ADsPath) +end + +say "done" + +return 0 diff --git a/modules/windows/ole/adsi/adsi8.rex b/modules/windows/ole/adsi/adsi8.rex new file mode 100755 index 0000000..0fb9e7a --- /dev/null +++ b/modules/windows/ole/adsi/adsi8.rex @@ -0,0 +1,60 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*******************************************************************/ +/* ADSI Sample 8: */ +/* */ +/* Remove the users and the group that were created in */ +/* sample 7. */ +/* */ +/*******************************************************************/ + +ComputerName = value("COMPUTERNAME",,"ENVIRONMENT") -- get ComputerName +computer = .OLEObject~GetObject("WinNT://"||ComputerName) + +say "Removing the fifteen users..." +do i = 1 to 15 + computer~Delete("user", "User"||right(i,2,'0')) +end + +say "Removing the test group..." + +computer~Delete("group", "REXX-TestGroup") + +say "done" + +return 0 diff --git a/modules/windows/ole/apps/AOO_scalc_chart.rex b/modules/windows/ole/apps/AOO_scalc_chart.rex new file mode 100755 index 0000000..6e67c06 --- /dev/null +++ b/modules/windows/ole/apps/AOO_scalc_chart.rex @@ -0,0 +1,138 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/********************************************************************** + AOO_scalc_chart.rex using OLE (object linking and embedding) with ooRexx + + Links: + + + + + Using OLE create a new scalc worksheet, create random data and a chart based on it. + Demonstrates how to use UNO reflection and incorporate UNO_CONSTANTS and UNO_ENUM + values into a Rexx directory for easier use. +***********************************************************************/ + +/* create a spreadsheet, add data for comparing two years by quarter, add a chart */ +serviceManager = .OLEObject~new('com.sun.star.ServiceManager') +/* create spreadsheet, get first sheet */ +desktop = serviceManager~createInstance('com.sun.star.frame.Desktop') +noProps = .array~new /* empty array (no properties) */ +document = desktop~loadComponentFromURL('private:factory/scalc', '_blank', 0, noProps) +sheet = document~sheets~getByIndex(0) -- get first spreadsheet + +/* note values can be assigned to cells with "string", "formula" or "value" (for numbers) */ +/* create the titles, pretend the last two yers */ +year = date()~right(4)-2 +titles = "Quarter", year, year+1 /* title array */ +do col = 1 to titles~items + sheet~getCellByPosition(col-1,0)~string = titles[col] +end +/* get all UNO_ENUM values in a Rexx directory */ +justify = getAsDirectory(serviceManager, "com.sun.star.table.CellHoriJustify") +say "justify:" justify +/* right adjust the last two years + - possibility 1: sheet~getCellRangeByName("B1:C1")~setPropertyValue("HoriJustify", justify~right) + - or: */ +sheet~getCellRangeByName("B1:C1")~HoriJustify = justify~right + +/* get all UNO_CONSTANTS values in a Rexx directory */ +weights = getAsDirectory(serviceManager,"com.sun.star.awt.FontWeight") +say "weights:" weights +sheet~getCellRangeByName("A1:C1")~CharWeight = weights~bold /* column headings */ + +/* create random values for the quarter numbers */ +do line = 1 to 4 + sheet~getCellByPosition(0,line)~string = "Q"line /* title in first column */ + sheet~getCellByPosition(1,line)~value = random(0,500000)/100 + sheet~getCellByPosition(2,line)~value = random(0,750000)/100 +end +sheet~getCellRangeByName("A2:A5")~CharWeight = weights~bold /* column headings */ +/* format numbers, predefined style, format: "#,##0.00" */ +sheet~getCellRangeByName("B2:C5")~setPropertyValue("NumberFormat",4) + +/* create a chart from the data */ +structRect = serviceManager~bridge_getStruct("com.sun.star.awt.Rectangle") +structRect~X = 300 -- x-offset: 0.300 cm +structRect~Y = 2250 -- y-offset: 2.250 cm +structRect~Width = 16000 -- width: 16.000 cm +structRect~Height = 8000 -- height: 8.000 cm + +range = sheet~getCellRangeByName("A1:C5") /* data to be used for the chart */ +rangeAddr = range~getRangeAddress +arrOfAddr = .array~of(rangeAddr) /* create array with the range address */ +tableCharts = sheet~getCharts /* get chart collection & insert */ +tableCharts~addNewByName("FirstChart", structRect, arrOfAddr, .true, .true) + +/* Routine returns a Rexx directory containing all names and values of the supplied + UNO_CONSTANTS or UNO_ENUM class name (needs to be fully qualified). */ +::routine getAsDirectory + use strict arg serviceManager, unoClzName + + dir = .Directory~new -- directory will get + dir~objectName = unoClzName -- allows to show the uno class it represents + + ctxt = serviceManager~defaultContext + tdm = ctxt~getValueByName("/singletons/com.sun.star.reflection.theTypeDescriptionManager") + reflClz= tdm~getByHierarchicalName(unoClzName) + if reflClz~isNil then return dir -- return empty directory + + typeClass = reflClz~getTypeClass + if typeClass = 30 then -- UNO_CONSTANTS + do + dir~objectName = unoClzName "(UNO_CONSTANTS)" -- supply type info to name + do c over reflClz~getConstants -- iterate over constant fields + name = c~getName -- fully qualified + name = name~substr(name~lastPos('.')+1) -- extract last word + dir[name] = c~getConstantValue -- store constant values with their names + -- say "name:" name "->" c~getConstantValue + end + end + else if typeClass = 15 then -- UNO_ENUMERATION + do + dir~objectName = unoClzName "(UNO_ENUM)" -- supply type info to name + enumNames = reflClz~getEnumNames -- get all enumeration names + enumValues = reflClz~getEnumValues -- get all enumeration values + do i=1 to enumNames~items + name = enumNames[i] + name = name~substr(name~lastPos('.')+1) -- extract last word + dir[name] = enumValues[i] -- store enum values with their names + -- say "name:" name "->" enumValues[i] + end + end + return dir diff --git a/modules/windows/ole/apps/AOO_simpress_present.rex b/modules/windows/ole/apps/AOO_simpress_present.rex new file mode 100755 index 0000000..3bed5c5 --- /dev/null +++ b/modules/windows/ole/apps/AOO_simpress_present.rex @@ -0,0 +1,124 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/********************************************************************** + AOO_simpress_present.rex using OLE (object linking and embedding) with ooRexx + + Links: + + + + + Using OLE create a new simpress presentation about REXX and ooRexx and then + display it as a presentation. Demonstrates how to use enumeration to + enumerate paragraphs of a text and query their 'NumberingLevel' property. +***********************************************************************/ + +/* create a presentation, then start it */ +serviceManager = .OLEObject~new('com.sun.star.ServiceManager') +desktop = serviceManager~createInstance('com.sun.star.frame.Desktop') +noProps = .array~new /* empty array (no properties) */ +document = desktop~loadComponentFromURL('private:factory/simpress', '_blank', 0, noProps) + +drawPages = document~getDrawPages -- get DrawPages + -- first page +drawPage=drawPages~getByIndex(0) -- get first (empty) page +drawPage~setPropertyValue("Layout", 0) -- "Title Slide" + +title = "ooRexx" +shape = drawPage~getByIndex(0) -- get first shape (title) +shape~setString(title) + +shape = drawPage~getByIndex(1) -- get second shape (subtitle) +cursor = shape~createTextCursor -- get XTextCursor +cr="0d"x +shape~insertString(cursor,"Open Object Rexx (ooRexx)"cr, .false) + +textRange=shape~getEnd -- get a XTextRange +textRange~setPropertyValue("CharHeight", 15) -- use 15 pixel height +info="(Presentation created:" .dateTime~new")" +textRange~setString(info) -- set it to this string + + -- add a second page +drawPage=drawPages~~insertNewByIndex(1)~getByIndex(1) -- insert at end, get access +drawPage~setPropertyValue("Layout", 1) -- "Title Content" +drawPage~getByIndex(0)~setString("Open Object Rexx (ooRexx)") -- first shape + +text=drawPage~getByIndex(1) -- get second shape (listing) +-- add string, supply level +call addItem text, "REXX (IBM)", 0 +call addItem text, "First released in 1979 for IBM mainframes", 1 +call addItem text, "Object REXX (IBM)", 0 +call addItem text, "Object-oriented successor to REXX", 1 +call addItem text, "First released in 1994 with IBM's OS/2 Warp", 1 +call addItem text, "Negotiations about open-sourcing with RexxLA", 1 +call addItem text, "Rexx Language Association (www.RexxLA.org)", 2 +call addItem text, "Source code handed over to RexxLA in 2003", 2 +call addItem text, "Open Object Rexx (ooRexx by RexxLA)", 0 +call addItem text, "First released in 2004 by RexxLA", 1, .false + +document~setModified(.false) -- inhibit save-as popup +/* OOo OLE interface does not answer hasOleMethod('start') with .true + therefore forcing "start" to be dispatched to Windows */ +document~getPresentation~dispatch("start") -- start presentation + +say "double-check: dump NumberingLevel of each text paragraph:" +call dumpItems text -- demonstrates enumerating listing text + + +::routine addItem -- adds string at the given (0-based outline) level + use arg xText, string, level, bNewParagraph=.true + + xTR=xText~getEnd -- get XTextRange + xTR~setPropertyValue("NumberingLevel",level) -- set XTextRange level + xTR~setString(string) -- set string + + if bNewParagraph=.true then -- add new paragraph + xTR~getEnd~setString("0a"x) -- add linefeed character -> new paragraph + +::routine dumpItems -- show level and string from XText + use arg xText + + enum=xText~createEnumeration -- enumerate paragraphs + do i=1 while enum~hasMoreElements + xtr=enum~nextElement -- we need XTextRange's string & properties + nl=xtr~getPropertyValue("NumberingLevel") + say " item #" i": NumberingLevel="pp(nl) pp(xtr~getString) + end + return +pp: -- "pretty print", internal routine: return argument enclosed in square brackets + return "["arg(1)"]" diff --git a/modules/windows/ole/apps/AOO_swriter_paragraphs.rex b/modules/windows/ole/apps/AOO_swriter_paragraphs.rex new file mode 100755 index 0000000..83dc3eb --- /dev/null +++ b/modules/windows/ole/apps/AOO_swriter_paragraphs.rex @@ -0,0 +1,115 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/********************************************************************** + AOO_swriter_paragraphs.rex using OLE (object linking and embedding) with ooRexx + + Links: + + + + + Using OLE create a new swriter document, add paragraphs that get aligned + in four different ways. Demonstrates how to use UNO reflection and + incorporate UNO_CONSTANTS and UNO_ENUM values into a Rexx directory for + easier use. +***********************************************************************/ + +/* create a text document, demonstrate how to align paragraphs */ +serviceManager = .OLEObject~new('com.sun.star.ServiceManager') +/* create text document */ +desktop = serviceManager~createInstance('com.sun.star.frame.Desktop') +noProps = .array~new /* empty array (no properties) */ +document = desktop~loadComponentFromURL('private:factory/swriter', '_blank', 0, noProps) + +text = document~getText -- get text object +text~setString("Hello, this is ooRexx on:" .DateTime~new"!") +cursor = text~createTextCursor + +ctlChars = getAsDirectory(serviceManager, "com.sun.star.text.ControlCharacter") -- UNO_CONSTANT +paraBreak = ctlChars~paragraph_break -- get paragraph break constant + +paraAdj = getAsDirectory(serviceManager, "com.sun.star.style.ParagraphAdjust") -- UNO_ENUM + +arr = .array~of("right", "center", "block", "left") -- adjustments +do adj over arr -- iterate over adjustments, create string, adjust + cursor~gotoEnd(.false) -- position at end + text~insertControlCharacter(cursor, paraBreak, .false) + string = ("This paragraph will be" adj"-adjusted. ")~copies(8) + text~insertString(cursor, string, .true) + -- fetch appropriate adjust enum value from directory + cursor~setPropertyValue("ParaAdjust", paraAdj~send(adj)) +end + + +/* Routine returns a Rexx directory containing all names and values of the supplied + UNO_CONSTANTS or UNO_ENUM class name (needs to be fully qualified). */ +::routine getAsDirectory + use strict arg serviceManager, unoClzName + + dir = .Directory~new -- directory will get + dir~objectName = unoClzName -- allows to show the uno class it represents + + ctxt = serviceManager~defaultContext + tdm = ctxt~getValueByName("/singletons/com.sun.star.reflection.theTypeDescriptionManager") + reflClz= tdm~getByHierarchicalName(unoClzName) + if reflClz~isNil then return dir -- return empty directory + + typeClass = reflClz~getTypeClass + if typeClass = 30 then -- UNO_CONSTANTS + do + dir~objectName = unoClzName "(UNO_CONSTANTS)" -- supply type info to name + do c over reflClz~getConstants -- iterate over constant fields + name = c~getName -- fully qualified + name = name~substr(name~lastPos('.')+1) -- extract last word + dir[name] = c~getConstantValue -- store constant values with their names + -- say "name:" name "->" c~getConstantValue + end + end + else if typeClass = 15 then -- UNO_ENUMERATION + do + dir~objectName = unoClzName "(UNO_ENUM)" -- supply type info to name + enumNames = reflClz~getEnumNames -- get all enumeration names + enumValues = reflClz~getEnumValues -- get all enumeration values + do i=1 to enumNames~items + name = enumNames[i] + name = name~substr(name~lastPos('.')+1) -- extract last word + dir[name] = enumValues[i] -- store enum values with their names + -- say "name:" name "->" enumValues[i] + end + end + return dir diff --git a/modules/windows/ole/apps/AOO_swriter_table.rex b/modules/windows/ole/apps/AOO_swriter_table.rex new file mode 100755 index 0000000..a0cc262 --- /dev/null +++ b/modules/windows/ole/apps/AOO_swriter_table.rex @@ -0,0 +1,181 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/********************************************************************** + AOO_swriter_table.rex using OLE (object linking and embedding) with ooRexx + + Links: + + + + + This is the ooRexx version (which includes corrections) of the VBScript + "A Quick Tour" example from the AOO (Apache OpenOffice) DevGuide, chapter + "Automation_Bridge" documentation. + + Using OLE create a new swriter document, a TextTable, a TextFrame, paragraphs + and apply various formatings. +***********************************************************************/ + + -- The service manager is always the starting point + -- If there is no office running then an office is started up + objServiceManager= .OleObject~new("com.sun.star.ServiceManager") + + -- Create the Desktop + objDesktop= objServiceManager~createInstance("com.sun.star.frame.Desktop") + + -- Open a new empty writer document + args=.array~new + objDocument= objDesktop~loadComponentFromURL("private:factory/swriter", "_blank", 0, args) + + -- Create a text object + objText= objDocument~getText + + -- Create a cursor object + objCursor= objText~createTextCursor + + -- Inserting some Text + vbLf = "0a"x -- line-feed character + objText~insertString( objCursor, "The first line in the newly created text document."vbLf, .false) + + -- Inserting a second line + objText~insertString( objCursor, "Now we-- re in the second line", .false) + + -- Create instance of a text table with 4 columns and 4 rows + objTable= objDocument~createInstance( "com.sun.star.text.TextTable") + objTable~initialize( 4, 4 ) + + -- Insert the table + objText~insertTextContent( objCursor, objTable, .false) + + -- Get first row + objRows= objTable~getRows + objRow= objRows~getByIndex( 0) + + -- Set the table background color + objTable~setPropertyValue( "BackTransparent", .false) + objTable~setPropertyValue( "BackColor", 13421823) + + -- Set a different background color for the first row + objRow~setPropertyValue( "BackTransparent", .false) + objRow~setPropertyValue( "BackColor", 6710932) + + -- Fill the first table row + call insertIntoCell "A1","FirstColumn", objTable -- insertIntoCell is a helper function, see below + call insertIntoCell "B1","SecondColumn", objTable + call insertIntoCell "C1","ThirdColumn", objTable + call insertIntoCell "D1","SUM", objTable + + objTable~getCellByName("A2")~setValue( 22.5 ) + objTable~getCellByName("B2")~setValue( 5615.3 ) + objTable~getCellByName("C2")~setValue( -2315.7 ) + objTable~getCellByName("D2")~setFormula( "=sum ++" ) + + objTable~getCellByName("A3")~setValue( 21.5 ) + objTable~getCellByName("B3")~setValue( 615.3 ) + objTable~getCellByName("C3")~setValue( -315.7 ) + objTable~getCellByName("D3")~setFormula( "sum ++" ) + + objTable~getCellByName("A4")~setValue( 121.5 ) + objTable~getCellByName("B4")~setValue( -615.3 ) + objTable~getCellByName("C4")~setValue( 415.7 ) + objTable~getCellByName("D4")~setFormula( "sum ++" ) + + range=objTable~getCellRangeByName("A2:D4") + range~setPropertyValue("NumberFormat", 4) -- set number format + -- use ParaAdjust: com.sun.star.style.ParagraphAdjust.RIGHT + range~setPropertyValue("ParaAdjust", 1) -- align right + + -- Change the CharColor and add a Shadow + objCursor~setPropertyValue( "CharColor", 255) + objCursor~setPropertyValue( "CharShadowed", .true) + + -- Create a paragraph break + -- The second argument is a com::sun::star::text::ControlCharacter::PARAGRAPH_BREAK constant + objText~insertControlCharacter( objCursor, 0 , .false) + + -- Inserting colored Text. + objText~insertString( objCursor, " This is a colored Text - blue with shadow"vbLf, .false) + + -- Create a paragraph break ( ControlCharacter::PARAGRAPH_BREAK). + objText~insertControlCharacter( objCursor, 0, .false) + + -- Create a TextFrame~ + objTextFrame= objDocument~createInstance("com.sun.star.text.TextFrame") + + -- Create a Size struct~ + objSize = objServiceManager~Bridge_GetStruct("com.sun.star.awt.Size") + objSize~Width= 15000 + objSize~Height= 400 + objTextFrame~setSize( objSize) + + -- TextContentAnchorType.AS_CHARACTER = 1 + objTextFrame~setPropertyValue( "AnchorType", 1) + + -- insert the frame + objText~insertTextContent( objCursor, objTextFrame, .false) + + -- Get the text object of the frame + objFrameText= objTextFrame~getText + + -- Create a cursor object + objFrameTextCursor= objFrameText~createTextCursor + + -- Inserting some Text + objFrameText~insertString( objFrameTextCursor, "The first line in the newly created text frame.", - + .false) + objFrameText~insertString( objFrameTextCursor, - + vbLf"With this second line the height of the frame raises.", .false) + + -- Create a paragraph break + -- The second argument is a com::sun::star::text::ControlCharacter::PARAGRAPH_BREAK constant + objFrameText~insertControlCharacter( objCursor, 0 , .false) + + -- Change the CharColor and remove the Shadow + objCursor~setPropertyValue( "CharColor", 65536) + objCursor~setPropertyValue( "CharShadowed", .false) + + -- Insert another string + objText~insertString( objCursor, " That-- s all for now !!", .false) + +::routine insertIntoCell + use arg strCellName, strText, objTable + + objCellText= objTable~getCellByName( strCellName) + objCellCursor= objCellText~createTextCursor + objCellCursor~setPropertyValue( "CharColor",16777215) + objCellText~insertString( objCellCursor, strText, .false) diff --git a/modules/windows/ole/apps/Lotus123.rex b/modules/windows/ole/apps/Lotus123.rex new file mode 100755 index 0000000..56a1797 --- /dev/null +++ b/modules/windows/ole/apps/Lotus123.rex @@ -0,0 +1,132 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* Lotus123.rex: OLE Automation with ooRexx */ +/* */ +/* Create a new spreadsheet in 1-2-3 and fill in a table with fictive */ +/* revenue numbers. The table will also contain a calculated field */ +/* and different styles. A second sheet is added with a 3D chart */ +/* displaying the revenue data. */ +/* */ +/**********************************************************************/ + +/* create a new 123 Workbook */ +Workbook = .OLEObject~New("Lotus123.Workbook") +Range = Workbook~Ranges("A1") +Range~Contents = "Open Object Rexx OLE Sample spreadsheet" + +/* fill the first column with month names */ +Col = "A" +Row = 3 +Range = Workbook~Ranges(Col || Row) +Range~Contents = "Month" +Range~Font~FontName = "Times New Roman" +Range~Font~Bold = "True" + +Do Month = 1 To 12 + Row = Row + 1 + Range = Workbook~Ranges(Col || Row) + Range~Contents = '"' || Right(Month, 2, "0") || "/98" + Range~TextHorizontalAlign = "$AlignLeft" +End + +Row = Row + 1 +Range = Workbook~Ranges(Col || Row) +Range~Contents = "All 1998" +Range~Font~Bold = "True" + +/* fill the second column with random revenue numbers */ +Col = "B" +Row = 3 +Range = Workbook~Ranges(Col || Row) +Range~Contents = "Revenue" +Range~Font~FontName = "Times New Roman" +Range~Font~Bold = "True" + +Do Month = 1 To 12 + Row = Row + 1 + Range = Workbook~Ranges(Col || Row) + Range~Contents = Random(20000, 100000) + Range~FormatName = "US Dollar" + Range~FormatDecimals = 0 +End + +Row = Row + 1 +Range = Workbook~Ranges(Col || Row) +Range~Contents = "@SUM(B4..B15)" +Range~Font~Bold = "True" +Range~FormatName = "US Dollar" +Range~FormatDecimals = 0 + +/* put a grid around the table */ +Range = Workbook~Ranges("A3..B16") +Range~GridBorder~Style = "$SolidBorder" + +/* use thick bottom lines for title and sum lines */ +Range = Workbook~Ranges("A3..B3") +Range~BottomBorder~Style = "$DoubleBorder" +Range = Workbook~Ranges("A16..B16") +Range~TopBorder~Style = "$DoubleBorder" + + +/* create a 3d chart showing revenue over month */ +Sheet = Workbook~NewSheet("$Last", 1, "False") +Range = Workbook~Ranges("A:A4..A:B15") +Chart = Sheet~NewChart(0, 0, 12800, 9600, Range) +Chart~Is3D = .True +Chart~Title~Lines(1)~Text = "Revenue development 1998" +Chart~Legend~Visible = .False + +Chart~XAxis~Title~Text = "Month" +Chart~XAxis~Title~Font~Size = "36" +Chart~XAxis~TickLabels~Font~Size = "36" + +Chart~YAxis~Title~Text = "Revenue" +Chart~YAxis~Title~Font~Size = "36" +Chart~YAxis~TickLabels~Font~Size = "36" +Chart~YAxis~SubTitle~Visible = .False + +/* save spreadsheet as file OLETest */ +Workbook~SaveAs("OLETest") + +say "Created" workbook~name + +Workbook~Close + + diff --git a/modules/windows/ole/apps/LotusNotes_mail.rex b/modules/windows/ole/apps/LotusNotes_mail.rex new file mode 100755 index 0000000..ec86166 --- /dev/null +++ b/modules/windows/ole/apps/LotusNotes_mail.rex @@ -0,0 +1,91 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* LotusNotes_mail.rex: OLE Automation with ooRexx */ +/* */ +/* Create a mail message in Lotus Notes and send it to a number of */ +/* recipients automatically. */ +/* */ +/**********************************************************************/ + +say "Please enter your name" +parse pull yourName + +/* create an array of the recipients */ +Recipients = .array~new + +say "Please enter a list of recipients (email addresses). Press enter ", + "after each entry (end list with 'Q')." + +i = 0 +do until answer~translate == "Q" + parse pull answer + if answer~translate \= "Q" then do + i = i + 1 + Recipients[i] = answer + end +end + +/* Create Notes object */ +Session = .OLEObject~New("Notes.NotesSession") +MailServer = Session~GetEnvironmentString("MailServer", .True) +MailFile = Session~GetEnvironmentString("MailFile", .True) +MailDb = Session~GetDatabase(MailServer, MailFile) + +Say "Creating mail to be sent to" i "recipients..." +MailDoc = MailDb~CreateDocument +MailDoc~Form = "Memo" +MailDoc~Logo = "StdNotesLtr9" +MailDoc~From = yourName +MailDoc~Subject = "Rexx OLE automation test mail" + +/* create a new body text with multiple lines */ +NewBody = MailDoc~CreateRichTextItem("Body") +NewBody~AppendText("To the readers of this mail message:") +NewBody~AddNewLine(2) +NewBody~AppendText("This mail has been sent with Open Object Rexx for Windows.") +NewBody~AddNewLine(1) +NewBody~AppendText("It was created automatically at" Time("N") "on" Date("N")) +NewBody~AppendText(" and then sent without any user interacting with the program.") + +MailDoc~SendTo = Recipients +MailDoc~Save(.False, .False) +MailDoc~Send(.False, Recipients) + +Say "Mail has been sent" diff --git a/modules/windows/ole/apps/LotusWordPro.rex b/modules/windows/ole/apps/LotusWordPro.rex new file mode 100755 index 0000000..5669d11 --- /dev/null +++ b/modules/windows/ole/apps/LotusWordPro.rex @@ -0,0 +1,80 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* LotusWordPro.rex: OLE Automation with ooRexx */ +/* */ +/* Create a new document in WordPro 97, enter some text with */ +/* different attributes and finally save and print the document. */ +/* */ +/* Since no check is done do ensure the new document does not already */ +/* exist you will get a popup message from WordPro asking to */ +/* overwrite an already existing document when this sample is run */ +/* multiple times. */ +/* */ +/**********************************************************************/ + +WordProApp = .OLEObject~New("WordPro.Application") +WordProApp~NewDocument("AutomatedDocument.lwp","","default.mwp") +WPDoc = WordProApp~ActiveDocument +WPDocText = WordProApp~Text + +WordProApp~Type("This is the first paragraph entered from REXX via ") +WordProApp~Type("the OLE automation classes.[Enter]") + +WordProApp~Type("The second paragraph will be changed in its ") +WordProApp~Type("appearance.") +WordProApp~SelectParagraph +WPDocText~Font~Name = "Arial" +WPDocText~Font~Bold = .True +WPDocText~Font~Italic = .True +WPDocText~Font~Size = 15 + +WordProApp~Type("[End][Enter][End]Document created at:" Time("N") "on" Date("N")) + +WPDoc~Save + +/* if you want this document printed, comment in the next line */ +--WordProApp~PrintOut(1, 1, 1, .True) + +say "Created" WPDoc~Path"\"WPDoc~Name + +WPDoc~Close +WordProApp~Quit + + diff --git a/modules/windows/ole/apps/LotusWordPro_clickHereFields.mwp b/modules/windows/ole/apps/LotusWordPro_clickHereFields.mwp new file mode 100644 index 0000000000000000000000000000000000000000..054d194fff188dce4afe4a171677fd892f99db48 GIT binary patch literal 18388 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 literal 0 HcmV?d00001 diff --git a/modules/windows/ole/apps/LotusWordPro_clickHereFields.rex b/modules/windows/ole/apps/LotusWordPro_clickHereFields.rex new file mode 100755 index 0000000..491465e --- /dev/null +++ b/modules/windows/ole/apps/LotusWordPro_clickHereFields.rex @@ -0,0 +1,91 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* LotusWordPro_clickHereFields.rex: OLE Automation with ooRexx */ +/* */ +/* Create a new document in WordPro 97 with a provided Smartmaster. */ +/* Fill in some "Click here" fields with data prompted by the program */ +/* or queried from the system. Finally the document will be saved to */ +/* the same directory where this REXX program is located and sent to */ +/* the printer. */ +/* */ +/* Since no check is done do ensure the new document does not already */ +/* exist you will get a popup message from WordPro asking to */ +/* overwrite an already existing document when this sample is run */ +/* multiple times. */ +/* */ +/**********************************************************************/ + +/* determine path of this sample program */ +Parse Source . . ProgName +ProgPath = ProgName~Left(ProgName~LastPos("\")) + +/* determine the version of REXX currently running */ +Parse Version VersStr + +/* prompt user for some information */ +Say "Please enter your name:" +Parse Pull Name +If Name~Length = 0 Then + Name = "No name entered!" + +Say "Please enter your phone number:" +Parse Pull Phone +If Phone~Length = 0 Then + Phone = "No phone entered!" + +/* create a new document */ +WordProApp = .OLEObject~New("WordPro.Application") +docName = "LotusWordPro_clickHereFields.lwp" +smartMaster = "LotusWordPro_clickHereFields.mwp" +WordProApp~NewDocument(docName, ProgPath, ProgPath || smartMaster) + +/* replace the click here blocks in the document with the new values */ +WordProApp~Foundry~ClickHeres("YourName")~InsertText(Name) +WordProApp~Foundry~ClickHeres("YourPhone")~InsertText(Phone) +WordProApp~Foundry~ClickHeres("ProgramName")~InsertText(ProgName) +WordProApp~Foundry~ClickHeres("RexxVersion")~InsertText(VersStr) + +WordProApp~Save +--WordProApp~PrintOut(1, 1, 1, .True) + +WordProApp~Close(.False) +WordProApp~Quit + + diff --git a/modules/windows/ole/apps/MSAccessDemo.rex b/modules/windows/ole/apps/MSAccessDemo.rex new file mode 100644 index 0000000..16850c3 --- /dev/null +++ b/modules/windows/ole/apps/MSAccessDemo.rex @@ -0,0 +1,207 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2006-2024 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* + purpose: Demonstrate how one can interact with a MS Access databases using ActiveX/OLE + needs: MS Access installed + + links: + + +*/ + +accessApp =.OleObject~new("Access.Application") +dbFileName=directory()"\ooRexxDemo.mdb" -- define database file name +if SysFileExists(dbFileName) then -- open existing database + accessApp~openCurrentDatabase(dbFileName) +else + accessApp~newCurrentDatabase(dbFileName) -- create new database + +conn=accessApp~currentProject~connection -- get connection object + +call dropTable conn -- make sure table is dropped +call createTable conn -- create a table in the database +call fillTable conn -- enter records to the table +call showTable conn -- show presently stored records +call deleteAndShow conn -- delete a record, show results +call updateAndShow conn -- update a few records, show results +conn~close -- close connection to the database + +accessApp~closeCurrentDatabase -- close database +call compressAndRepair accessApp, dbFileName -- compress database + +say ".rexxInfo~architecture:" pp(.rexxInfo~architecture) "(bitness)" + +/* ------------------------------------------------------------------------- */ +::routine dropTable + use arg conn -- fetch connection to database + + signal on any -- intercept any exception + conn~execute("drop table myTable") -- execute SQL statement + say "dropped 'myTable'" + say center(" end of dropTable ", 70, "-") + say + return +any: + say "could not drop 'myTable' (does it exist?)" + say center(" end of dropTable ", 70, "-") + say + return + +/* ------------------------------------------------------------------------- */ +::routine createTable + use arg conn -- fetch connection to database + + sql="create table myTable (id integer, name text (30) )" + say "executing" pp(sql) "..." + conn~execute(sql) + say center(" end of createTable ", 70, "-") + say + +/* ------------------------------------------------------------------------- */ +::routine fillTable + use arg conn -- fetch connection to database + + -- define a few names to insert into the database + s=.set~of("Chip Davis", "Christian Michel", "David Ashley", - + "Erich Steinböck", "Florian Große-Coosmann", "Frank Clark", - + "Gil Barmwater", "Jan Engehausen", "Lavrentios Servissoglou", - + "Jean-Louis Faucher", "Kurt Märker", "Lee Peedin", - + "Manfred Schweizer", "Mark Hessling", "Mark Miesfeld", - + "Mike F. Cowlishaw", "Pam Taylor", "P.O. Jonsson", - + "Reiner Micke", "René Jansen", "Rick McGuire", - + "Rony G. Flatscher", "Stefan Dörsam", "Uwe Berger", - + "Walter Pachl" - + ) + + -- an entry in the .local or .environment directory can be referenced by using an + -- environment symbol, e.g. the entry "TOTAL.RECS" can be referred to with its + -- environment symbol ".TOTAL.RECS" (note the leading dot) from any Rexx program + .local~total.recs=s~items -- save number of records in local environment + say "inserting" pp(.total.recs) "record(s) into the table..." + say + + do counter c name over s -- iterate over collected items (arbitrary order) + sql="insert into myTable (id, name) values ("right(c,2)", '"name"' )" + say " " right(c,2)":" pp(sql) -- show sql statement + conn~execute(sql) -- execute the statement + end + say center(" end of fillTable ", 70, "-") + say + +/* ------------------------------------------------------------------------- */ +::routine showTable + use arg conn -- fetch connection to database + + sql="select * from myTable order by id" + rs=conn~execute(sql) + rs~moveFirst -- just make sure, it is pointing to the first record + do counter c while rs~eof=.false -- loop over record set + say " " right(c,2) - + "id="pp(rs~fields["id"]~value~right(2)) - + "name="pp(rs~fields["name"]~value) + rs~moveNext + end + rs~close + say center(" end of showTable ", 70, "-") + say + return + +/* ------------------------------------------------------------------------- */ +::routine deleteAndShow -- delete a random row + use arg conn -- fetch connection to database + + say "deleting a record from the table:" + say + -- delete row with an arbitrary value for the field "id" + sql="delete from myTable where id="random(1,.total.recs) + say " executing" pp(sql) "..." + + param=.OLEVariant~new(count) + conn~execute(sql, param) + say " " pp(param~!varValue_) "record deleted." + say + + .local~total.recs=.total.recs-1 -- adjust total number of records + + call showTable conn -- show presently stored records + +/* ------------------------------------------------------------------------- */ +::routine updateAndShow + use arg conn -- fetch connection to database + + say "updating a few records from the table:" + say + -- update some records randomly + sql="update myTable set id=id*3 where id >" random(1,.total.recs) + say " executing" pp(sql) "..." + param = .OLEVariant~new(count) + conn~execute(sql, param) + say " " pp(param~!varValue_) "record(s) affected." + say + + call showTable conn -- show presently stored records + +/* ------------------------------------------------------------------------- */ +::routine compressAndRepair + use strict arg accessApp, dbFileName + + say "before compress & repair, database file size:" pp(stream(dbFileName, "c", "query size")) + compressedName=SysTempFileName(dbFileName"-cmp???") -- get a unique new file name + + dbEngine=accessApp~DBEngine -- get database engine + dbEngine~compactDatabase(dbFileName, compressedName) -- carry out compact & repair + + say "after compress & repair, database file size:" pp(stream(compressedName, "c", "query size")) + -- create a unique backup file name containing date and time of backup + newBkpFileName=dbFileName"-bkp-"date("S")"-"time()~changestr(":","") + + say "renaming work files..." + -- rename original database file name to backup file name + cmdText="ren" '"'dbFileName'"' filespec("Name", newBkpFileName) + say "DOS command:" pp(cmdText) + address cmd cmdText -- use ADDRESS CMD explicitly + + -- now rename new compressed file to original databse file name + cmdText="ren" '"'compressedName'"' filespec("Name", dbFileName) + say "DOS command:" pp(cmdText) + cmdText -- this uses ADDRESS CMD implicitly + say center(" end of compressAndRepair ", 70, "-") + say + +/* ------------------------------------------------------------------------- */ +::routine pp -- "pretty print" ;) + return "[" || arg(1) || "]" diff --git a/modules/windows/ole/apps/MSAccessDemo_32bit_only.rex b/modules/windows/ole/apps/MSAccessDemo_32bit_only.rex new file mode 100755 index 0000000..3dc5e21 --- /dev/null +++ b/modules/windows/ole/apps/MSAccessDemo_32bit_only.rex @@ -0,0 +1,307 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2006-2024 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* + purpose: Demonstrate how one can interact with Jet (MS Access) databases using ActiveX/OLE + needs: MS Access resp. the JetEngine installed + + notes: This sample can only run on a 32-bit ooRexx. The Jet Engine can not + read Office 2007 database file formats. Therefore, we check if + Access is 2007, and if so, force the database to be created in + Access 2003 format. Look at the createDataBaseFile() routine for + how this is done. + + This sample uses some public routines from the oleUtils framework. + getAddressingMode() + createOleObject() + + links: + + +*/ + +-- This first function just checks to be sure the sample can execute on the +-- current system. Look at the function code at the end of the file for the +-- details. The function returns the oleObject, access application object, on +-- success and .nil if this sample can not run on the current system. +accessApplication = checkSystem() +if accessApplication == .nil then return + + +dbFileName=directory()"\ooRexxDemo.mdb" -- define database file name +call createDataBaseFile dbFileName, accessApplication -- create database file, if necessary + +conn=.oleobject~new("ADODB.Connection") -- create an ADO conncection to the database +conn~provider="Microsoft.Jet.OLEDB.4.0" -- tell the connection what driver to use + +conn~open(dbFileName) -- open a connection to the database + +call dropTable conn -- make sure table is dropped +call createTable conn -- create a table in the database +call fillTable conn -- enter records to the table +call showTable conn -- show presently stored records +call deleteAndShow conn -- delete a record, show results +call updateAndShow conn -- update a few records, show results + +conn~close -- close connection to the database + +call compressAndRepair dbFileName + +::requires 'oleUtils.frm' + +::routine createDataBaseFile + use strict arg dbFileName, appAccess + + if stream(dbFileName, "c", "query exists")="" then -- database file does not exist + do + -- We have to know if this is Access 2007 or not. The Jet Engine can not + -- read the Access 2007 default file format. So, if this is Access 2007, + -- we force the database to be created Access 2002-2003 format. + + -- create the database file + if appAccess~version >= 12 then do + formatConstant = appAccess~getConstant('acNewDatabaseFormatAccess2002') + appAccess~NewCurrentDatabase(dbFileName, formatConstant) + + -- With Access 2007, we have to explicitly close the database, or the + -- Jet Engine can not open it. Prior to Access 2007, this step is not + -- needed. + appAccess~closeCurrentDatabase + end + else do + -- Prior to Access 2007, the NewCurrentDatabase only takes 1 argument. + appAccess~NewCurrentDatabase(dbFileName) + end + say "created database file" pp(dbFileName) + end + else + say "database file" pp(dbFileName) "exists already" + + say center(" end of createDataBaseFile ", 70, "-") + say + + -- This is the last place in this example where the Access application object + -- is needed. So we close it now. All the work is actually done by the Jet + -- Engine. + appAccess~quit + + +::routine dropTable + use arg conn -- retrieve connection to database + + signal on any -- intercept any exception + conn~execute("drop table myTable") -- execute SQL statement + say "dropped 'myTable'" + say center(" end of dropTable ", 70, "-") + say + return +any: + say "could not drop 'myTable'" + say condition("C") condition("D") + say center(" end of dropTable ", 70, "-") + say + return + +::routine createTable + use arg conn -- retrieve connection to database + + sql="create table myTable (id integer, name text (30) )" + say "executing" pp(sql) "..." + conn~execute(sql) + say center(" end of createTable ", 70, "-") + say + +::routine fillTable + use arg conn -- retrieve connection to database + + -- define a few names to insert into the database + s=.set~of("Chip Davis", "Christian Michel", "David Ashley", - + "Florian Große-Coosmann", "Frank Clark", "Gil Barmwater", - + "Jan Engehausen", "Lavrentios Servissoglou", "Lee Peedin", - + "Manfred Schweizer", "Mark Hessling", "Pam Taylor", - + "Reiner Micke", "René Jansen", "Rick McGuire", - + "Rony G. Flatscher", "Stefan Dörsam", "Uwe Berger", - + "Walter Pachl", "Mark Miesfeld" - + ) + + .local~tmp.nrRecs=s~items -- save number of records in local environment + .local~tmp.length=length(.tmp.nrRecs) -- save length + + say "inserting" pp(.tmp.nrRecs) "record(s) into the table..." + say + + i=0 + do name over s -- iterate over collected items (arbitrary order) + i=i+1 -- calc unique id value + sql="insert into myTable (id, name) values ("i~right(.tmp.length)", '"name"' )" + say " " i~right(.tmp.length)":" pp(sql) -- show sql statement + conn~execute(sql) -- execute the statement + end + say center(" end of fillTable ", 70, "-") + say + + +::routine showTable + use arg conn -- retrieve connection to database + + rs=.oleObject~new("ADODB.Recordset") -- create an ADO recordset object + + rs~CursorType = 1 -- .ole.const~adOpenKeyset + rs~LockType = 3 -- .ole.const~adLockOptimistic + sql="select * from myTable order by id" + rs~open(sql, conn) -- open the table + totRecs=rs~recordCount -- get recordCount + say "nr. of records:" pp(totRecs)":" + say + rs~moveFirst -- just make sure, it is pointing to the first record + do i=1 to totRecs while rs~eof=.false -- loop over record set + say " " i~right(.tmp.length)":" - + "id="pp(rs~fields["id"]~value~right(.tmp.length)) - + "name="pp(rs~fields["name"]~value) + rs~moveNext + end + rs~close + say center(" end of showTable ", 70, "-") + say + +::routine deleteAndShow + use arg conn -- retrieve connection to database + + say "deleting a record from the table:" + say + -- delete row with an arbitrary value for the field "id" + sql="delete from myTable where id="random(1,.tmp.nrRecs) + say " executing" pp(sql) "..." + conn~execute(sql) + say + + .local~tmp.nrRecs=.tmp.nrRecs-1 -- subtract 1 from total number of records + .local~tmp.length=length(.tmp.nrRecs) -- save length + + call showTable conn -- show presently stored records + +::routine updateAndShow + use arg conn -- retrieve connection to database + + say "updating a few records from the table:" + say + -- update some records randomly + sql="update myTable set id=id*3 where id >" random(1,.tmp.nrRecs) + say " executing" pp(sql) "..." + param = .OLEVariant~new(count) + conn~execute(sql, param) + say " " pp(param~!varValue_) "record(s) affected." + say + + call showTable conn -- show presently stored records + + +::routine compressAndRepair -- Jet (= MS Access) databases tend to grow considerably + parse arg dbFileName + + say "before compress & repair, database file size:" pp(stream(dbFileName, "c", "query size")) + compressedName=SysTempFileName(dbFileName"-cmp???") -- get a unique new file name + +/* + -- Hint: if your MDB-database is secured with a database password, you must supply + -- that password in the variable "pw": + + if pw="" then pwdString="" + else pwdString=";Jet OLEDB:Database Password="pw + + fromString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="dbFileName || pwdString + toString ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="compressedName || pwdString +*/ + + -- Hint: MDB database files have no database password set + fromString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="dbFileName + toString ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="compressedName + + + jro=.oleObject~new("JRO.JetEngine") + jro~compactDatabase(fromString, toString) -- carry out compact & repair + say "after compress & repair, database file size:" pp(stream(compressedName, "c", "query size")) + + -- create a unique backup file name containing date and time of backup + newBkpFileName=dbFileName"-bkp-"date("S")"-"time()~changestr(":","") + + say "renaming work files..." + -- rename original database file name to backup file name + cmdText="ren" '"'dbFileName'"' filespec("Name", newBkpFileName) + say "DOS command:" pp(cmdText) + address cmd cmdText -- use ADDRESS CMD explicitly + + -- now rename new compressed file to original databse file name + cmdText="ren" '"'compressedName'"' filespec("Name", dbFileName) + say "DOS command:" pp(cmdText) + cmdText -- this uses ADDRESS CMD implicitly + say center(" end of compressAndRepair ", 70, "-") + say + + +::routine pp + return "[" || arg(1) || "]" + +::routine checkSystem + + mode = getAddressingMode() + if mode == 64 then do + say + say 'You are running a 64-bit compiled ooRexx' + say + say 'This sample relies on the Microsoft Jet Database Engine.' + say 'There is no 64-bit version of Jet, therefore a 64-bit' + say 'compiled ooRexx can not run this sample. This sample' + say 'may be upgraded in the future to work with Access 2007' + say 'and its Microsoft Access Engine (ACE). ACE is also' + say '32-bit. It is not clear at the current time whether ACE' + say 'will be ported to 64-bit.' + say + say 'Sorry, this sample is 32-bit only.' + + return .nil + end + + -- We have to have Access, exit gracefully if not. + accessApplication = createOleObject("Access.Application", .true) + if accessApplication == .nil then do + say + say 'This example requires Microsoft Access, which does not seem' + say 'to be installed. Quitting.' + end + + return accessApplication + diff --git a/modules/windows/ole/apps/MSAccess_contacts.rex b/modules/windows/ole/apps/MSAccess_contacts.rex new file mode 100755 index 0000000..05acb5b --- /dev/null +++ b/modules/windows/ole/apps/MSAccess_contacts.rex @@ -0,0 +1,93 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* MSAccess_contacts.rex: OLE Automation with ooRexx */ +/* */ +/* Creating a database in Microsoft Access. */ +/* */ +/**********************************************************************/ + +-- Initialize string to database path. +-- get TEMP directory of current user +tempDir = value("TEMP",,"ENVIRONMENT") -- get value of environment variable "TEMP" +strDB = tempDir"\newDatabaseByooRexx.mdb" -- define fully qualified database name +say "Fully qualifed database file name:" strDB + +-- Remove any previously created copy of this sample database +if stream(strDB,'c','query exists') \= '' then + do + say 'Database exists (from earlier run), deleting it ...' + rv = SysFileDelete(strDB) + if rv \= 0 then + do + say 'Delete of previous database failed, exiting now' + exit -1 -- return code not 0 so to indicate problem + end + end + +-- Create new instance of Microsoft Access. +appAccess = .OLEObject~new("Access.Application") + +-- Open database in Microsoft Access window. +appAccess~NewCurrentDatabase(strDB) + +-- Get Database object variable. +dbs = appAccess~CurrentDb + +-- Create new table. +tdf = dbs~CreateTableDef("Contacts") + +-- Create field in new table. +/* Please note how to access the constant. + Microsoft documentation and the MS OLEViewer output + these constants as dbText, dbBinary, etc. - the type library + however prints them as DB_TEXT, DB_BINARY, etc.. Unless + documentation is found why the names should be translated, + the OLE code will *NOT* convert the names. */ +fld = tdf~CreateField("CompanyName", appAccess~getConstant("db_Text"), 40) + +-- Append Field and TableDef objects. +tdf~Fields~Append(fld) +dbs~TableDefs~Append(tdf) + +appAccess~quit + +-- keep window open if invoked via Explorer to allow reading the output +say "Press enter to continue ..." +parse pull . diff --git a/modules/windows/ole/apps/MSExcel.rex b/modules/windows/ole/apps/MSExcel.rex new file mode 100755 index 0000000..1c53536 --- /dev/null +++ b/modules/windows/ole/apps/MSExcel.rex @@ -0,0 +1,120 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* MSExcel.rex: OLE Automation with ooRexx */ +/* */ +/* Create Microsoft Excel sheet, enter some data and save it. */ +/* */ +/**********************************************************************/ + +excelApplication = .OLEObject~new("Excel.Application") +excelApplication~visible = .true -- make Excel visible +Worksheet = excelApplication~Workbooks~Add~Worksheets[1] + +colTitles = "ABCDEFGHI" -- define first nine column letters +lastLine = 12 -- number of lines to process + + /* HINT: if your local Excel user interface language is not English, you may need to rename the + function name 'sum' to your user interface language, e.g. in German to 'summe' */ +sumFormula = "=sum(?2:?"lastLine-1")" -- English formula: question marks will be changed to column letter +say "sumFormula: " sumFormula "(question marks will be changed to column letter)" + +xlHAlignRight = excelApplication~getConstant("xlHAlignRight") -- get value of "horizontal align right" constant + +do line = 1 to lastLine -- iterate over lines + do col = 1 to colTitles~length -- iterate over columns + colLetter = colTitles[col] -- get column letter + cell = Worksheet~Range(colLetter||line) -- e.g. ~Range("A1") + + if line = 1 then do -- first row? yes, build title + cell~value = "Type" colLetter -- header in first row + cell~font~bold = .true -- make font bold + cell~Interior~ColorIndex = 36 -- light yellow + cell~style~horizontalAlignment = xlHAlignRight -- right adjust title + end + else if line = lastLine then do -- last row? yes, build sums + /* set formula, e.g. "=sum(B2:B9)" */ + cell~formula = sumFormula~changeStr("?",colLetter) -- adjust formula to column to sum up + cell~Interior~ColorIndex = 8 -- light blue + end + else do -- a row between 2 and 9: fill with random values + cell~value = random(999999) / 100 -- create a random decimal value + cell~font~ColorIndex = 11 -- set from black to violet + end + end +end + + -- check whether Excel's user interface language causes the "#NAME?" error, if so advice +sumCell = WorkSheet~range("A"lastLine) -- get sum-cell of column A +if sumCell~text = "#NAME?" then +do + say + say "** Excel reports a '#NAME?' error for the 'sum' function! Probable cause: **" + say "** your local Excel user interface language is not set to English, therefore you need **" + say "** to adjust the function name 'sum' in the variable 'sumFormula' to your user interface **" + say "** language and rerun this program (e.g. in German you need to rename 'sum' to 'summe') **" + say "** sumCell~formula:" sumCell~formula + say "** sumCell~text: " sumCell~text + say "** sumCell~value: " sumCell~value + say +end + + -- create a format string for our numbers, use thousands and decimal separators +formatString = "#"excelApplication~thousandsSeparator"##0"excelApplication~decimalSeparator"00" +say "formatString: " formatString -- show format string + +excelApplication~useSystemSeparators = .false -- allow our format string to be used everywhere +stringRange="A2:"colTitles~right(1)lastLine +say "formatting range:" stringRange +WorkSheet~range(stringRange)~numberFormat = formatString -- get range and set its number format + + -- make sure that file gets quietly overwritten in case it exists already +excelApplication~DisplayAlerts = .false -- no alerts from now on + +/* save sheet in user's home directory */ +homeDir = value("USERPROFILE",,"ENVIRONMENT")-- get value for environment variable "USERPROFILE" +fileName = homeDir"\samp09_ooRexx.xlsx" -- build fully qualified filename +say "fully qualified fileName:" fileName -- show fully qualifed filename +Worksheet~SaveAs(fileName) -- save file + + -- let the user inspect the Excel file +say "Excel sheet got saved to file, press enter to continue ..." +parse pull . -- wait for user to press enter +excelApplication~Quit -- close Excel + diff --git a/modules/windows/ole/apps/MSExcel_cURL.rex b/modules/windows/ole/apps/MSExcel_cURL.rex new file mode 100644 index 0000000..ff62c80 --- /dev/null +++ b/modules/windows/ole/apps/MSExcel_cURL.rex @@ -0,0 +1,88 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022-2024 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/********************************************************************** + MSExcel_cURL.rex: using OLE (object linking and embedding) with ooRexx + + Get temperature from using cURL, documentation can be found + at . + + Note: cURL is included by default since Windows 10 build 17063. + + Links: + + + + Using OLE create a new Microsoft Excel worksheet, query the weather with + the cURL command and insert the received data. Using the worksheet temperature + data create a simple chart. + +***********************************************************************/ + +-- Get information using curl, save results in array +cityArr = .array~of("Vienna", "Graz", "Linz", "Salzburg", "Innsbruck", "Klagenfurt", "Bregenz", "Eisenstadt", "Sankt-Poelten", "Wien") +cityWeather = .array~new -- array for weather information +do counter i name over cityArr + command='curl https://wttr.in/'name'?format="%l:+%t"' -- https://github.com/chubin/wttr.in + say "#" i":" command -- give user feedback + outArr = .array~new -- array for stdout + ADDRESS SYSTEM command with output using (outArr) error using (.array~new) + cityWeather~append(outArr[1]) -- append output to array +end + +-- Start Excel with empty worksheet +excelApplication = .OLEObject~new("Excel.Application") +excelApplication~visible = .true -- make Excel visible +Worksheet = excelApplication~Workbooks~Add~Worksheets[1] -- add worksheet +-- Create bold collum header in first row +colhead = .array~of("City", "Celsius") -- array with header text +do counter col name over colhead + Worksheet~cells(1,col)~Value = name -- insert items from array + Worksheet~cells(1,col)~font~bold = .true -- make bold +end +-- Insert information from gained with curl +do counter row name over cityWeather + parse var name city ":" temperature "°C" -- parse curled informations + Worksheet~cells(row+1,1)~Value = city -- city in collum 1 + Worksheet~cells(row+1,2)~Value = temperature -- temperature in collum 2 +end +-- Select range for chart, use left upper and lower right cell location +Worksheet~Range("A1:B" || (row+1))~Select -- include title row +-- Add Chart +excelApplication~Charts~Add -- create new chart +excelApplication~ActiveChart~HasTitle = .True -- add title +excelApplication~ActiveChart~ChartTitle~Characters~Text = "Temperature" diff --git a/modules/windows/ole/apps/MSExcel_usingRexxArray.rex b/modules/windows/ole/apps/MSExcel_usingRexxArray.rex new file mode 100755 index 0000000..dd5b53d --- /dev/null +++ b/modules/windows/ole/apps/MSExcel_usingRexxArray.rex @@ -0,0 +1,95 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/********************************************************************** + MSExcel_usingRexxArray.rex: using OLE (object linking and embedding) with ooRexx + + Links: + + + + Using OLE create a new Microsoft Excel, create and place additional + sheets, rename sheets, iterate over sheets, fill in first sheet with generated data + from an ooRexx array, create a chart from the data. + +***********************************************************************/ + +excel = .OleObject~new("Excel.Application") +excel~visible = .true -- show Excel +book = excel~workbooks~add -- create a workbook +sheet = book~worksheets(1) -- get first sheet (exists always) from workbook +sheet1 = book~worksheets~add(sheet) -- add and get a sheet before previous "sheet" +book~worksheets~add(,sheet) -- add and get sheet after "sheet" + +do counter c ws over book~worksheets-- rename the worksheets sequentially + ws~name="Sheet #" c +end +sheet1~name = sheet1~name "(data)" -- add hint to name of first work sheet + +say "do i=1 to book~worksheets~count:" -- use: do i=1 ... +do i=1 to book~worksheets~count -- list all worksheets by name + say "... i="i":" book~worksheets(i)~name +end +say + +say "do counter c ws over book~worksheets:" -- use: do...over +do counter c ws over book~worksheets -- list all worksheets by name + say "... c="c":" ws~name +end + +-- set titles from an ooRexx array +sheet1~range("A1:C1")~value = ("Delivered", "En route", "To be shipped") +-- define data range and set its data from an ooRexx array +sheet1~range("A2:C7")~value = createData(6) -- create and assign ooRexx array + +/* cf. */ +chart = excel~charts~add -- get the chart collection, add and get a new chart +chart~chartType = excel~getConstant("xlAreaStacked") +plotBy = excel~getConstant("xlColumns") +chart~setSourceData(sheet1~range("A1:C7"), plotBy) -- includes titles +chart~hasTitle = .true +chart~chartTitle~text = "A Chart by ooRexx (".DateTime~new")" + +::routine createData -- create arbitrary data using Rexx' random(min,max) function + use arg items=5 + arr=.array~new -- create Rexx array + do i=1 to items -- create random numbers + arr[i,1] = random( 50,2000) + arr[i,2] = random(100,2500) + arr[i,3] = random(150,1500) + end + return arr -- return Rexx array diff --git a/modules/windows/ole/apps/MSInternetExplorer_events.rex b/modules/windows/ole/apps/MSInternetExplorer_events.rex new file mode 100755 index 0000000..ea2b15a --- /dev/null +++ b/modules/windows/ole/apps/MSInternetExplorer_events.rex @@ -0,0 +1,94 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* MSInternetExplorer_events.rex: OLE Automation with ooRexx */ +/* */ +/* Using events with the Internet Explorer: */ +/* Navigate to the IBM homepage and disallow changing the URL to a */ +/* page not in that "address space". */ +/* */ +/**********************************************************************/ + +/* instantiate an instance of the Internet Explorer */ +myIE = .watchedIE~new("InternetExplorer.Application","WITHEVENTS") + +myIE~visible = .true +myIE~navigate("http://www.ibm.com/") + +/* wait for the OnQuit event of the browser to change */ +/* the !active attribute of the REXX object to false */ +myIE~!active = .true +do while myIE~!active = .true + call syssleep 2 +end + +/* this class is derived from OLEObject and contains several */ +/* methods that will be called when certain events take place. */ +::CLASS watchedIE SUBCLASS OLEObject + +/* this is an event of the Internet Explorer */ +::METHOD BeforeNavigate2 + /* these are the arguments of this event. Cancel is an out parameter and */ + /* will be set to the return value of the method when it was processed. */ + /* have a look at the documentation for a detailed description of events.*/ + use arg pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel + + /* default: do not stop loading of this URL */ + stopLoading = .false + + /* if the target URL does not begin with "http://www.ibm.com/", don't */ + /* load it... try this by typing a different URL into the address field */ + /* when this sample is running. */ + if URL~substr(1,19) \= "http://www.ibm.com/" then do + stopLoading = .true + say "Refusing to load" URL + end + + return stopLoading + +/* this is an event of the Internet Explorer */ +::METHOD TitleChange + use arg Text + say "The title has changed to:" text + +/* this is an event of the Internet Explorer */ +::METHOD OnQuit + self~!active = .false -- terminates the waiting loop in main code + +::METHOD !active ATTRIBUTE -- store the active attribute diff --git a/modules/windows/ole/apps/MSInternetExplorer_getMethods.rex b/modules/windows/ole/apps/MSInternetExplorer_getMethods.rex new file mode 100755 index 0000000..41c0246 --- /dev/null +++ b/modules/windows/ole/apps/MSInternetExplorer_getMethods.rex @@ -0,0 +1,60 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/********************************************************************** + + MSInternetExplorer_getMethods.rex: using OLE (object linking and embedding) with ooRexx + + -- cf. "winextensions.pdf", "Example 8.11. OLEObject - getKnownMethods method" + + Link: + + Query and list all known methods from Microsoft Internet Explorer + +***********************************************************************/ +myOLEObject = .OLEObject~new("InternetExplorer.Application") +methods. = myOLEObject~getKnownMethods + +if methods. == .nil then + say "Sorry, no information on the methods available!" +else do + say "The following methods are available to this OLE object:" + do i = 1 to methods.0 + say methods.i.!NAME + end +end +exit diff --git a/modules/windows/ole/apps/MSInternetExplorer_navigate.rex b/modules/windows/ole/apps/MSInternetExplorer_navigate.rex new file mode 100755 index 0000000..1e6e312 --- /dev/null +++ b/modules/windows/ole/apps/MSInternetExplorer_navigate.rex @@ -0,0 +1,75 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* MSInternetExplorer_navigate.rex: OLE Automation with ooRexx */ +/* */ +/* Start Internet Explorer and show the IBM homepage. After 10 seconds*/ +/* the RexxLA events page will be displayed for 10 seconds. */ +/* */ +/**********************************************************************/ + +/* create an object for IE */ +myIE = .OLEObject~New("InternetExplorer.Application") + +myIE~Width = 1000 +myIE~Height = 800 +Say "current dimensions of Internet Explorer (IE) are:" myIE~Width "by" myIE~Height + +/* set new dimensions and browse IBM homepage */ +Say "changing IE dimensions ..." +myIE~Width = 1280 +myIE~Height = 1024 +Say "IE dimensions changed to:" myIE~Width "by" myIE~Height +Say "making IE visible ..." +myIE~Visible = .True -- now show the window +say "navigating to:" "https://www.ibm.com" +myIE~Navigate("https://www.ibm.com") + +/* wait for 10 seconds */ +say "now sleeping for 10 seconds ..." +Call SysSleep 10 + +/* browse RexxLA event page */ +say "navigating to:" "https://www.rexxla.org/events" +myIE~Navigate("https://www.rexxla.org/events") + +/* wait for 10 seconds */ +say "now sleeping for 10 seconds before quitting ..." +Call SysSleep 10 +myIE~quit diff --git a/modules/windows/ole/apps/MSInternetExplorer_search.rex b/modules/windows/ole/apps/MSInternetExplorer_search.rex new file mode 100755 index 0000000..d5dc2e5 --- /dev/null +++ b/modules/windows/ole/apps/MSInternetExplorer_search.rex @@ -0,0 +1,159 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* MSInternetExplorer_search.rex: OLE Automation with ooRexx */ +/* */ +/* Using events with the Internet Explorer: */ +/* Search for the string "Cloud" on the IBM web page and go randomly */ +/* to one of the found sites. */ +/* */ +/* Note that this sample no longer seems to work using IE9 on */ +/* Windows. Invoking the click() method on the Search button seems */ +/* have no effect. Geting the form instead fo the button and */ +/* invoking submit() also doesn't work. */ +/**********************************************************************/ + + +/* instantiate an instance of the Internet Explorer */ +myIE = .controlledIE~new("InternetExplorer.Application","WITHEVENTS") + +myIE~visible = .true +myIE~navigate("http://www.ibm.com/") + +myIE~wait /* wait for page to be loaded */ + +doc = myIE~document + +/* set query field on the IBM page to Cloud */ +textInput = doc~GetElementById("q") +if textInput == .nil then do + say "Failed to get text input object." + say "Website may have changed, aborting." + myIE~quit + return 99 +end + +textInput~value = "Cloud" + +/* click on the search image to submit the query */ +submitInput = doc~getElementById("ibm-search") +if submitIput == .nil then do + say "Failed to get submit input object." + say "Website may have changed, aborting." + + myIE~quit + return 99 +end + +submitInput~click + +myIE~wait /* wait for page to be loaded */ + +/* get the new page */ +doc = myIE~document +all = doc~GetElementsByTagName("A") /* get all elements */ + +/* get all links to Cloud pages into a table */ +cloudlinks = .table~new + +j = 1 +do i over all + if i~innertext~pos("Cloud") > 0 |, + i~innertext~pos("Downloads") > 0 |, + i~innertext~pos("Learning") > 0 |, + i~innertext~pos("Produkte") > 0 then do + cloudlinks~put(i~href,j) + j = j + 1 + end +end +if cloudlinks~items < 1 then do + msg = "No links were found. Submitting the search" || .endOfLine || - + "probably failed. This happens with IE9" || .endOfLine || - + "on Windows 7." + ret = RxMessageBox(msg, "Done", "OK", "INFORMATION") + signal on syntax -- in case the user closes the MSIE window before the RxMessageBox + myIE~quit +syntax: + return 99 +end + +/* select one of the Cloud links randomly... */ +choice = random(1,cloudlinks~items) +hint="randomly picked Cloud page link #" choice"/"cloudlinks~items +say "Navigating to" hint + +/* ...and go there */ +myIE~navigate(cloudlinks~at(choice)) +myIE~wait + +/* wait for user to acknowledge, then shut down example */ +call RxMessageBox "We're now at a" hint, "Done", "OK", "INFORMATION" + +signal on syntax -- in case the user closes the MSIE window before the RxMessageBox +myIE~quit +syntax: + +exit + + + +/* this class is derived from OLEObject and contains two methods */ +/* that will be called when certain events take place. */ +::CLASS controlledIE SUBCLASS OLEObject + +::METHOD init + self~block = .true + forward class(super) + +::METHOD block ATTRIBUTE + +/* this is a helper method */ +::METHOD wait + do until self~block == .false + call SysSleep 1 + end + return + +/* this event takes several parameters, but all can be ignored here */ +::METHOD BeforeNavigate2 + self~block = .true + +/* when this event takes place, the block attribute is set to false */ +::METHOD DocumentComplete + self~block = .false diff --git a/modules/windows/ole/apps/MSInternetExplorer_stockPrice.rex b/modules/windows/ole/apps/MSInternetExplorer_stockPrice.rex new file mode 100755 index 0000000..14a8531 --- /dev/null +++ b/modules/windows/ole/apps/MSInternetExplorer_stockPrice.rex @@ -0,0 +1,100 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* MSInternetExplorer_stockPrice.rex: OLE Automation with ooRexx */ +/* */ +/* Get stock price from IBM internet page with Microsoft Internet */ +/* Explorer and store it in a REXX variable. */ +/* */ +/**********************************************************************/ + +/* Get stock price from IBM internet page with MS IE and OLE */ + +say "Getting stock price from IBM Internet page." +say + +Explorer = .OLEObject~new("InternetExplorer.Application") +Explorer~Visible = .true +Explorer~Navigate("http://www.ibm.com/investor/") + +-- Wait for browser to load the page, with a time out. If the page is not +-- loaded by the timout, then quit. +count = 0 +do while Explorer~busy & count < 12 + do while Explorer~readyState <> 4 & count < 12 + j = SysSleep(.5) + count += 1 + end +end + +if Explorer~busy | Explorer~readyState <> 4 then do + say 'Timed out waiting for page: http://www.ibm.com/investor/' + say 'to load. Going to quit.' + Explorer~quit + return 99 +end + +/* obtain text representation of the page */ +doc = Explorer~document -- DOM document +body = doc~body -- get BODY +textrange = body~CreateTextRange -- get TextRange +text = textrange~Text -- get the contents + +/* extract stock price information, this is dependent on page not changing */ +parse var text . "(NYSE)" '0d0a'x stockprice "0d0a"x . +if stockprice = "" then do + stockprice = "" + gotPrice = .false +end +else do + gotPrice = .true +end + +if gotPrice = .false then +do + say "Press enter to continue ..." + parse pull +end + +/* end Explorer */ +Explorer~quit + +say "IBM stocks are at" stockprice"." +if \ gotPrice then say "Web page has likely changed format." + diff --git a/modules/windows/ole/apps/MSOutlook.rex b/modules/windows/ole/apps/MSOutlook.rex new file mode 100644 index 0000000..8f38f7d --- /dev/null +++ b/modules/windows/ole/apps/MSOutlook.rex @@ -0,0 +1,72 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/********************************************************************* + + MSOutlook.rex: using OLE (object linking and embedding) with ooRexx + + Links: + + + + Open Microsoft Outlook and show inbox. Count mails in inbox, + show sender of all mails currently in inbox, then wait for 10 seconds. + +*********************************************************************/ + + Outlook = .OLEObject~new("Outlook.Application") + NameSpace = Outlook~GetNamespace("MAPI") + + -- In Outlook folder have numbers: + -- DeletedItems (3), Outbox (4), SentMail (5), Inbox (6), + -- Calendar (9), Contacts (10), Journal (11), Notes (12), + -- Tasks (13) + Inbox = NameSpace~GetDefaultFolder("6") -- selects Inbox + + -- makes Outlook visible and shows Inbox + Inbox~Display + + InboxItems = Inbox~Items + MailCount = InboxItems~Count -- count items in Inbox + say "You have" MailCount "Mail(s) in your Inbox:" + -- may require to allow access to email information + Do ItemNumber = 1 to MailCount -- go through each item + Item = Inbox~Items(ItemNumber) + Sender = Item~Sender~Name -- sender of item + say "#" ItemNumber"." Sender + end + +Call SysSleep 10 diff --git a/modules/windows/ole/apps/MSOutlook_monitorInbox.rex b/modules/windows/ole/apps/MSOutlook_monitorInbox.rex new file mode 100755 index 0000000..dd8ccde --- /dev/null +++ b/modules/windows/ole/apps/MSOutlook_monitorInbox.rex @@ -0,0 +1,147 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/********************************************************************* + + MSOutlook_monitorInput.rex: using OLE (object linking and embedding) with ooRexx + + -- cf. "winextensions.pdf", "Example 8.3. OLEObject - Monitor Outlook" + + Links: + + + + Open Microsoft Outlook, attach an ooRexx "ItemAdd" event listener + to monitor the inbox for adding new mails. The program takes commands + by watching every second whether one of the files 'pause.monitor', + 'restart.monitor' or 'stop.monitor' got created in the meantime by the user. + +*********************************************************************/ + +/* Monitor OutLook for new mail */ + say; say; say 'ooRexx Mail Monitor version 1.0.0' + + outLook = .oleObject~new("Outlook.Application") + + inboxID = outLook~getConstant(olFolderInBox) + inboxItems = outLook~getNameSpace("MAPI")~getDefaultFolder(inboxID)~items + + if \ inboxItems~isConnectable then do + say 'Inbox items is NOT connectable, quitting' + return 99 + end + + inboxItems~addEventMethod("ItemAdd", .methods~printNewMail) + inboxItems~connectEvents + + if \ inboxItems~isConnected then do + say 'Error connecting to inbox events, quitting' + return 99 + end + + monitor = .Monitor~new + say 'ooRexx Mail Monitor - monitoring ...' + do while monitor~isActive + j = SysSleep(1) + status = monitor~getStatus + + select + when status == 'disconnect' then do + inboxItems~disconnectEvents + say 'ooRexx Mail Monitor - paused ...' + end + when status == "reconnect" then do + inboxItems~connectEvents + say 'ooRexx Mail Monitor - monitoring ...' + end + otherwise do + nop + end + end + -- End select + end + say 'ooRexx Mail Monitor version 1.0.0 ended' + +return 0 + +::method printNewMail unguarded + use arg mailItem + say 'You have mail' + say 'Subject:' mailItem~subject + +::class 'Monitor' +::method init + expose state active + + state = 'continue' + active = .true + j = SysFileDelete('stop.monitor') + j = SysFileDelete('pause.monitor') + j = SysFileDelete('restart.monitor') + +::method isActive + expose active + return active + +::method getStatus + expose state active + + if SysIsFile('stop.monitor') then do + j = SysFileDelete('stop.monitor') + active = .false + state = 'quit' + return state + end + + if SysIsFile('pause.monitor') then do + j = SysFileDelete('pause.monitor') + if state == "paused" then return "continue" + + if state \== 'quit' then do + state = "paused" + return 'disconnect' + end + end + + if SysIsFile('restart.monitor') then do + j = SysFileDelete('restart.monitor') + if state == 'continue' then return state + if state \== 'quit' then do + state = 'continue' + return 'reconnect' + end + end + return 'continue' diff --git a/modules/windows/ole/apps/MSPowerPoint_layouts.rex b/modules/windows/ole/apps/MSPowerPoint_layouts.rex new file mode 100644 index 0000000..4dca39c --- /dev/null +++ b/modules/windows/ole/apps/MSPowerPoint_layouts.rex @@ -0,0 +1,83 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/********************************************************************* + + MSPowerPoint.rex: using OLE (object linking and embedding) with ooRexx + + Using OLE open MSPowerPoint and add a Title slide with Title and SubTitle + shapes (sections). + Append slides with various styles, get slide count and amount of shapes per + slide, list names of shapes on each slide. + Save pptx file with a unique name and close PowerPoint. + +*********************************************************************/ + +-- Start PowerPoint +PP = .OLEObject~New("PowerPoint.Application") +PP~Visible = .TRUE -- make PP visible +-- Add first Slide +PP~Presentations~Add~Slides~Add(1, 1) -- add: Title-Slide +FirstSlide = PP~ActivePresentation~Slides(1) +FirstSlide~Shapes(1)~TextFrame~TextRange = "New Presentation Title" -- first Shape is Title +FirstSlide~Shapes(2)~TextFrame~TextRange = "Subtitle at:" .dateTime~new -- second Shape is SubTitle +-- Append several Slides +ActivePresentation = PP~ActivePresentation +ActivePresentation~Slides~Add(2, 1) -- append: second Title-Slide +ActivePresentation~Slides~Add(3, 2) -- append: Title and Text Slide +ActivePresentation~Slides~Add(4, 3) -- append: Title and 2-Columne Text +ActivePresentation~Slides~Add(5, 5) -- append: Title, Text and Chart +-- Check what on Slide +SlideCount = ActivePresentation~Slides~Range~Count -- get amount of Slides +say "Your Presentation has" SlideCount "Slides" +do SlideNumber = 1 to SlideCount -- go through each Slide + ShapeCount = ActivePresentation~Slides(SlideNumber)~Shapes~Range~Count -- get amount of Shapes per Slide + say " Slide" SlideNumber "has" ShapeCount "Shapes" + do ShapeNumber = 1 to ShapeCount -- go through each Shape + -- List names of Shapes on Slide + say " ("ShapeNumber"/"ShapeCount"):" ActivePresentation~Slides(SlideNumber)~Shapes(ShapeNumber)~name + end +end + +say "Press any key to save and close!" +parse pull -- wait for key press + +-- Save and Close +homeDir = VALUE('USERPROFILE',,'ENVIRONMENT') -- get user's home directory +fileOut = homedir"\Desktop\PP_" || date("S") || "_" || changeStr(":",time(),"") || ".pptx" +say "File to save to:" fileOut +ActivePresentation~SaveAs(fileOut) -- save pptx file +PP~Quit -- close PP diff --git a/modules/windows/ole/apps/MSPowerPoint_present.rex b/modules/windows/ole/apps/MSPowerPoint_present.rex new file mode 100755 index 0000000..ac3e348 --- /dev/null +++ b/modules/windows/ole/apps/MSPowerPoint_present.rex @@ -0,0 +1,91 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/********************************************************************* + + MSPowerPoint_present.rex: using OLE (object linking and embedding) with ooRexx + + Using OLE create a new MS PowerPoint presentation about REXX and + ooRexx and then start it as a presentation. + +*********************************************************************/ + +-- start PowerPoint +pp = .OLEObject~new("PowerPoint.Application") +pp~visible = .true -- make PP visible + +-- add titleSlide +pp~presentations~add~slides~add(1, 1) -- add: Title-Slide +titleSlide = pp~activePresentation~slides(1) +titleSlide~shapes(1)~textFrame~textRange = "ooRexx" -- first Shape is Title +titleSlide~shapes(2)~textFrame~textRange = "Open Object Rexx (ooRexx)" +info="0d"x"(Presentation created:" .dateTime~new")" -- add CR plus hint +oRange=titleSlide~shapes(2)~textFrame~textRange~insertAfter(info) +oRange~Font~Size = 15 + +-- add another slide +activePresentation = pp~activePresentation +-- add(after,type) +slide = activePresentation~slides~add(2, 2) -- append: Title and Text Slide +slide~shapes(1)~textFrame~textRange = "Open Object Rexx (ooRexx)" -- set title + +textRange = slide~shapes(2)~textFrame~textRange +-- add string, supply level +call addItem textRange, "REXX (IBM)", 1 +call addItem textRange, "First released in 1979 for IBM mainframes", 2 +call addItem textRange, "Object REXX (IBM)", 1 +call addItem textRange, "Object-oriented successor to REXX", 2 +call addItem textRange, "First released in 1994 with IBM's OS/2 Warp", 2 +call addItem textRange, "Negotiations about open-sourcing with RexxLA", 2 +call addItem textRange, "Rexx Language Association (www.RexxLA.org)", 3 +call addItem textRange, "Source code handed over to RexxLA in 2003", 3 +call addItem textRange, "Open Object Rexx (ooRexx by RexxLA)", 1 +call addItem textRange, "First released in 2004 by RexxLA", 2 + +-- go into presentation mode +activePresentation~slideShowSettings~run + +say "Press any key to quit!" +parse pull -- wait for key press + +pp~displayAlerts = .false -- do not ask user +pp~quit + + +::routine addItem -- add string to textRange, set it to given level + use arg textRange, string, level + textRange~InsertAfter(string)~IndentLevel = level + TextRange~InsertAfter("0d"x) -- add CR, i.e. a new paragraph diff --git a/modules/windows/ole/apps/MSWord_createModify.rex b/modules/windows/ole/apps/MSWord_createModify.rex new file mode 100755 index 0000000..8d93240 --- /dev/null +++ b/modules/windows/ole/apps/MSWord_createModify.rex @@ -0,0 +1,162 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* SAMP08.REX: OLE Automation with Open Object REXX - Sample 8 */ +/* */ +/* Create a Word document, enter some text, save it. Load it again */ +/* and modify it. */ +/* */ +/**********************************************************************/ + +/* get a Word application object */ +Word = .OLEObject~New("Word.Application") + +/* set Word visible to see what happens */ +Word~Visible = .TRUE + +/* new document */ +Document = Word~Documents~Add + +/* get the selection object */ +Selection = Word~Selection + +/* type two lines of text and new paragraph */ +Selection~TypeText("This is a text sent to MS Word with the Open Object Rexx OLE interface") +Selection~TypeParagraph +Selection~TypeText("This is a text in a new line") + +/* select all */ +Selection~WholeStory + +/* get the font object */ +Font = Selection~Font + +/* change the font size and behavior */ +Font~Name="Arial" +Font~Size="12" +Font~Bold = .TRUE +Font~Italic = .TRUE + +/* get the environment variable TEMP and create filename to save */ +TempDir = VALUE( "TEMP",,ENVIRONMENT) +-- use ".doc" instead of ".docx" to allow older Word apps to work: +FileName = TempDir || "\" || "WordCreatedByRexx.doc" + +/* "save as..." and close Word */ +Document~SaveAs(FileName) +Word~Quit + +say "Created" FileName". Press enter to continue" +pull + +/* get a Word application object */ +Word = .OLEObject~New("Word.Application") + +/* set word visible to see what happens */ +Word~Visible = .TRUE + +/* get the documents object and open a file */ +Documents = Word~Documents +Documents~Open(FileName) + +/* get the selection object and go to end of document */ +Selection = Word~Selection +Selection~EndKey("6") + +/* add a paragraph */ +Selection~TypeParagraph + +/* get active document object */ +ActiveDocument = Word~ActiveDocument + +/* invoke print preview */ +ActiveDocument~PrintPreview + +/* get active window object */ +ActiveWindow = Word~ActiveWindow + +/* change zoom percentage */ +ActiveWindow~ActivePane~View~Zoom~Percentage = "200" + +/* wait a little bit */ +say "Showing Print Preview with 200%. Press enter to continue." +pull + +/* change zoom percentage */ +ActiveWindow~ActivePane~View~Zoom~Percentage = "100" + +/* wait a little bit */ +call syssleep 2 + +/* close print preview */ +ActiveDocument~ClosePrintPreview + +/* add a paragraph */ +Selection~TypeParagraph + +/* add a table */ +ActiveDocument~Tables~Add(Selection~Range,4,5) + +/* autoformat table to color */ +Selection~Tables(1)~AutoFormat(9) + +/* fill table */ + +header = .array~of("Year", "January", "February", "March", "April") +do i over header + Selection~TypeText(i) + Selection~MoveRight +end + +do i=2000 to 2002 + Selection~MoveRight(12) + Selection~TypeText(i) + Selection~MoveRight + do 4 + Selection~TypeText(random(31)) + Selection~MoveRight + end +end + +say "Done. Press enter to quit." +pull + +Word~Quit(.false) + + diff --git a/modules/windows/ole/apps/MSWord_useStyles.rex b/modules/windows/ole/apps/MSWord_useStyles.rex new file mode 100644 index 0000000..f05b7f9 --- /dev/null +++ b/modules/windows/ole/apps/MSWord_useStyles.rex @@ -0,0 +1,98 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/********************************************************************* + + MSWord_useStyles.rex: using OLE (object linking and embedding) with ooRexx + + Links: + + + + Using OLE create a Microsoft Word document, add text using various + styles and wait for the user to press the enter (return) key before + changing the font attributes of the styles named "Title" and "Heading 1". + +*********************************************************************/ + +-- Start Word with empty document +Word = .OLEObject~New("Word.Application") +Word~Visible = .TRUE -- make Word visible +Document = Word~Documents~Add -- add document +Selection = Word~Selection -- selection object +say "# 1: Create: title style..." +Selection~Style = "Title" -- Create selection with style: Title +Selection~TypeText("TITLE") -- give selection a text +Selection~TypeParagraph -- add paragraph (go to next line) +say "# 2: Create: heading 1 style..." +Selection~Style = "Heading 1" -- Create selection with style: Heading 1 +Selection~TypeText("HEADING 1") -- give selection a text +Selection~TypeParagraph -- add paragraph (go to next line) +say "# 3: Create: heading 2 style..." +Selection~Style = "Heading 2" -- Create selection with style: Heading 2 +Selection~TypeText("HEADING 2") -- give selection a text +Selection~TypeParagraph -- add paragraph (go to next line) + -- Note: Usually the style "Normal" follows heading styles +Selection~TypeText("Reset to normal ...") -- "Normal" follows "Heading 2" +Selection~TypeParagraph -- add paragraph (go to next line) +say "# 4: Create: normal text style..." +Selection~Style = "Normal" -- Create selection with style: normal +Selection~TypeText("I am Normal Text.") -- give selection a text + +say "Press any key to change style!" +parse pull -- wait for key press + +-- Go through each sentence +SentenceCount = Document~Sentences~Count -- get sentence count +Font = Selection~Font -- get font object +do SentenceNumber = 1 to SentenceCount -- go through each sentence + + Document~Sentences(SentenceNumber)~Select -- select sentence + StyleName = Selection~Style~NameLocal -- get style name of sentence + Select case StyleName -- make changes depending on style name + when "Title" then do + Font~Name="Arial" + Font~Size="38" + Font~Bold = .TRUE + end + when "Heading 1" then do + Font~Name="Times New Roman" + Font~Size="22" + Font~Italic = .TRUE + end + otherwise NOP + end +end diff --git a/modules/windows/ole/apps/ScriptingFileSystemObject.rex b/modules/windows/ole/apps/ScriptingFileSystemObject.rex new file mode 100755 index 0000000..7d275d0 --- /dev/null +++ b/modules/windows/ole/apps/ScriptingFileSystemObject.rex @@ -0,0 +1,90 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* ScriptingFileSystemObject.rex: OLE Automation with ooRexx */ +/* */ +/* Use the Windows Script Host FileSystemObject to obtain information */ +/* on drives of the system. */ +/* */ +/**********************************************************************/ + +fsObject = .OLEObject~new("Scripting.FileSystemObject") + +allDrives = fsObject~drives + +if allDrives = .NIL then do + say "The object did not return information on your drives!" + exit 1 +end + +do i over allDrives + info = i~DriveLetter "-" + + /* show the DriveType in human-readable form */ + j = i~DriveType + select + when j=1 then do + info = info "Removable" + end + when j=2 then do + info = info "Fixed" + end + when j=3 then do + info = info "Network" + end + when j=4 then do + info = info "CD-ROM" + end + when j=5 then do + info = info "RAM Disk" + end + otherwise + info = info "Unknown" + end + + /* append the ShareName for a network drive... */ + if j=3 then info = info i~ShareName + /* ...and the VolumeName for the other ones */ + else if i~IsReady then info = info i~VolumeName + say info +end + +exit 0 + + diff --git a/modules/windows/ole/apps/ShellApplication_listSystemFolders.rex b/modules/windows/ole/apps/ShellApplication_listSystemFolders.rex new file mode 100755 index 0000000..6e97019 --- /dev/null +++ b/modules/windows/ole/apps/ShellApplication_listSystemFolders.rex @@ -0,0 +1,99 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/********************************************************************** + ShellApplication_listSystemFolders.rex: using OLE (object linking and embedding) with ooRexx + + Links: + + + Using OLE and Windows' 'Shell.Application' query all Windows system + folders. +***********************************************************************/ + +-- "ShellSpecialFolderConstants" (shldisp.h), cf. (2022-06-23) +-- an array of name/folderID arrays +arr = .array~of( - + ("ALTSTARTUP " , "1d"x ), - + ("APPDATA " , "1a"x ), - + ("BITBUCKET " , "0a"x ), - + ("COMMONALTSTARTUP" , "1e"x ), - + ("COMMONAPPDATA " , "23"x ), - + ("COMMONDESKTOPDIR" , "19"x ), - + ("COMMONFAVORITES " , "1f"x ), - + ("COMMONPROGRAMS " , "17"x ), - + ("COMMONSTARTMENU " , "16"x ), - + ("COMMONSTARTUP " , "18"x ), - + ("CONTROLS " , "03"x ), - + ("COOKIES " , "21"x ), - + ("DESKTOP " , "00"x ), - + ("DESKTOPDIRECTORY" , "10"x ), - + ("DRIVES " , "11"x ), - + ("FAVORITES " , "06"x ), - + ("FONTS " , "14"x ), - + ("HISTORY " , "22"x ), - + ("INTERNETCACHE " , "20"x ), - + ("LOCALAPPDATA " , "1c"x ), - + ("MYPICTURES " , "27"x ), - + ("NETHOOD " , "13"x ), - + ("NETWORK " , "12"x ), - + ("PERSONAL " , "05"x ), - + ("PRINTERS " , "04"x ), - + ("PRINTHOOD " , "1b"x ), - + ("PROFILE " , "28"x ), - + ("PROGRAMFILES " , "26"x ), - + ("PROGRAMFILESx86 " , "30"x ), - + ("PROGRAMS " , "02"x ), - + ("RECENT " , "08"x ), - + ("SENDTO " , "09"x ), - + ("STARTMENU " , "0b"x ), - + ("STARTUP " , "07"x ), - + ("SYSTEM " , "25"x ), - + ("SYSTEMx86 " , "29"x ), - + ("TEMPLATES " , "15"x ), - + ("WINDOWS " , "24"x ) - + ) + +objShell = .oleObject~new('Shell.Application') +say "Windows system folders on this computer:" +do counter c obj over arr -- iterate over array + -- query path of special folder in hand + name =obj[1] + folderId=obj[2] + val=objShell~nameSpace(folderId~c2d)~self~path + say c~right(2)":" name "("""folderId~c2x"""x)="val +end diff --git a/modules/windows/ole/apps/WScriptNetwork.rex b/modules/windows/ole/apps/WScriptNetwork.rex new file mode 100755 index 0000000..516d067 --- /dev/null +++ b/modules/windows/ole/apps/WScriptNetwork.rex @@ -0,0 +1,68 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* WScriptNetwork.rex: OLE Automation with ooRexx */ +/* */ +/* Show some features of the Windows Scripting Host Network object: */ +/* - Query computer name, user name */ +/* - List network connections for drives and printers */ +/* */ +/**********************************************************************/ + +WshNetObj = .OLEObject~New("WScript.Network") + +Say "Computer Name:" WshNetObj~ComputerName +Say "User Domain :" WshNetObj~UserDomain +Say "User Name :" WshNetObj~UserName +say + +Say "The following network drives are currently mapped:" +MappedDrives = WshNetObj~EnumNetworkDrives +Do i=0 To MappedDrives~Count/2 - 1 + Say " Drive" MappedDrives[i*2] "is mapped to" MappedDrives[i*2 + 1] +End +say + +Say "The following network printers are currently connected:" +Printers = WshNetObj~EnumPrinterConnections +Do i=0 To Printers~Count/2 - 1 + Say " Port" Printers[i*2] "is connected to" Printers[i*2 + 1] +End + + diff --git a/modules/windows/ole/apps/WScriptShell.rex b/modules/windows/ole/apps/WScriptShell.rex new file mode 100755 index 0000000..5df6da7 --- /dev/null +++ b/modules/windows/ole/apps/WScriptShell.rex @@ -0,0 +1,68 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**********************************************************************/ +/* */ +/* WScriptShell.rex: OLE Automation with ooRexx */ +/* */ +/* Show some features of the Windows Scripting Host Shell Object: */ +/* - Query environment string */ +/* - List special folders */ +/* - Create a shortcut on the desktop */ +/* - Use a GUI popup */ +/* */ +/**********************************************************************/ + +WshShellObj = .OLEObject~New("WScript.Shell") + +WshEnv = WshShellObj~Environment +Say "Operating system:" WshEnv["OS"] +Say "You have" WshEnv["NUMBER_OF_PROCESSORS"] "processor(s) of", + WshEnv["PROCESSOR_ARCHITECTURE"] "architecture in your system." + +Say "The following directories represent special folders on your system:" +Do Folder Over WshShellObj~SpecialFolders + Say " " Folder +End + +Say "Creating a shortcut for NOTEPAD.EXE on your Desktop..." +Desktop = WshShellObj~SpecialFolders("Desktop") +ShortCut = WshShellObj~CreateShortcut(Desktop || "\Shortcut to Notepad.lnk") +ShortCut~TargetPath = "%WINDIR%\notepad.exe" +ShortCut~Save + +WshShellObj~Popup("Processing of REXX script has finished!") diff --git a/modules/windows/ole/apps/oleUtils.frm b/modules/windows/ole/apps/oleUtils.frm new file mode 100644 index 0000000..edd3539 --- /dev/null +++ b/modules/windows/ole/apps/oleUtils.frm @@ -0,0 +1,435 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + File: OleUtils.frm + + Purpose: + Provides some useful utilities for working with the .OLEObject class. + + Assumes: + ooRexx version 4.0.0 as a minimum. + + Notes: + This framework was originally written to work on ooRexx 3.1.2. However, + that was in the previous decade. This version of OleUtils.frm now requires + ooRexx 4.0.0 at a minimum. + + Public Routines: + This is a list of the public routines and their syntax. Arguments in square + brackets indicate they are optional. Complete details on usage is in the + header comments for each routine. + + oleOjbect = createOleOjbect(id, [verbose]) + boolean = displayKnownMethods(oleObj, [verbose]) + boolean = displayKnownConstants(oleObj) + boolean = isRexxTrue(obj) + boolean = isOORexx4OrLater() + mode = getAddressingMode() + +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + +-- End of entry point. + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + +/* createOleObject( id ) - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + + Creates an .OLEObject instance, a proxy for the specified COM object. This + routine is used to trap the REXX error that happens when the proxied COM + object can not be created. + + Input: + id REQUIRED + The string used to create the COM object. I.e., the ProgID or CLSID. + + verbose OPTIONAL + If true and the OleObject is not created, the error message is displayed. + If false, the default, the message is not displayed. + + Returns: + An instance of .OLEObject on success, .nil on failure. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::routine createOleObject public + use strict arg id, verbose = .false + + if isRexxTrue(verbose) then + verbose = .true + else + verbose = .false + + signal on syntax name returnNil + + oleObject = .OLEObject~new(id, "NOEVENTS") + signal on syntax + return oleObject + +returnNil: + signal on syntax + if verbose then + say "Error" rc":" errortext(rc)||'0d0a'x||condition('o')~message + + return .nil +-- End createOleObject( id, verbose ) + +/* displayKnownMethods( oleObj, verbose )- - - - - - - - - - - - - - - - - - -*\ + + Formats and displays the known methods of an .OLEObject instance. Known + methods can only be displayed for OLE / COM objects that provide TypeInfo. If + there is no known information, a simple string stating as much is displayed. + + Input: + oleObj REQUIRED + An instance of the .OLEObject whose known methods are to be displayed. + + verbose OPTIONAL + If true all information concerning the methods is displayed. Parameters, + parameter types, return type, etc.. If false, the default, only the + method names are displayed. + + Returns: + 0 if the specified object is not an instance of the .OLEObject classs, + otherwise 1. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::routine displayKnownMethods public + use strict arg oleObj, verbose = .false + + if \ oleObj~isInstanceOf(.OLEObject) then do + say "Known methods can only be displayed for instances of the .OLEObject." + say " Arg 1 class:" oleObj~class + return 0 + end + + if isRexxTrue(verbose) then + verbose = .true + else + verbose = .false + + say + j = printInstanceInfo(oleObj) + + known. = oleObj~getKnownMethods + + if known. == .nil then do + say "There is no known method information for this object" + return 1 + end + + say "Containing Type Library:" known.!LIBNAME + if known.!LIBDOC~left(2) <> "!L" then + say "Library Description: " known.!LIBDOC + say + + say "COM Class: " known.!COCLASSNAME + if known.!COCLASSDOC~left(2) <> "!C" then + say "Class Description:" known.!COCLASSDOC + say "Known methods: " known.0 + say + + if \ verbose then do + say " Methods:" + do i = 1 to known.0 + say " " known.i.!NAME + end + return 1 + end + + do i = 1 to known.0 + ret = known.i.!RETTYPE + name = known.i.!NAME + doc = known.i.!DOC + invk = known.i.!INVKIND + + say " " name + + if doc~pos("!DOC") == 0 then + say " Decscription:" doc + + say " " invkindToString(invk) "returns" ret + say + + if ret == "VT_VOID" then + line = " obj~"name + else + line = " " || changeVariant(ret) || "= obj~"name + + select + when invk == 2 then + say line + + when known.i.!PARAMS.0 == 0 then + say line"()" + + otherwise do + line = line"( " + indent = " "~copies(line~length) + + do j = 1 to known.i.!PARAMS.0 + param = known.i.!PARAMS.j.!TYPE known.i.!PARAMS.j.!FLAGS - + known.i.!PARAMS.j.!NAME + + select + when j == 1 & known.i.!PARAMS.0 == 1 then do + say line || param" )" + end + when j == 1 then do + say line || param"," + end + when j == known.i.!PARAMS.0 then do + say indent || param" )" + end + otherwise do + say indent || param"," + end + end + -- End select + end + -- End do j = 1 to known.i.!PARAMS.0 + end + -- End otherwise do + end + -- End select + + say + end + -- End do i = 1 to known.0 + +return 1 +-- End displayKnownMethods( oleObj ) + +/* displayKnownConstants( oleObj ) - - - - - - - - - - - - - - - - - - - - - -*\ + + Prints out all the known constants for the specified object, if any are + available. + + Input: + oleObj REQUIRED + An instance of the .OLEObject whose known methods are to be displayed. + + Returns: + 0 if the oleObj argument was not an instance of .OLEObject, otherwise 1. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::routine displayKnownConstants public + use strict arg oleObj + + if \ oleObj~isInstanceOf(.OLEObject) then do + say "Known constants can only be displayed for instances of the .OLEObject." + say " Arg 1 class:" oleObj~class + return 0 + end + + say + j = printInstanceInfo(oleObj) + + constants = oleObj~getConstant + if constants == .nil | constants~items == 0 then do + say "There are no known constants for this object" + return 1 + end + + say "Known constants:" constants~items + say + + -- Some of Microsoft's constant names are very long. + line = " "~copies(42) || "= " + do name over constants + say line~overlay(name~substr(2), 3) || constants[name] + end + +return 1 +-- End displayKnownConstants( oleObj ) + +/* isRexxTrue( obj ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + + Tests if obj is strictly .true. (To some degree, actually just tests that obj + is exactly '1'.) + + Input: + obj REQUIRED + The object to test. + + Returns: + True if obj is strictly true, otherwise false. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::routine isRexxTrue public + use strict arg obj + + if obj~class == .string then + if obj~datatype('W') then + if obj == 1 then + return .true + +return .false +-- End isRexxTrue( obj ) + +/* isOORexx4OrLater( ) - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + + Returns true if the running interpreter is ooRexx 4.0.0 or later. + + Input: + None. + + Returns: + True if this is ooRexx 4.0.0 or later, otherwise false. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::routine isOORexx4OrLater public + use strict arg + + parse version interpreterName languageLevel interpreterDate + parse var interpreterName junk "_" ver "." moreJunk + if ver >= 4 then return .true + +return .false +-- End isOORexx4OrLater( ) + +/** getAddressingMode() + * Determine if this is a 32-bit or 64-bit interpreter. + */ +::routine getAddressingMode public + use strict arg + + parse version rexx'_'ver'_'mode'-bit' . + return mode + +return mode + +/* changeVariant( vt ) - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + + Helper function to turn a VARTYPE symbol into a "prettified" object name. + + E.g., VT_DISPATCH becomes dispatchObj, VT_I4 becomes i4Obj. + + Input: + vt REQUIRED + + Returns: + The prettified version of the specified VARTYPE. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::routine changeVariant + use strict arg vt + + -- TODO: it would be nice to turn VT_I4 to something like int4ByteObj, VT_R4 + -- to float4ByteObj, etc. + retStr = vt~substr(4) || "Obj" + +return retStr~lower +-- End changeVariant( vt ) + +/* invkindToString( kind ) - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + + Helper function to return a string value for the specified invocation type. + + Input: + kind REQUIRED + A number representing a COM INVOKEKIND enumeration. + + Returns: + Returns the enumeration symbol, (string symbol) for the specified kind. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::routine invkindToString + use strict arg kind + + select + when kind == 1 then + kindString = "" + when kind == 2 then + kindString = "" + when kind == 4 then + kindString = "" + when kind == 8 then + kindString = "" + otherwise + kindString = "" + end + -- End select + +return kindString +-- End invkindToString( kind ) + +/* printInstanceInfo( oleObj ) - - - - - - - - - - - - - - - - - - - - - - - -*\ + + Helper function to print out instance information for an .OLEObject object. + + Input: + oleObj REQUIRED + The object whose instance information is to be printed. + + Returns: + 0, always. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::routine printInstanceInfo + use strict arg oleObj + + progID = oleObj~!getVar("!PROGID") + clsID = oleObj~!getVar("!CLSID") + disp = oleObj~!getVar("!IDISPATCH") + typeInfo = oleObj~!getVar("!ITYPEINFO") + + if isOORexx4OrLater() then do + if progID == .nil then + progID = "null" + if clsID == .nil then + clsID = "null" + if disp == .nil then + disp = "null" + if typeInfo == .nil then + typeInfo = "null" + end + else do + if progID~left(2) == "!P" then + progID = "null" + if clsID~left(2) == "!C" then + clsID = "null" + if disp~left(3) == "!ID" then + disp = "null" + if typeInfo~left(3) == "!IT" then + typeInfo = "null" + end + + say "ProgID: " progID + say "ClsID: " clsID + say "Dispatch Pointer:" disp + say "TypeInfo Pointer:" typeInfo + say + +return 0 +-- End printInstanceInfo( oleObj ) + + + +/* - - - - - - - - - - End of file: OleUtils.frm- - - - - - - - - - - - - - - */ diff --git a/modules/windows/ole/methinfo/main.rex b/modules/windows/ole/methinfo/main.rex new file mode 100755 index 0000000..340ba96 --- /dev/null +++ b/modules/windows/ole/methinfo/main.rex @@ -0,0 +1,57 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*******************************************************************/ +/* Sample application that demonstrates the use of the */ +/* GetKnownMethods method. */ +/*******************************************************************/ + +say "Please enter a ProgID or a CLSID (e.g. InternetExplorer.Application):" +parse pull oleName + +theObject = .OLEObject~new(oleName) + +info = .methodInfo~new(theObject) + +say "Here is the available information on" oleName + +info~print + +exit + + +::requires "METHINFO.CLS" diff --git a/modules/windows/ole/methinfo/methinfo.cls b/modules/windows/ole/methinfo/methinfo.cls new file mode 100644 index 0000000..d7fc32d --- /dev/null +++ b/modules/windows/ole/methinfo/methinfo.cls @@ -0,0 +1,71 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*******************************************************************/ +/* methodInfo class: */ +/* retrieve method information from OLE object and output it */ +/* to stdout. */ +/*******************************************************************/ + +::class 'MethodInfo' public + +::method init + expose methods. + use arg oleobj + methods. = oleobj~GetKnownMethods + +::method print + expose methods. + if methods. == .nil then return + do i = 1 to methods.0 + signature = methods.i.!RETTYPE + signature = signature methods.i.!NAME + if methods.i.!INVKIND = 4 then + signature = signature"= ("methods.i.!PARAMS.1.!TYPE "as the argument)" + else do + do j = 1 to methods.i.!PARAMS.0 + if j = 1 then signature = signature"(" + signature = signature||methods.i.!PARAMS.j.!FLAGS methods.i.!PARAMS.j.!TYPE methods.i.!PARAMS.j.!NAME + if j = methods.i.!PARAMS.0 then signature = signature")" + else signature = signature", " + end + end + say signature + interpret 'exists = var("methods.'i'.!DOC")' + if exists = 1 then say methods.i.!DOC + if i < methods.0 then say "-"~copies(64) + end diff --git a/modules/windows/ole/oleinfo/createOleInfo.rex b/modules/windows/ole/oleinfo/createOleInfo.rex new file mode 100644 index 0000000..bef7f7f --- /dev/null +++ b/modules/windows/ole/oleinfo/createOleInfo.rex @@ -0,0 +1,175 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2002-2022 Rony G. Flatscher. All rights reserved. */ +/* Copyright (c) 2023 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/*********************************************************************** + program: createOleInfo.rex + type: Object Rexx for Windows + purpose: Query the OLE/ActiveX automation interface, create HTML-renderings, + optionally display HTML-renderings with Internet Explorer + + needs: oleinfo2html.frm + + usage: can be used as a function or as a command + + - can be called from the command line as well: + + rexx createOleInfo.rex app_name [mode [display]] + + where: + app_name ... OLE/ActiveX: a string denominating either PROGID or CLSID + mode ... 0|1 full=default (0) or compact (1) listing + display ... 0|1 no display (0) or display=default (1) with Internet Explorer + + example (command-line): rexx createOleInfo InternetExplorer.Application 1 1 + + - called as an external function: + + res=createOleInfo(app_name | {ole_object [, [header]} [, [mode] [, [display]]]] ) + ... invocation as a function, e.g. from *any* running Object Rexx program, + returns .true, if OLEObject could get created|interrogated, .false else + where: + app_name ... OLE/ActiveX: a string denominating either PROGID or CLSID + or + ole_object ... OLE/ActiveX-object to interrogate + + header ... HTML-heading, if 1st argument is an OLE-object + mode ... 0|1 full (0) or compact=default (1) listing + display ... 0|1 no display (0) or display=default (1) with Internet Explorer + + example: ole=.OleObject~new("InternetExplorer.Application") + success=createOleInfo(ole, "Interfaces for the Internet Explorer") + +***********************************************************************/ + + if arg()=0 then -- show usage + do + do i=1 to 999 until pos("usage:", sourceline(i)) > 0; nop; end + do i=i to 999 while pos("*/", sourceline(i))=0;say strip(sourceline(i));end + exit + end + + parse source . calltype . -- get type of invocation + + bCommand=(calltype="COMMAND") -- called as function ? + if bCommand then + do + parse arg app bCompact bShowInBrowser -- called from the commandline + fn=sanitize(app) + end + else -- called from another Rexx program + do + use arg app, header=("Name of OLE-Object Not Supplied by Programmer!
created on:" date("S") time()), - + bCompact=.false, bShowInBrowser=.true -- called as a function + fn=sanitize(header) + end + + if bCompact = "" then bCompact=.false -- default to .false + else bCompact = (bCompact=.true | translate(bCompact)="TRUE") + + if bShowInBrowser = "" then + bShowInBrowser=.true -- default to .true + else + bShowInBrowser = \(bShowInBrowser=.false | translate(bShowInBrowser)="FALSE") -- default to .true + + if app~class=.string then -- first argument is a String (PROGID or ClSID), not an OLEObject ! + do + resArr=oleinfo2html(app, .nil, bCompact) -- create OLE object and render interrogation results + end + else + do -- 'app' is assumed to be an OleObject + resArr=oleinfo2html(header, app, bCompact) -- pass OLE object and render interrogation results + end + + if resArr~items=0 then + do + .error~say('Problem: could not create an OLEObject for supplied ProgID/CLSID "'app'"') + return .false -- "app": not an OLEobject, return .false + end + + -- create html-file, add extension ".html" to given name + hint="" + if bCompact then hint="reference_" + + -- fn= app || "_" || hint || date("S") || "_" || changestr(" ", translate(time(),"",":"), "") || ".html" + fn= fn || "_" || hint || date("S") || "_" || changestr(" ", translate(time(),"",":"), "") || ".html" + + + -- write received data into file, close it + str=.stream~new(fn) + str~~open("write replace")~~lineout("")~~arrayout(resArr)~~lineout("")~close + + if \bShowInBrowser then return .true -- do not run IE, hence exit + +/* --- although works as of 2022-04-28, Microsoft actively deprecates its Internet explorer + in favor of its Chromium based replacement ("Edge"), which cannot be addressed via OLE + -- still, the InternetExplorer.Application PROGID may still be operable + -- create an instance of Internet Explorer + myIE=.OLEObject~new("InternetExplorer.Application") + myIE~visible=.true -- make it visible + myIE~navigate2(str~qualify) -- load freshly created html file, needs full path with filename + return .true +-- */ + + address system qu(fn) -- let Windows open file in default browser + return .true -- indicate success + +::requires "oleinfo2html.frm" + + + +/* Make sure we create a valid name for Windows, cf. + defining the illegal chars: + < (less than) + > (greater than) + : (colon) + " (double quote) + / (forward slash) + \ (backslash) + | (vertical bar or pipe) + ? (question mark) + * (asterisk) +*/ + +::routine sanitize + parse arg fn + return translate(fn, "", "<>:""/\|?*", " ")~space(1)~changestr(" ","_") + +/* Put quotes around filename and make sure parentheses get escaped with ^. */ +::routine qu + return '"'arg(1)~changeStr('(','^(')~changeStr(')','^)')'"' + diff --git a/modules/windows/ole/oleinfo/getOleConstants.rex b/modules/windows/ole/oleinfo/getOleConstants.rex new file mode 100644 index 0000000..c04f419 --- /dev/null +++ b/modules/windows/ole/oleinfo/getOleConstants.rex @@ -0,0 +1,182 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2002-2022 Rony G. Flatscher. All rights reserved. */ +/* Copyright (c) 2023 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/*********************************************************************** + name: getOleConstants.rex + purpose: create an Object Rexx file which saves the constants of the given + OLE/ActiveX appId/clsId in a directory called "ole.const" in the + environment .local (and hence can be retrieved by the environment + symbol ".ole.const") + usage: getOleConstants appid/clsid [outfile] + + appid/clsid ... OLE/ActiveX application ID or CLSID + outfile ....... optional name of the outputfile, otherwise STDOUT is used + + use the above outfile in a "::requires" directive + which then allows you to use the defined constants, + e.g. ".ole.const~SWC_3RDPARTY" + + example: rexx getOleConstants InternetExplorer.Application msie_const.rex + ... then, whenever you need to access MSIE-constants, then merely use + "::requires msie_const.rex" and refer to them e.g. like + ".ole.const~csc_navigateBack" + +***********************************************************************/ + + if arg()=0 then -- show usage + do + say .resources~usage + exit + end + + +parse arg appId outFile + +-- ole=.oleobject~new(appId) -- get OLE proxy +ole=createOleObject(appId) -- try to create OLE proxy +if ole=.nil then +do + .error~say(appId": could not create the OLE proxy, aborting ...") + exit -1 +end + +oleconst="ole.const" -- define directory name to store OLE constants, change if needed + + -- get OLE constants, create sortable stem +constants.=ole~getConstant +stem. = .stem~new + +stem.0=0 +max=0 +do counter i idx over constants. + idx=substr(idx,2) -- remove leading "!" character + stem.i=idx || "09"x || ole~getConstant(idx) + stem.0=i + max=max(max, length(idx)) -- save longest constant name +end + + -- if no constants, abort +if stem.0=0 then +do + .error~say("No constants found for:" pp(appId)", aborting ..." ) + exit -1 +end + +call SysStemSort "stem.", "A", "I" -- sort stem + + -- dump infos +parse source . . thisPgm + + -- open file-stream +if outfile="" then of=.output -- appId"_constants.rex" + else of=.stream~new(strip(outFile))~~open("write replace") + +of~say("/*" pp(filespec("name", thisPgm)) "run on:" pp(.dateTime~new) "*/" ) +of~say +tmpStr1="are" +tmpStr2="constants" +if stem.0=1 then -- singular +do + tmpStr1="is" + tmpStr2="constant" +end + +of~say("-- OLE/ActiveX-application/clsid:" pp(appId) "- there" tmpStr1 pp(stem.0) tmpStr2 ) +of~say +of~say("-- create stringTable '"OLECONST"', if necessary; maybe shared with OLE constant definitions of other programs") +of~say("if .local~hasentry('"oleconst"')=.false then .local~"oleconst"=.stringTable~new -- create stringTable '"OLEconst"' in .local") +of~say + +do i=1 to stem.0 + parse var stem.i const "09"x value + of~say( '.'oleconst'~'left(const, max) '=' encode(value) ) +end + +of~close + +::routine pp + return "[" || arg(1)~string || "]" + +::routine encode -- if a number, leave unchanged, else escape quotes Rexx-style, enclose string into quotes + + if datatype(arg(1), "Number") & length(arg(1))<=digits() then return arg(1) -- if a number, return value unchanged + + quote='"' + tmp=changestr(quote, arg(1), quote||quote) + return quote || tmp || quote + +::resource usage -- usage instructions +usage: getOleConstants appid/clsid [outfile] + + appid/clsid ... OLE/ActiveX application ID or CLSID + outfile ....... optional name of the outputfile, otherwise STDOUT is used + + use the above outputfile in a "::requires" directive + which then allows you to use the defined constants, + e.g. ".ole.const~SWC_3RDPARTY" + + example: rexx getOleConstants InternetExplorer.Application msie_const.rex + + ... creates an ooRexx program named "msie_const.rex" which adds + all found constants to the .ole.const stringTable (ooRexx 5.0, + like a directory) + + ... then, whenever you need to access MSIE-constants, merely use + + ::requires "msie_const.rex" + + in your program. This makes the InternetExplorer constants + available via the environment symbol ".ole.const" such that + you can refer to the constants by name in your programs like: + + val=.ole.const~csc_navigateBack -- get the constant + + Note: you can require as many different ole constant files as + necessary in a single program; all constants will get + saved in ".ole.const" + +::END + +/** Makes sure that program does not get stopped if OLEObject cannot be created (e.g. SYNTAX 92.911), + rather return .nil in that case. */ +::routine createOleObject + use strict arg appId + signal on syntax + return .oleobject~new(appId) -- get OLE proxy +syntax: + return .nil diff --git a/modules/windows/ole/oleinfo/listProgIds.rex b/modules/windows/ole/oleinfo/listProgIds.rex new file mode 100644 index 0000000..d4f6346 --- /dev/null +++ b/modules/windows/ole/oleinfo/listProgIds.rex @@ -0,0 +1,123 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2002-2022 Rony G. Flatscher. All rights reserved. */ +/* Copyright (c) 2023 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/*********************************************************************** + name: listProgIds.rex + purpose: list all ProgIDs to stdout, optionally with their CLSID + + usage: listProgIds.rex + listProgIds.rex needle + listProgIds.rex 1 + listProgIds.rex 1 needle + ... needle: optional: a string, list ProgIdDs that contain this string (caseless comparison) + ... 1 optional: supply CLSID + +***********************************************************************/ + +parse arg indicator needle . +bCLSID=(indicator=1) +if \bCLSID then needle=indicator -- shift to needle + +bTiming=.false -- .true -- determines whether timings are shown +time0=.DateTime~new + +.clsid~analyze_and_build -- let the class method query and analyze the registry, +all_progid= .clsid~all_progid -- get ProgID directory + +time1=.DateTime~new +if bTiming then say "analyzing registry time spent:" pp(time1-time0) + -- sort all ProgID indixes caselessly +allProgIds = all_progid~allIndexes~sortWith(.CaselessComparator~new) + +time2=.DateTime~new +items=allProgIds~items +if bTiming then +do + say "sorting" items "took:" pp(time2-time1) + say +end +prefix=.rexxinfo~architecture"-bit #" +len=items~length +bDots=.false +do counter i idx over allProgIds -- idx is the ProgID + if needle<>"", idx~caselessPos(needle)=0 then iterate + + o=all_progid~at(idx) -- get ooRexx classid object + hint=checkProgId(idx) -- supply hint whether ProgID adheres to MS specs + if bCLSID then + do + if bDots then + say prefix i~right(len)"/"items":" "ProgId:" pp(idx)~left(70,".") || hint~left(5,".") "CLSID:" o~clsid + else + say prefix i~right(len)"/"items":" "ProgId:" pp(idx)~left(70) || hint~left(5) "CLSID:" o~clsid + bDots=\bDots + end + else + say prefix i~right(len)"/"items":" "ProgId:" pp(idx)~left(70) || hint~left(5) +end +time3=.DateTime~new +if bTiming then +do + say "output took: " pp(time3-time2) + say "total time: " pp(time3-time0) +end + + + +::requires "reg_classids4ole.cls" -- get support for analyzing the registry + +::routine pp + return "["arg(1)"]" + +::routine checkProgId -- checks whether ProgID adheres to Microsoft's specifications + use arg progid + -- check validity of ProgId according to: : + -- length<=39, no punctuation (except dots), not start with a digit, .. + -- also discussion at: + hint="" + -- too long or empty string? + if progid~length >39 then hint="l" + else if progid="" then hint="l" + -- illegal character? + if verify(progid,"ABCDEFGHIJKLMNOPQRSTUVWXYZ.abcdefghijklmnopqrstuvwxyz0123456789")>0 then hint||="c" + -- must not start with a digit + if datatype(progid[1],"W") then hint="d" + if hint<>"" then return "*"hint"*" + + return hint + diff --git a/modules/windows/ole/oleinfo/oleinfo.cls b/modules/windows/ole/oleinfo/oleinfo.cls new file mode 100644 index 0000000..614b0e3 --- /dev/null +++ b/modules/windows/ole/oleinfo/oleinfo.cls @@ -0,0 +1,297 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2002-2022 Rony G. Flatscher. All rights reserved. */ +/* Copyright (c) 2023 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/*********************************************************************** + program: oleinfo.cls + + purpose: Query the OLE/ActiveX automation interface, create an Object Rexx proxy + which contains all relevant information in an edited and easy to use form + + usage: require this file + + returns: an instance of class "rgf.oleinfo" + +***********************************************************************/ + + + -- define invocation types +tmp.="???" +tmp.1="regularMethodCall" +tmp.2="getProperty" +tmp.4="putProperty" +tmp.8="letProperty" -- a put property (assigning a reference, distinguishment not important for Rexx) +.local~rgf.invKind= tmp. -- save stem + + + -- class to parse and create sorted list of methods +::class rgf.oleinfo public + +::method oleObject attribute -- OLEobject itself + +::method oleString attribute -- app_name +::method libname attribute +::method libdoc attribute + +::method allMethodDir attribute -- contains all methods +::method allMethodRel attribute +::method allMethodSortedStem attribute + +::method methodDir attribute + +::method getPropertyDir attribute +::method putPropertyDir attribute + +::method naDir attribute -- directory for storing methods with unknown invocation types + +::method getAndPutPropertyDir attribute +::method getOnlyPropertyDir attribute +::method putOnlyPropertyDir attribute + +::method eventDir attribute +::method eventSortedStem attribute + +::method constantSortedStem attribute + +::method init + expose oleObject oleString libname libdoc allMethodDir allMethodSortedStem methodDir getPropertyDir , + putPropertyDir naDir getAndPutPropertyDir getOnlyPropertyDir putOnlyPropertyDir eventDir eventSortedStem, + constantSortedStem + + use arg oleobject, oleString + + signal on syntax -- if OLEobject cannot be created, return .nil + if arg(1)="" | arg(1)=.nil then oleobject=.oleobject~new(oleString, "WITHEVENTS") + + if arg(2, "Omitted") then oleString="n/a" + + methodDir =.directory~new -- method directory + allMethodDir =.directory~new + allMethodSortedStem = .stem~new + + getPropertyDir =.directory~new -- get property directory + putPropertyDir =.directory~new -- set property directory + + naDir =.directory~new + + getAndPutPropertyDir = .directory~new + getOnlyPropertyDir = .directory~new + putOnlyPropertyDir = .directory~new + + eventDir =.directory~new -- event directory + eventSortedStem = .stem~new + constantSortedStem = .stem~new + + m. = oleobject~getKnownMethods -- get all known methods + if m. <> .nil then + do + libname=choose( var("m.!LibName"), m.!LibName, "n/a") + libdoc =choose( var("m.!LibDoc"), m.!libDoc, "n/a" ) + + -- determine kind of methods, build collection objects + j=0 + tmpSet=.set~new -- used to lookup whether name already collected + mStem.0=m.0 + do i=1 to m.0 + mo=.ole_method~new(m., i ) -- create object + name=mo~name + + allMethodDir~setentry(name, mo) -- save method-object + + if mo~invKind=1 then methodDir~setentry(name, mo) -- a normal method + else if mo~invKind=2 then getPropertyDir~setentry(name, mo) -- a get property + else if mo~invKind=4 | mo~invKind=8 then putPropertyDir~setentry(name, mo) -- a put property + + uname=translate(name) + if tmpSet~hasindex(uname) then iterate + j=j+1 + mStem.j=name + mStem.0=J + tmpSet~put(uname) + end + + call SysStemSort mStem., "Ascending", "Ignore" -- makes problem if used under MSIE (as of: 2002-05-27) + self~allMethodSortedStem = mStem. -- save sorted stem + end + + -- methods which possess an unknown invocation type: + naDir=allMethodDir~difference(methodDir)~difference(getPropertyDir)~difference(putPropertyDir) + + getAndPutPropertyDir = getPropertyDir~intersection(putPropertyDir) + getOnlyPropertyDir = getPropertyDir~difference(putPropertyDir) + putOnlyPropertyDir = putPropertyDir~difference(getPropertyDir) + + ev. = oleobject~getKnownEvents -- get all known events + + if ev. <> .nil then + do + evStem.0=ev.0 + do i=1 to ev.0 + ev=.ole_event~new(ev., i ) -- create object + eventDir~setentry(ev~name, ev) + evStem.i=ev~name + end + + call SysStemSort evStem., "Ascending", "Ignore" + self~eventSortedStem = evStem. -- save sorted stem + end + +-- call alert "oleobject="oleObject "ev.0="ev.0 "evStem.0="evStem.0 "sel~eventSortedStem="self~eventSortedStem + + c. = oleobject~getConstant -- OLE object needs to have been created with the "WITHEVENTS"-option + if c. <> .nil then + do + i=0 + do item over c. + i=i+1 + constStem.i=substr(item, 2) + end + constStem.0=i + + if constStem.0>0 then + call SysStemSort constStem., "A", "I" -- get constants and sort ascendingly + self~constantSortedStem = constStem. + end + + RETURN + +syntax: + oleObject=.nil + return + + + -- pretty print +::routine pp + return "[" || arg(1) || "]" + + + -- OLE MethodOrEvent +::class methodOrEvent +::method init + expose name doc params + use arg stem., idx + + name=stem.idx.!Name + + if var("stem.idx.!doc") then doc=stem.idx.!Doc + else doc="n/a" -- .nil + + params =.list~new + do i=1 to stem.idx.!params.0 + params~insert( .ole_param~new( stem.idx.!params.i.!name, - + stem.idx.!params.i.!type, - + stem.idx.!params.i.!flags ) ) + end + +::method name attribute +::method doc attribute +::method params attribute -- list of params, if any + +::method makestring -- create string rendering + expose name doc params + + tmp="" + do param over params + tmp=tmp "," param~makestring + end + tmp=substr(tmp,4) + return name pp( doc ) "(" tmp ")" + + + -- OLE Method +::class ole_method subclass MethodOrEvent + +::method init + expose invkind retType + use arg stem., idx + + forward class (super) continue -- let super initialize + + invkind=stem.idx.!InvKind + if invkind=.nil then invkind="??? unknown type #" stem.idx.!InvKind "???" + + -- if invkind="4" then self~name=(self~name || "=") + retType=stem.idx.!retType + +::method invkind attribute -- 1=method, 2=getProperty, 4=putProperty +::method retType attribute + +::method makestring -- create string rendering + expose invKind retType + return (.rgf.invKind[invKind]~string) (self~makestring:super~string) "retType --->" (retType~string) + + + -- OLE Event +::class ole_event subclass MethodOrEvent + + + + -- OLE Parameter +::class ole_param +::method init + expose name in out opt type + parse arg name, type, flags + in =pos("in", flags)>0 + out=pos("out", flags)>0 + opt=pos("opt", flags)>0 + +::method name attribute +::method in attribute +::method out attribute +::method opt attribute +::method type attribute + +::method makestring -- render to a string + expose name in out opt type type + + tmp=name + if in then tmp=tmp "in" + else tmp=tmp " " + + if out then tmp=tmp"/out" + + tmp=tmp":" type + + if opt then tmp=pp(tmp) -- indicate optionality by enclosing in brackets + return tmp + + + -- C++/Java like choice ("...?...:...;") +:: routine choose public + if arg(1)=.true then return arg(2) + return arg(3) + diff --git a/modules/windows/ole/oleinfo/oleinfo.css b/modules/windows/ole/oleinfo/oleinfo.css new file mode 100644 index 0000000..d19dc0d --- /dev/null +++ b/modules/windows/ole/oleinfo/oleinfo.css @@ -0,0 +1,195 @@ +/* + *----------------------------------------------------------------------------* + * * + * Copyright (c) 2002-2022 Rony G. Flatscher. All rights reserved. * + * Copyright (c) 2023 Rexx Language Association. All rights reserved. * + * * + * This program and the accompanying materials are made available under * + * the terms of the Common Public License v1.0 which accompanies this * + * distribution. A copy is also available at the following address: * + * https: www.oorexx.org license.html * + * * + * Redistribution and use in source and binary forms, with or * + * without modification, are permitted provided that the following * + * conditions are met: * + * * + * Redistributions of source code must retain the above copyright * + * notice, this list of conditions and the following disclaimer. * + * Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in * + * the documentation and or other materials provided with the distribution. * + * * + * Neither the name of Rexx Language Association nor the names * + * of its contributors may be used to endorse or promote products * + * derived from this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + *----------------------------------------------------------------------------* + + purpose: formatting information for the "oleinfo*" set of Object Rexx programs + and HTML-files which embed Object Rexx code + +*/ + +@media screen { + + H1 { color: blue; + } + + body { background-color: lightgoldenrodyellow /* #ffffdd */ ; + font-family: Times, Avantgarde; + font-family: Arial,sans-serif; + font-size: 14pt; + } + + div.alert { + background-color: black; + color: white; + text-align: center; + padding: 5 5 5 5; + } + + + .choose { color: brown; + font-weight: bold; + } + + A.choose { + text-decoration: none; + } + + .choose:hover { + font-size: 150%; + font-weight: bolder; + text-decoration: none; + } + + .hint_not_found { + font-weight: bold; + color: red; + } + + .hint { + font-size: 75%; + } + + table.hint { + color: blue; + } + + + col.th_hint { color: orange; + text-align: right; + } + + col.td_hint { + color: black; + } + +} + + +@media screen, print { + + H1 { color: blue; + text-align: center; + font-family: Arial,sans-serif; + font-size: 200%; + } + + table.all_CLSIDs { + font-size: 75%; + } + + .doc { color: blue; + font-style: italic; + } + + .name { + color: red /* red */ ; + font-weight: bold; + } + + .hilite { background-color: yellow; } + + .optional { font-style: italic; + font-size: 90%; + } + + .inout { vertical-align: sub; + font-size: smaller; + } + + + .info { font-style: italic; + font-weight: bold; + font-variant: small-caps; + font-size: 80%; + text-align: right; + } + + + .type { font-variant: small-caps; + font-family: Arial,sans-serif; + font-size: 75%; + font-style: italic; + font-weight: bold; + color: green; + } + + .number { text-align: right; + font-style: italic; + } + + + tr.odd { + background-color: rgb(235, 235, 235) ; /* also in hex possible, e.g. #f1f1f1 */ + } + + td.indent { + text-indent: 1cm; + } + + .bottom_info { font-variant: small-caps; + font-family: Arial,sans-serif; + font-size: 65%; + font-style: italic; + text-align: center; + font-weight: bold; + } + + +} + + +@media print { + BODY { + font-size: 12pt; + } + + TABLE { + padding: 1px; + font-size: 10pt; + } + + tr.return { color: green; border: 1px solid black; } +} + + +@media all { + +/* BODY { line-height: 1.2;} */ +} + + diff --git a/modules/windows/ole/oleinfo/oleinfo.properties b/modules/windows/ole/oleinfo/oleinfo.properties new file mode 100644 index 0000000..5d3c3be --- /dev/null +++ b/modules/windows/ole/oleinfo/oleinfo.properties @@ -0,0 +1,51 @@ +-- *----------------------------------------------------------------------------* +-- * * +-- * Copyright (c) 2002-2022 Rony G. Flatscher. All rights reserved. * +-- * Copyright (c) 2023 Rexx Language Association. All rights reserved. * +-- * * +-- * This program and the accompanying materials are made available under * +-- * the terms of the Common Public License v1.0 which accompanies this * +-- * distribution. A copy is also available at the following address: * +-- * https: www.oorexx.org license.html * +-- * * +-- * Redistribution and use in source and binary forms, with or * +-- * without modification, are permitted provided that the following * +-- * conditions are met: * +-- * * +-- * Redistributions of source code must retain the above copyright * +-- * notice, this list of conditions and the following disclaimer. * +-- * Redistributions in binary form must reproduce the above copyright * +-- * notice, this list of conditions and the following disclaimer in * +-- * the documentation and or other materials provided with the distribution. * +-- * * +-- * Neither the name of Rexx Language Association nor the names * +-- * of its contributors may be used to endorse or promote products * +-- * derived from this software without specific prior written permission. * +-- * * +-- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * +-- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * +-- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * +-- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * +-- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * +-- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * +-- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * +-- * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * +-- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * +-- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * +-- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +-- * * +-- *----------------------------------------------------------------------------* + +-- purpose: allows to define the name of the css to use and whether it is to +-- be incorporated into the generated html documentation + +-- Please note: - the keys are case sensitive +-- - leading blanks after the equal sign get preserved + +cssFileName = oleinfo.css + +-- if incorporateCSS=0 then external links get generated, else if 1 the css +-- gets incorporated into the header of the generated html documentation +incorporateCSS =1 + + diff --git a/modules/windows/ole/oleinfo/oleinfo2html.frm b/modules/windows/ole/oleinfo/oleinfo2html.frm new file mode 100644 index 0000000..5d6cd66 --- /dev/null +++ b/modules/windows/ole/oleinfo/oleinfo2html.frm @@ -0,0 +1,992 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2002-2022 Rony G. Flatscher. All rights reserved. */ +/* Copyright (c) 2023 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/*********************************************************************** + program: oleinfo2html.frm + purpose: Query the OLE/ActiveX automation interface, create HTML renderings of results + + needs: oleinfo.cls + + usage: require this file + + oleinfo(app_name[, [oleobj] [, [bCompact] [, HTMLString]]] ) + + app_name OLE/ActiveX program name or class-id + oleobj OLE object, .nil or empty string + ... if .nil or empty string, an OLE object is created with app_name + bCompact ... .true=compact rendering, .false=full rendering including constants + HTMLString ... if given, gets inserted right before tables begin + + returns: array with two elements: string of and string of + +***********************************************************************/ + +nl="0d0a"x +parse source . . thisPgm +thisLocation=filespec('location',thisPgm) + + -- create a stylesheet link with a fully quailified name in addition to one without a path + +-- oleinfo.properties +propsFile="oleinfo.properties" +if \sysFileExists(propsFile) then propsFile=thisLocation||propsFile + +if sysFileExists(propsFile) then +do + props=.Properties~load(propsFile) + stylesheet =props~getProperty("cssFileName", stylesheet)~strip + bIncorporateCss=props~getLogical("incorporateCSS", .true) +end +else -- no cssFile found, just refer to it, do not attempt to incorporate +do + stylesheet ="oleinfo.css" + bIncorporateCss=.false +end + +if bIncorporateCss then -- does stylesheet exist? +do + if \sysFileExists(stylesheet) then + do + tmpStyleSheet=thisLocation||stylesheet + if sysFileExists(tmpStyleSheet) then + styleSheet=tmpStyleSheet + else -- does not exist, do not incorporate CSS, leave original name intact + bIncorporateCss=.false + end +end + +tmpLocalCss="" +if bIncorporateCss then -- if .true get css-definitions and copy them into the head +do + s=.stream~new(stylesheet)~~open("read") + tmp="" nl -- incorporate css definitions + s~close +end +else +do + tmp=stream(stylesheet, "c", "query exists") + + if tmp="" then -- hmm, not found, maybe wer are not in our home directory, try it with that + do + errMsg="Problem, cannot locate stylesheet:" stylesheet + if window <> "WINDOW" then call alert msg + else .error~say(msg) + end + + tmpLocalCss=' ' + if tmp <> "" then + do + tmp=' 'nl , + ' ' + end + else + tmp="" +end + + -- HTML head text +.local~head.text = , + ' 'nl , + ' 'nl , + ' 'nl , + ' 'nl , + 'OLE/ActiveX Automation Interfaces for "\\//" 'nl , + tmpLocalCss nl , + nl , + tmp nl , + ' 'nl , + .resources~flip.js nl , + ' 'nl , + ' 'nl , + '
'nl + + -- HTML body text leadin +.local~leadin.body.text = '
'nl + + -- HTML body text leadout +.local~leadout.body.text = '
'nl + + + -- flip-code +.local ~ flip.code = nl , + ' 'nl , + ' 'nl + + + -- query computer, domain and user-name, save info with the local environment for later referral +if .rgf.info=".RGF.INFO" then -- not set yet, query WSH for user data +do + wn = .OLEObject~New("WScript.Network") + .local~rgf.info = wn~userName"/"wn~userDomain"@\\"wn~computerName +end + + +::requires "oleinfo.cls" -- class which queries and keeps the OLE-infos + + /* create the HTML rendered output of the ole-infos */ +::routine oleinfo2html public + use arg olestring, oleobj, bCompact, htmlString + + bCompact = (bCompact=.true) -- default to .false, i.e. more verbose output + bBrowser = (window<>"WINDOW") -- determine whether running under MS Internet Explorer + if bBrowser then -- assuming to run under WWW-browser + window~status='Interrogating the OLE object automation interface ...' + + if arg(2)="" | arg(2)=.nil then a=.rgf.oleinfo~new(.nil, olestring) -- create a parsed OLEObject object + else a=.rgf.oleinfo~new(oleobj, olestring) + + if a~oleobject=.nil then return .array~new -- no OLEObject available, return empty array + + ts. = a~allMethodSortedStem -- stem with all methods sorted + +-- outArray = .array~new -- create array which contains the HTML-lines +-- aIdx = 1 -- set array index to 1 + + outMB=.mutableBuffer~new + -- call time "r" + + call sag '

' a~oleString '

' + call sag + call sag 'Definitions from typelib:' '['a~libname']' + call sag 'with the brief documentation:' + call sag '['a~libdoc']' + + -- determine date of ooRexx interpreter, if newer than 20220516, then the attributes CLSID and ProgId are available + sdate=date("s",.rexxinfo~date) -- turns ooRexx production date into a sorted date (YYYYMMDD) + if sdate>"20220516" then -- show attributes ProgID and CLSID + do + call sag '

Effective ProgID: ['a~oleobject~progid']' + call sag 'CLSID: ['a~oleobject~clsid']

' + end + + call sag '
(These published interfaces got retrieved using the .OLEInfo class from ooRexx with the exact name: "'.rexxinfo~name'".)' + call sag + + if arg(4, "Exists") then call sag htmlString -- insert received HTML-string + + if bCompact then call do_the_work_compact + else + do +-- call sag .flip.code -- add flip-code for showing/hiding table bodies + call do_the_work + end + + call sag '

' + call sag '

' + call sag '
' + call sag 'Created with ' + call sag '
ooRexx (Open Object' + call sag 'Rexx) ("createOleInfo.rex")' + + call sag 'on' '' pp(date("s") time()) '' + call sag 'run by' '' pp(.rgf.info) '' + call sag '
' + call sag '
' + + call sag + + tmp=outMB~string + + -- broken up into two pieces: a string for and one for + return .array~of( changestr( "\\//", .head.text, olestring), .leadin.body.text tmp .leadout.body.text ) + + + /* create the HTML text for documenting the OLE interfaces: methods, get/put properties, events, constants */ +do_the_work: + + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + /* dump methods */ + + call sag '

' + + o=a~methodDir -- get method directory from OLEInfo object + if bBrowser then -- assuming to run under WWW-browser + window~status='Analyzing and creating HTML-text for available' o~items 'methods ...' + + call sag + call sag '' + -- call sag '
' + + if o~items=0 then + do + tmp1='' + tmp2='style="display:none"' + end + else + do + tmp1='checked' + tmp2='' + end + + call sag + call sag '' + call sag '' + call sag + + if bBrowser then -- assuming to run under WWW-browser + window~status='Analyzing and creating HTML-text for available' o~items 'methods ...' + + m=0 + do i=1 to ts.0 + if o~hasentry(ts.i) then + do + m=m+1 + ot=o~entry(ts.i) + call sag '' + call sag '
show', + '' + + call sag '' '' a~methodDir~items 'Method[s]' '' + call sag '
No. Name Documentation, Argument[s], Return Value' + call sag '
'm '' ts.i , + ' ' ot~doc~string '' '
' + + call sag + call sag '' + if ot~params~items > 0 then + do + call sag '
arg: ' + call write_arguments ot~params + end + call sag '
returns: ' ot~retType choose(ot~retType="VT_VOID", "( no return value )", "") + call sag '
' + end + call sag + end + call sag '
' + call sag + + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + /* readonly properties */ + call sag '

' + + o=a~getOnlyPropertyDir -- get directory with the read-only properties from OLEinfo object + if bBrowser then -- assuming to run under WWW-browser + window~status='Analyzing and creating HTML-text for available' o~items 'read-only properties ...' + + + call sag + call sag '' + + if o~items=0 then + do + tmp1='' + tmp2='style="display:none"' + end + else + do + tmp1='checked' + tmp2='' + end + + call sag '' + call sag + call sag '' + + m=0 + do i=1 to ts.0 + if o~hasentry(ts.i) then + do + m=m+1 + ot=o~entry(ts.i) + -- call sag '' + call sag '
show', + '' + + call sag '' '' a~getOnlyPropertyDir~items 'Read-only Properties' '' + + call sag '
No. Name Documentation, Return Value' + call sag '
'm '' ts.i ' ' ot~doc~string '' '
' + + call sag '
'm '' ts.i , + ' ' ot~doc~string '' '
' + + + call sag + call sag '' + if ot~params~items > 0 then + do + call sag '
arg: ' + call write_arguments ot~params + end + call sag '
returns: ' ot~retType choose(ot~retType="VT_VOID", "( no return value )", "") + + call sag '
' + call sag + end + end + call sag '
' + call sag + + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + /* write-only properties */ + call sag '

' + + o=a~putOnlyPropertyDir -- get write-only property from OLEinfo object + if bBrowser then -- assuming to run under WWW-browser + window~status='Analyzing and creating HTML-text for available' o~items 'write-only properties ...' + + call sag + call sag '' + + if o~items=0 then + do + tmp1='' + tmp2='style="display:none"' + end + else + do + tmp1='checked' + tmp2='' + end + + call sag '' + call sag + call sag '' + + m=0 + do i=1 to ts.0 + if o~hasentry(ts.i) then + do + m=m+1 + ot=o~entry(ts.i) + -- call sag '' + call sag '
show', + '' + + call sag '' '' a~putOnlyPropertyDir~items 'Write-only Properties' '' + + call sag '
No. Name Documentation, Argument[s], Return Value' + call sag '
'm '' ts.i ' ' ot~doc~string '' '
' + + call sag '
'm '' ts.i , + ' ' ot~doc~string '' '
' + + + call sag + call sag '' + if ot~params~items > 0 then + do + call sag '
arg: ' + call write_arguments ot~params + end + call sag '
returns: ' ot~retType choose(ot~retType="VT_VOID", "( no return value )", "") + call sag '
' + end + call sag + end + call sag '
' + + call sag + + + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + /* read/write properties */ + call sag '

' + o=a~getAndPutPropertyDir + if bBrowser then -- assuming to run under WWW-browser + window~status='Analyzing and creating HTML-text for available' o~items 'read/write properties ...' + + call sag + call sag '' + + if o~items=0 then + do + tmp1='' + tmp2='style="display:none"' + end + else + do + tmp1='checked' + tmp2='' + end + + call sag '' + call sag + call sag '' + + m=0 + do i=1 to ts.0 + if o~hasentry(ts.i) then + do + m=m+1 + ot=o~entry(ts.i) + -- call sag '' + call sag '
show', + '' + + call sag '' '' a~getAndPutPropertyDir~items 'Read/Write Properties' '' + + call sag '
No. Name Documentation, Argument[s], Return Value' + call sag '
'm '' ts.i ' ' ot~doc~string'' '
' + + call sag '
'm '' ts.i , + ' ' ot~doc~string '' '
' + + call sag + call sag '' + if ot~params~items > 0 then + do + call sag '
arg: ' + call write_arguments ot~params + end + call sag '
needs/returns: ' ot~retType choose(ot~retType="VT_VOID", "( no return value )", "") + call sag '
' + call sag + end + end + call sag '
' + call sag + + + + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + /* unknown properties/methods, i.e. unknown invocation type */ + call sag '

' + o=a~naDir + if bBrowser then -- assuming to run under WWW-browser + window~status='Analyzing and creating HTML-text for available' o~items 'unknown invocation types ...' + + call sag + call sag '' + + if o~items=0 then + do + tmp1='' + tmp2='style="display:none"' + end + else + do + tmp1='checked' + tmp2='' + end + + call sag '' + call sag + call sag '' + + m=0 + do i=1 to ts.0 + if o~hasentry(ts.i) then + do + m=m+1 + ot=o~entry(ts.i) + -- call sag '' + call sag '
show', + '' + + call sag '' '' a~naDir~items 'Methods with Unknown Invocation Type Properties' '' + + call sag '
No. Name Documentation, Argument[s], Return Value' + call sag '
'm '' ts.i ' ' '
' + call sag '
'm '' ts.i , + ' ' ot~doc~string '' '
' + + call sag 'Invocation type:' ot~invkind "(".rgf.invKind[ot~invkind]")" '
' + + call sag + call sag '' + + if ot~params~items > 0 then + do + call sag '
arg: ' + call write_arguments ot~params + end + + call sag '
returns: ' ot~retType choose(ot~retType="VT_VOID", "( no return value )", "") + call sag '
' + call sag '
' + end + call sag + end + call sag '
' + call sag + + + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + /* events */ + call sag '

' + o=a~eventDir + if bBrowser then -- assuming to run under WWW-browser + window~status='Analyzing and creating HTML-text for available' o~items 'events ...' + + call sag + call sag '' + + if o~items=0 then + do + tmp1='' + tmp2='style="display:none"' + end + else + do + tmp1='checked' + tmp2='' + end + + call sag '' + call sag + call sag '' + + ts. = a~eventSortedStem + + m=0 + do i=1 to ts.0 + if o~hasentry(ts.i) then + do + m=m+1 + ot=o~entry(ts.i) + call sag '" + call sag '
show', + '' + + call sag '' '' a~eventDir~items 'Event(s)' '' + + call sag '
No. Name Documentation, Argument[s], Return Value' + call sag '
'm '' ts.i , + ' ' ot~doc~string '' '
' + + if ot~params~items > 0 then + do + + call sag + call sag '' + call sag '
arg: ' + call write_arguments ot~params + call sag '
' + end + else call sag ' ' + call sag + end + end + call sag "
' + call sag + + + + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + /* constants */ + ts.=a~constantSortedStem + + if bBrowser then -- assuming to run under WWW-browser + window~status='Analyzing and creating HTML-text for available' ts.0 'constants ...' + + call sag '

' + call sag + call sag '' + call sag '' + call sag + call sag '' + + + do i=1 to ts.0 + call sag '" + call sag "
show', + '' + + call sag '' '' ts.0 'Constant(s)' '' + + tmp2='style="display:none"' + call sag '
No. Name Value' + call sag '
'i '' ts.i '' a~oleobject~getconstant( ts.i ) + end + call sag "
" + call sag + + + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + call sag + + if bBrowser then -- assuming to run under WWW-browser + window~status='Done.' + return + + + + /* create a compact (terse) output: methods, properties, events */ +do_the_work_compact: + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + + call sag '

' + + o=a~methodDir + if bBrowser then -- assuming to run under WWW-browser + window~status='Analyzing and creating HTML-text for available' o~items 'methods ...' + + call sag + call sag '' + + call sag ' ' + call sag + call sag ' ' + + + + m=0 + do i=1 to ts.0 + if o~hasentry(ts.i) then + do + m=m+1 + ot=o~entry(ts.i) + + p_items=ot~params~items -- get number of arguments/parameters + + evenOdd=choose( m//2, "odd", "even") + + call sag '' + call sag ' ' + call sag '
' '' a~methodDir~items 'Method[s]' '' + + call sag '
No. Name' + call sag ' Argument[s], Documentation' + call sag '
' m + retType=ot~retType + call sag ' 'choose(retType="VT_VOID", "", retType)'' + call sag ' ' ts.i'' + -- call sag ' ' + call sag ' ' + if p_items > 0 then + do + call sag '( ' + call write_arguments_compact ot~params + call sag ' )' + end + + if wordpos( ot~doc~string, "n/a (null)") = 0 then + do + if p_items>0 then call sag '
' + call sag '' ot~doc~string '' + end + call sag + end + end + call sag '
' + + + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + + call sag '


' + + Prop_totals=a~getPropertyDir~items + a~putPropertyDir~items + a~naDir~items + + if bBrowser then -- assuming to run under WWW-browser + window~status='Analyzing and creating HTML-text for available' prop_totals 'properties ...' + + call sag + call sag '' + call sag ' ' + call sag + call sag ' ' + + -- o=a~methodDir + + m=0 + do i=1 to ts.0 + tmpList=.list~new + tmp=a~getPropertyDir~entry(ts.i) -- a get property? + getName="" + if tmp <> .nil then + do + tmpList~insert(tmp) + getName=ts.i + end + + tmp=a~putPropertyDir~entry(ts.i) -- a put property? + if tmp <> .nil then tmpList~insert(tmp) + + tmp=a~naDir~entry(ts.i) -- an unknown invoked method property? + if tmp <> .nil then tmpList~insert(tmp) + + do ot over tmpList -- get all entries for + m=m+1 + -- ot=aMD~entry(ts.i) -- get property + + p_items=ot~params~items -- get number of arguments/parameters + + evenOdd=choose( m//2, "odd", "even") + + call sag '' + call sag ' ' + call sag '
' '' prop_totals 'Property[ies]' '' + + call sag '
No. Name' + call sag ' Argument[s], Documentation' + call sag '
' m + retType=ot~retType + call sag ' 'choose(retType="VT_VOID", "", retType)'' + + -- indicate the put-property by appending the assing operator "=" + call sag ' ' ts.i || choose(ot~invKind=4, "=", "") '' + -- call sag ' ' + call sag ' ' + if p_items > 0 then + do + call sag '( ' + call write_arguments_compact ot~params + call sag ' )' + end + + if wordpos( ot~doc~string, "n/a (null)") = 0 & \(ot~invKind=4 & getName=ts.i) then + do + if p_items>0 then call sag '
' + call sag '' ot~doc~string '' + end + end + call sag + end + call sag '
' + + + + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + + call sag '


' + + o=a~eventDir + if bBrowser then -- assuming to run under WWW-browser + window~status='Analyzing and creating HTML-text for available' o~items 'events ...' + + call sag + call sag '' + call sag ' ' + call sag + call sag ' ' + + ts. = a~eventSortedStem + + m=0 + do i=1 to ts.0 + if o~hasentry(ts.i) then + do + m=m+1 + ot=o~entry(ts.i) + + p_items=ot~params~items -- get number of arguments/parameters + + evenOdd=choose( m//2, "odd", "even") + + call sag '' + call sag ' " + call sag '
' '' o~items 'Event(s)' '' + call sag '
No. Name' + call sag ' Argument[s], Documentation' + call sag '
' m + + call sag ' ' + call sag ' ' ts.i'' + -- call sag ' ' + call sag ' ' + if p_items > 0 then + do + call sag '( ' + call write_arguments_compact ot~params + call sag ' )' + end + + if wordpos( ot~doc~string, "n/a (null)") = 0 then + do + if p_items>0 then call sag '
' + + call sag '' ot~doc~string '' + end + end + call sag + end + call sag "
' + call sag + + + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + + /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + call sag + + if bBrowser then -- assuming to run under WWW-browser + window~status='Done.' + return + + + + -- write all arguments of this method, event +write_arguments: procedure expose outMB -- outArray aIdx + use arg ot + if ot~items=0 then return + + call sag + call sag '' + call sag '' , + '' , + '
arg #' m 'of' t':' '' choose(o~opt, pp(o~name), o~name) , + -- call sag '
' choose(o~opt, pp(o~name), o~name) , + call sag '
#' m':' '' choose(o~opt, '[ ' || o~name || ' ]', o~name) , + '' choose(o~in, "in", "") , + '' choose(o~out, "/out", "") , + '' choose(o~opt, '[ optional ]', "") , + '' o~type + end + + call sag '
' + + return + + + + -- write all arguments of this method, event +write_arguments_compact : procedure expose outMB -- outArray aIdx + use arg ot + if ot~items=0 then return + + t=ot~items + m=0 + do o over ot + m=m+1 + tmp = ''o~name'' + + tmp = tmp || ' ' || o~type || "" + + if o~out then + tmp = tmp || ' ' || choose(o~in, "in/", "---") || "out" + + + call sag choose( o~opt, ''pp(' 'tmp' ')"" , tmp) + if m <> t then -- if not last argument, add comma + call sag " ," + end + return + + + + -- save text in array +sag: procedure expose outMB -- outArray aIdx + + outMB~~append(arg(1))~~append("0d0a"x) + return + + -- cheap "pretty" print +pp: procedure + return "[" || arg(1)~string || "]" + + +::resource flip.js + +::END + +::resource flip.rex + ' 'nl , + ' 'nl +::END + diff --git a/modules/windows/ole/oleinfo/readme.txt b/modules/windows/ole/oleinfo/readme.txt new file mode 100644 index 0000000..8fac3fb --- /dev/null +++ b/modules/windows/ole/oleinfo/readme.txt @@ -0,0 +1,149 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2002-2022 Rony G. Flatscher. All rights reserved. */ +/* Copyright (c) 2023 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +"oleinfo" +========= + +ooRexx set of Window programs for analyzing and documenting registered Windows +OLE/COM components. + +Please note: Windows will expose only those ProgIDs that match the bitness of + the program (ooRexx). Therefore running these little utilities with + 32-bit and 64-bit versions of the ooRexx interpreter may yield + different ProgIDs. (ooRexx 5 allows 32-bit and 64-bit versions to run + in parallel on the same Windows computer.) + + +- listProgIds.rex ... program lists all registered Windows OLE/COM components + + - optional argument 1: supplying the digit 1 adds CLSID to the output + - optional argument "needle": lists only ProgIDs containing the needle + + - examples: + + rexx listProgIds.rex + rexx listProgIds.rex policy + rexx listProgIds.rex 1 + rexx listProgIds.rex 1 policy + +- createOleInfo.rex ... program to create the documentation on the fly, if a + typelib got installed with the OLE/COM component + + - argument 1: ProgID or CLSID + - optional argument 2: 0 (default) long, 1 short (reference) documentation + - optional argument 3: 0 no display, 1 (default) display documentation + + - examples: + + rexx createOleInfo.rex InternetExplorer.Application + rexx createOleInfo.rex InternetExplorer.Application 1 + rexx createOleInfo.rex InternetExplorer.Application 1 0 + rexx createOleInfo.rex {0002DF01-0000-0000-C000-000000000046} + rexx createOleInfo.rex {0002DF01-0000-0000-C000-000000000046} 1 0 + rexx createOleInfo.rex {0002DF01-0000-0000-C000-000000000046} 0 1 + + + +- getOleConstants.rex ... program creates a Rexx program that puts all constant values + into .local~ole.const; requiring or calling that created + Rexx program makes all constants of that OLE/COM component + available to the programmer. To retrieve a specific constant + send the constant name to ".ole.const" which will return its + value. + + - argument 1: ProgID or CLSID + - optional argument 2: name of the file the generated generated Rexx code + should be saved to; if omitted output goes to stdout (the screen) + ... if file gets generated incorporate it either with the + "::requires file.rex" or "call file.rex" statement; therafter + fetch any constant sending its name .ole.const + + - examples: + + rexx getOleConstants.rex Excel.Application excel_constants.rex + ... inspect "excel_constants.rex", use in Rexx program: + ... + say .ole.const~xlColumnHeader -- access Excel constant "xlColumnHeader" + ... + ::requires excel_constants.rex -- incorporate all Excel constants + + rexx getOleConstants.rex Word.Application word_constants.rex + ... inspect "word_constants.rex", use in Rexx program: call word_constants.rex + ... + call word_constants.rex -- incorporate all Word constants + ... + say .ole.const~wdReadingView -- access Word constant "wdReadingView" + ... + +--- supporting programs + + - oleinfo.css ... the cascading stylesheet for the generated documentation + + - oleinfo.cls ... support package for these utilities representing each OLE/COM component + with the most important information about it + + - oleinfo.properties ... a property (text) file defining the CSS file name and whether its + content should be incorporated into the head elelment of the generated + HTML documentation + + - oleinfo2html.frm ... program to create the long and short/reference HTML documentation + + - reg_classids4ole.cls ... support package to analyze the registry for OLE/COM components + +--- NOTE: you can invoke createOleInfo as a subroutine, function from an ooRexx program with the + following arguments: + + - argument 1: an OleObject or a string with the ProgID or CLSID; this way + it becomes possible to have the documentation created of an OLE/COM + object returned by a windows method or property + + - optional argument 2: title to use for the HTML rendering and filename + + - optional argument 3: 0 (default) long, 1 short (reference) documentation + + - optional argument 4: 0 no display, 1 (default) display documentation + + - example: + + ... cut ... + oleobject = winapp~getSomething(...) -- returns an OLE object + -- document the returned OLE object as HTML with a supplied title + call createOleInfo oleobject, "From winapp~getSomething(..)" + ... cut ... + + Cf. the accompanying test.rex program diff --git a/modules/windows/ole/oleinfo/reg_classids4ole.cls b/modules/windows/ole/oleinfo/reg_classids4ole.cls new file mode 100644 index 0000000..07b87dc --- /dev/null +++ b/modules/windows/ole/oleinfo/reg_classids4ole.cls @@ -0,0 +1,367 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2002-2022 Rony G. Flatscher. All rights reserved. */ +/* Copyright (c) 2023 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/*********************************************************************** + + program: reg_classids4ole.rex + + purpose: analyzes the Windows registry for CLSID-->PROGIDs, defines a class and collections + + usage: use the "::requires" directive to incorporate classes and routines +***********************************************************************/ + +.local~rgf.debug=0 -- set debug level + +-- initialization +.local ~ rgf.registry = .WindowsRegistry~new -- create a registry object save it in .local +.local ~ rgf.hKey_classes_root = .rgf.registry~classes_root -- save handle to root of classes + + -- get handle to key "CLSID" located in top level key "HKEY_CLASSES_ROOT" +.local~rgf.hKey_CLSID_root = .rgf.registry~open(.rgf.hkey_classes_root, "CLSID", "READ") + + +::requires winsystm.cls -- get access to the Windows registry + + +/** Returns .true if argument (a PROGID or CLSID) exists in HKEY_CLASSES_ROOT or HKEY_CLASSES_ROOT\CLSID, .false else. +*/ +::routine reg_exists public + parse arg reg_name + + -- query key (case insensitive lookup by Windows), if not available "0" will be returned as the handle + hKey = .rgf.registry~open(.rgf.hkey_classes_root, reg_name, "READ") + if hKey=0 then + do + hKey = .rgf.registry~open(.rgf.hkey_classes_root, "CLSID\" || reg_name, "READ") + if .rgf.debug > 1 then say "reg_exists(): not found in root, looking in CLSID\ ..." + end + + if .rgf.debug > 1 then say "reg_exists(): reg_name="pp(reg_name) "hKey="pp(hKey) + if .rgf.debug > 2 then call dump_handle hKey + + .rgf.registry~close(hKey) -- close (free) handle + return hKey <> 0 + + + + +/** Dumps the values and subkey names of the key referred to by the received handle */ +::routine dump_handle + use arg hKey + + say + s. = .rgf.registry~query(hKey) -- query key via its handle + tmp="class name="pp(s.class) "subkeys="pp(s.subkeys) "values="pp(s.values) , + "last changed on:" pp(s.date) pp(s.time) + say tmp + + ind=" " -- leadin for text-output + + if s.values>0 then -- show all values of the key, if any + do + say; say ind "listing all values for this key:" + .rgf.registry~listvalues(hKey, stem.) -- get a list of all values for this key + + do i=1 to s.values + tmp=ind ind "name:" pp(stem.i.name) "type:" pp(stem.i.type) "data:" pp(stem.i.data) + say tmp + end + end + + if s.subkeys>0 then -- show names of all subkeys of the key, if any + do + say; say ind "listing all subkeys of this key:" + .rgf.registry~list(hKey, stem.) -- get a list of all subkeys of this key + do i=1 to s.subkeys + tmp=ind ind "subkey name:" pp(stem.i) + say tmp + end + end + say copies("-", 30) + + return + + + /** Returns string value of given argument, enclosed in square brackets: "PrettyPrint" ;) . */ +::routine pp + return "[" || arg(1)~string || "]" + + + +/** Routine expands environment variables in the data. */ +::routine expand public + use arg data + + tmp="" + do while data <> "" + parse var data before "%" v "%" data + tmp = tmp || before || value(v, , "ENVIRONMENT") -- replace environment variable with its value + end + return tmp + + +/** Routine to get the 'CLSID'-object from a given progid or clsid. */ +::routine get_clsid_object public + use arg prog_or_clsid + + clsid2progid=.clsid~clsid2progid -- get access to clsid2porgid[clsid]=progid + + o=clsid2progid[prog_or_clsid] -- assume CLSID in hand + if o=.nil then + do + o=clsid2progid~allat(prog_or_clsid)[1] -- oops, maybe a PROGID ? + + if o=.nil then o=create_clsid_object(prog_or_clsid) -- does not exist as of yet, create it ! + end + else return .clsid~all_clsid[o] + + return o + + +/** Routine either gets a PROGID or a CLSID, analyzes it and returns an instance of class CLSID + or .nil, if PROGID or CLSID not found. */ +::routine create_clsid_object public + use arg clsid, bCLSID -- it's either a PROGID or a CLSID + + bClsid=(bClsid=.true) -- determine if already CLSID given + if \bClsid then -- undetermined, could be PROGID or CLSID + do + -- a PROGID? + hKey = .rgf.registry~open(.rgf.hkey_classes_root, clsid, "READ") + if hKey\=0 then -- a PROGID, get CLSID + do + hKey2=.rgf.registry~open(.rgf.hkey_classes_root, clsid"\CLSID") -- get handle to subkey + -- 2002-12-29, ---rgf + if hkey2=0 then -- subkey "CLSID" not found, maybe "CurVer" pointing to actual PROGID ? + do + hKey3=.rgf.registry~open(.rgf.hkey_classes_root, clsid"\CurVer") -- get handle to subkey + if hKey3 <> 0 then -- o.k. such a subkey was found, now use it to find CLSID + do + s. = .rgf.registry~getValue(hkey3, "") -- get default value = PROGID + curVerPROGID=s.data -- get default value = PROGID + .rgf.registry~close(hKey3) -- close hKey3 + drop s. + .rgf.registry~close(hkey2) -- close hkey2 + hKey2=.rgf.registry~open(.rgf.hkey_classes_root, curVerPROGID"\CLSID") -- get CLSID of "CurVer"-PROGID + end + end + + s. = .rgf.registry~getValue(hKey2, "") -- get default value + + -- if .rgf.debug > 1 then say "create_c_o(): hkey="pp(hkey) "progid="pp(clsid) to "clssid="pp(s.data) "s.type="pp(s.type) + clsid = s.data -- extract value from stem + .rgf.registry~close(hKey2) -- close (free) handle + .rgf.registry~close(hKey) -- close (free) handle + end + end + + -- get a handle to subkey + hClsidKey = .rgf.registry~open(.rgf.hkey_classes_root, "CLSID\"clsid, "READ") + if hClsidKey=0 then + do + msg=clsid": not found!" + if window <> "WINDOW" then nop -- call alert msg + else .error~say(msg) + return .nil -- do return nothing + end + + o=.clsid~new(clsid) -- create instance to store relevant information + odir=o~keys -- get access to directory to contain the keys and values + + s. = .rgf.registry~query(hClsidKey) -- query infos on key (number of subkeys, values; value of: date, time, class (name)) + o~datetime=changestr("/", s.date, "") s.time + if s.values>0 then -- show all values of the key, if any + do + .rgf.registry~listvalues(hClsidKey, stem.) -- get a list of all values for this key + -- show values of CLSID + do i=1 to s.values + if stem.i.name="" then -- default value in hand ? + do + o~description=stem.i.data -- save value with object + leave i -- leave loop + end + end + end + + -- process subkeys + .rgf.registry~list(hClsidKey, list2.) -- get all subkeys + keysDir=.clsid~keysDir -- get directory of interesting subkeys from class CLSID + do idx2=1 to s.subkeys -- iterate over subkeys and their values + if \ keysDir~hasentry(list2.idx2) then iterate -- if subkey-name is not of interest, iterate + -- get a handle to the subkey in hand + keyName=list2.idx2 + hSubKey2=.rgf.registry~open(hClsidKey, keyName, "READ") + if hSubKey2 \= 0 then + do + s2. = .rgf.registry~query(hSubKey2) -- query various infos + if s2.values>0 then -- if values available, iterate over them + do + .rgf.registry~listvalues(hSubKey2, stem2.) -- get a list of all values for this key + do i=1 to s2.values + if stem2.i.name="" then -- default string value in hand, if so save + do + tmp="" + if stem2.i.type="EXPAND" then tmp = expand(stem2.i.data) -- expand environment variable in string + else tmp = stem2.i.data + odir~setentry(keyName, tmp) -- save key with object + leave i + end + end + end + .rgf.registry~close(hSubKey2) -- close (return) handle + end + end -- idx2 + + if o=.nil then return .nil -- iterate -- no entry found, iterate + + if \ odir~hasentry("PROGID") then return .nil -- iterate -- do not process a CLSID which has no value given for PROGID + + -- set up collections for administrating objects of this class + .clsid~clsid_list~insert(clsid) -- save CLSID in list + .clsid~all_clsid~setentry(clsid, o) -- save instance in collection + + -- set up relation between CLSID and PROGID + .clsid~clsid2progid[clsid]=odir~progid + + -- all_progid~setentry(odir~progid, o) + if odir~hasentry("VERSIONINDEPENDENTPROGID") then + do + .clsid~clsid2progid[clsid]=odir~versionIndependentProgid + + -- all_progid~setentry(odir~versionIndependentProgid, o) + .clsid~all_progid[odir~versionIndependentProgid] = o +-- say "versionIndependentProgId:" pp(odir~versionIndependentProgid) "-> o:" pp(o) "CLSID:" pp(o~clsid) + end + -- else +do + .clsid~all_progid[odir~progid] = o -- o.k., then use PROGID +-- say " ProgId:" pp(odir~progId) "-> o:" pp(o) "CLSID:" pp(o~clsid) +end + + if odir~hasentry("TREATAS") then + do + .clsid~clsid2progid[clsid]=odir~treatAs + .clsid~treatAsSrc~put(clsid) -- save CLSID, which needs to be treated as defined in another CLSID + .clsid~treatAsTgt~put(odir~treatAs) -- save target CLSID + end + + return o + +/* ================================================================================= */ +/* class to represent all interesting information about CLSID's */ +::class clsid public + + /* ------------------------- class methods ----------------------------------- */ +::method init class + expose all_clsid all_progid clsid_list clsid2progid keysList keysDir treatAsSrc treatAsTgt + all_clsid = .directory~new -- collects all instances, indexed by CLSID + all_progid= .directory~new -- collects all instances, indexed by PROGID+VERSIONINDEPENDENTPROGID + clsid_list= .list~new + clsid2progid = .relation~new -- maps clsids to ProgID, VersionIndependentProgID and TreatAs + treatAsSrc = .set~new + treatAsTgt = .set~new + keysList = .list~of( "VersionIndependentProgID", , + "ProgID", , + "Version", , + "TreatAs", , -- points to CLSID which contains definitions + "LocalServer", , -- binary program + "LocalServer32", , -- binary program + "ScriptletURL", , -- script-program (instead of LocalServer32) + "InProcHandler", , -- handler being used + "InProcHandler32", , -- handler being used + "InProcServer", , -- server for handler being used + "InProcServer32" ) -- server for handler being used + keysDir=.directory~new + do item over keysList + keysDir~setentry(item, item) -- add name of key into directory + end + +::method all_clsid attribute class -- directory containing clsid as key to instance of this class +::method all_progid attribute class -- directory containing versionindependent/progid as key to instance of this class +::method clsid_list attribute class -- list: containing CLSIDs in order of appearence +::method clsid2progid attribute class -- relation: maps class-ids (idx) to progids, independent progids, treat-as progids +::method keysList attribute class -- list: denotes the key-names regarded to be interesting +::method keysDir attribute class -- directory: allow case-independent look-up of interesting keys +::method treatAsSrc attribute class -- set: contains CLSIDs which depend on other CLSID for operation +::method treatAsTgt attribute class -- set: contains CLSID pointed to + + + -- analyze and build classes +::method analyze_and_build class + expose all_clsid all_progid clsid_list clsid2progid keysList keysDir treatAsSrc treatAsTgt + + handle = .rgf.registry~open(.rgf.hKey_classes_root, "CLSID", "READ") + clslist. = .rgf.registry~query(handle) -- query number of subkeys, values, value of: class (name), date, time + + .rgf.registry~list(handle, subKeyList.) -- get the subkeys (i.e. class-ids in UUID-format + + do idx =1 to clslist.subkeys -- iterate over subkeys + clsid=subKeyList.idx + o=create_clsid_object( clsid, .true ) -- indicate that CLSID-value in hand + + if .rgf.debug>0 then if idx > 200 then leave -- on debug, just process the first 50 entries + end +-- .rgf.registry~close(hSubKey) +-- end + .rgf.registry~close(handle) + + + /* ------------------------- instance methods -------------------------------- */ +::method init + expose clsid description keys + use arg clsid + keys=.directory~new + +::method clsid attribute -- stores the CLSID as found in registry +::method description attribute -- stores the default value of CLSID (describing it) +::method keys attribute -- directory possessing the values of found keys +::method datetime attribute -- date and time of entry in registry + + -- this defines the default string value for this object +::method makestring + expose clsid description datetime + return clsid pp(description) pp(datetime) + + -- this dumps the keys +::method dumpkeys + expose keys + indent=copies(" ", 8) + do item over self~class~keysList + if keys~hasentry(item) then say indent item"="pp(keys~entry(item)) + end + diff --git a/modules/windows/ole/oleinfo/test.rex b/modules/windows/ole/oleinfo/test.rex new file mode 100644 index 0000000..bc0361a --- /dev/null +++ b/modules/windows/ole/oleinfo/test.rex @@ -0,0 +1,113 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2002-2022 Rony G. Flatscher. All rights reserved. */ +/* Copyright (c) 2023 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +-- Note: OLE objects do not always publish everything they offer! + +line="-"~copies(79) -- used as output delimiter + +ProgID = "WScript.Network" +say "ProgID:" ProgId +network= .OleObject~new(ProgID) + -- full documentation (with constants), show in browser +call createOleInfo network, ProgID "(OLE-Object)", .false, .true + -- reference sheet style documentation, show in browser +call createOleInfo network, ProgID "(OLE-Object)", .true, .true + +fn = "WScript_Constants.rex" +say "creating a Rexx program with the published OLE constants named:" fn +call getOleConstants ProgID fn +say "... to access all the constants from your program, require it like:" +say " ::requires" fn +say "... to get the value for any of those OLE constants code like:" +say " value=.ole.const~nameOfOleConstant " +------------------------------------------------------------------------------ + +say line +ProgID = "WScript.Shell" +say "ProgID:" ProgId +shell = .OleObject~new(ProgID) + -- full documentation (with constants), show in browser +call createOleInfo shell, ProgID "(OLE-Object)", .false, .true + -- reference sheet style documentation, show in browser +call createOleInfo shell, ProgID "(OLE-Object)", .true, .true + + -- create a ShortCut object (do not save it) and document its OLE interfaces +shortCut=shell~createShortcut(shell~specialFolders("Desktop")"\Link By ooRexx Via OLE.lnk") +say "shortCut:" shortCut + -- full documentation (with constants), show in browser +call createOleInfo shortCut, "Shortcut (OLE-Object)", .false, .true + -- reference sheet style documentation, show in browser +call createOleInfo shortCut, "Shortcut (OLE-Object)", .true, .true +------------------------------------------------------------------------------ + +say line +ProgId="InternetExplorer.Application" +say "ProgID:" ProgId +say +say "please note: Microsoft tries hard to pull the InternetExplorer from Windows" +say " (in favor of Edge which has no OLE interfaces), such that" +say " eventually the following statements may not work anymore" +say +ie=.oleObject~new(progID) -- create an instance of IE, returns an OLEObject +ie~visible=.true -- make IE window visible + + -- full documentation (with constants), show in browser +call createOleInfo ie, progID, .false, .true + -- reference sheet style documentation, show in browser +call createOleInfo ie, progID, .true, .true + +fn = "InternetExplorer_Constants.rex" +say "creating a Rexx program with the published OLE constants named:" fn +call getOleConstants ProgID fn +say "... to access all the constants from your program, require it like:" +say " ::requires" fn +say "... to get the value for any of those OLE constants code like:" +say " value=.ole.const~nameOfOleConstant " + + -- create documentation for object "document": full documentation, show in browser +url="https://www.RexxLA.org" +say '... now doing a: ie~navigate("'url'")' +ie~navigate(url) +do while ie~busy -- wait until page got fully loaded + call sysSleep 0.001 +end +doc=ie~document -- get document object from IE +say "ie~document:" doc +call createOleInfo doc, "ie~document", .false, .true + +ie~quit -- quit (close) this IE instance diff --git a/modules/windows/ole/wmi/accounts.rex b/modules/windows/ole/wmi/accounts.rex new file mode 100755 index 0000000..1a95bc8 --- /dev/null +++ b/modules/windows/ole/wmi/accounts.rex @@ -0,0 +1,64 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: accounts.rex */ +/* Type: ooRexx script using OLE interface */ +/* */ +/* Description: */ +/* Demo application for displaying all accounts of the windows system with */ +/* WMI (also shows how to display all properties of a WMI object in general)*/ +/* */ +/* An overview of the used Win32_Account class is available at: */ +/* https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-account */ +/* */ +/****************************************************************************/ + +WMIObject = .OLEObject~GetObject("WinMgmts:{impersonationLevel=impersonate}") +userAccounts = WMIObject~InstancesOf("Win32_Account") + +do instance over userAccounts + say + say "="~copies(16) instance~name "="~copies(16) + do i over instance~properties_ + say left(i~name":",20,' ') i~value + end +end + +exit + + diff --git a/modules/windows/ole/wmi/osinfo.rex b/modules/windows/ole/wmi/osinfo.rex new file mode 100755 index 0000000..7260a09 --- /dev/null +++ b/modules/windows/ole/wmi/osinfo.rex @@ -0,0 +1,238 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: osinfo.rex */ +/* Type: ooRexx script using OLE interface */ +/* */ +/* Description: */ +/* A sample script that is using a Windows Management Instrumentation (WMI) */ +/* object ("Win32_OperatingSystem") to obtain information about the */ +/* installed operating system(s) */ +/* */ +/* An overview of the used Win32_OperatingSystem class is available at: */ +/* https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-operatingsystem */ +/* */ +/****************************************************************************/ + +-- prepare a few arrays for more human-readable output +boolArray = "no", "yes" +boostArray = "None", "Minimum", "Maximum" +ostypeArray = .resources~ostype + +-- obtain a WMI object +WMIObject = .OLEObject~GetObject("WinMgmts:{impersonationLevel=impersonate}") + +-- obtain a collection of all Win32_OperatingSystem objects +objects = WMIObject~InstancesOf("Win32_OperatingSystem") + +-- process each OperatingSystem object in the collection +do object over objects + call head object~Description, "=" + + /************* General Information *************/ + call head "General information" + + call print "Build number:", object~BuildNumber + call print "Build type:", object~BuildType + call print "Primary OS:", object~Primary, boolArray + call print "Debug version:", object~Debug, boolArray + call print "Distributed:", object~Distributed, boolArray + call print "Manufacturer:", object~Manufacturer + call print "Version:", object~Version + + sp = object~ServicePackMajorVersion + if sp \= .nil then + if object~ServicePackMinorVersion \= .nil then + sp = sp"."object~ServicePackMinorVersion + call print "Service Pack:", sp + + call print "OS Status:", object~Status + call print "Number of users:", object~NumberOfUsers + call print "Number of licensed users:", object~NumberOfLicensedUsers + call print "Serial Number:", object~SerialNumber + call print "Install Date:", object~InstallDate, "DATE" + call print "Last BootUp Time:", object~LastBootUpTime, "DATE" + + /************* Setup *************/ + call head "Setup" + + call print "Local Date Time:", object~LocalDateTime, "DATE" + call print "Locale:", object~Locale + call print "Boot device:", object~BootDevice + call print "Windows Directory:", object~WindowsDirectory + call print "CodeSet (CP):", object~CodeSet + call print "Country Code:", object~CountryCode + call print "Current Timezone:", object~CurrentTimeZone + call print "System device:", object~SystemDevice + call print "System directory:", object~SystemDirectory + + /************* Memory *************/ + call head "Memory" + + call print "Free physical memory:", object~FreePhysicalMemory, "MEMORY" + call print "Free space in paging files:", object~FreeSpaceInPagingFiles, "MEMORY" + call print "Size stored in paging files:", object~SizeStoredInPagingFiles, "MEMORY" + call print "Free virtual memory:", object~FreeVirtualMemory, "MEMORY" + call print "Total swap space:", object~TotalSwapSpaceSize, "MEMORY" + call print "Total virtual memory:", object~TotalVirtualMemorySize, "MEMORY" + call print "Total visible memory:", object~TotalVisibleMemorySize, "MEMORY" + + /************* System Settings *************/ + call head "System Settings" + + call print "Foreground Application Boost:", object~ForegroundApplicationBoost, boostArray + call print "Maximum number of processes:", object~MaxNumberOfProcesses + call print "Numer of processes:", object~NumberOfProcesses + call print "Maximal process memory size:", object~MaxProcessMemorySize, "MEMORY" + call print "Organization:", object~Organization + call print "Registered User:", object~RegisteredUser + call print "OS language:", object~OSLanguage + call print "OS type:", object~OSType, ostypeArray + +end + + +-- print a header +::routine head + use arg title + title = " " title " " + + if arg(2, "omitted") then do + say + say title~center(78, "-") + say + end + else do + say arg(2)~copies(78) + say title~center(78, arg(2)) + say arg(2)~copies(78) + end + +-- display retrieved information +::routine print + use arg desc, content + + if content == .nil then + return + + -- see if the information needs to be processed or simply displayed + if arg(3, "exists") then + -- we can process some information display a more human-readable form + select case arg(3) + when "MEMORY" then do + -- memory sizes are returned in units of kilobytes + content = content % 1024 "MB" + end + when "DATE" then do + -- e. g. 20201004184321.000000+060 + parse var content yyyy +4 mm +2 dd +2 hh +2 min +2 ss +2 dot +1 usec +6 offset + content = .DateTime~new(yyyy, mm, dd, hh, min, ss, usec, offset)~toLocalTime + end + otherwise -- use array to translate information + content = arg(3)[content + 1] + end + say left(desc, 30) content + + +::options digits 20 -- memory sizes can be very large + +::resource ostype +Unknown +Other +MACOS +ATTUNIX +DGUX +DECNT +Digital Unix +OpenVMS +HPUX +AIX +MVS +OS400 +OS/2 +JavaVM +MSDOS +WIN3x +WIN95 +WIN98 +WINNT +WINCE +NCR3000 +NetWare +OSF +DC/OS +Reliant UNIX +SCO UnixWare +SCO OpenServer +Sequent +IRIX +Solaris +SunOS +U6000 +ASERIES +TandemNSK +TandemNT +BS2000 +LINUX +Lynx +XENIX +VM/ESA +Interactive UNIX +BSDUNIX +FreeBSD +NetBSD +GNU Hurd +OS9 +MACH Kernel +Inferno +QNX +EPOC +IxWorks +VxWorks +MiNT +BeOS +HP MPE +NextStep +PalmPilot +Rhapsody +Windows 2000 +Dedicated +OS/390 +VSE +TPF +::END diff --git a/modules/windows/ole/wmi/process.rex b/modules/windows/ole/wmi/process.rex new file mode 100755 index 0000000..fde958f --- /dev/null +++ b/modules/windows/ole/wmi/process.rex @@ -0,0 +1,61 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: process.rex */ +/* Type: ooRexx script using OLE interface */ +/* */ +/* Description: */ +/* Demo application for displaying running processes of a windows system */ +/* with WMI. */ +/* */ +/* An overview of the used Win32_Process class is available at: */ +/* https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-process */ +/* */ +/****************************************************************************/ + +WMIObject = .OLEObject~GetObject("winmgmts:{impersonationLevel=impersonate}") + +say "Here is a list of currently running processes" + +do process over WMIObject~InstancesOf("win32_process") + say process~processid process~name +end + +exit + + diff --git a/modules/windows/ole/wmi/services.rex b/modules/windows/ole/wmi/services.rex new file mode 100755 index 0000000..e5de7bc --- /dev/null +++ b/modules/windows/ole/wmi/services.rex @@ -0,0 +1,163 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: services.rex */ +/* Type: ooRexx script using OLE interface */ +/* */ +/* Description: */ +/* List, start, stop, pause or resume windows services with WMI. */ +/* */ +/* An overview of the used Win32_Service class is available at: */ +/* https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-service */ +/* */ +/****************************************************************************/ + +WMIObject = .OLEObject~GetObject("WinMgmts:{impersonationLevel=impersonate}") + +/* use Win32_BaseService to get a complete list! */ +services = WMIObject~InstancesOf("Win32_Service") + +boolArray = .array~of("no ","yes") +serviceArray = .array~new(10) + + +j = 0 +/* collect service objects in REXX array */ +do instance over services + j = j + 1 + serviceArray[j] = instance +end + +/* main loop */ +do while input \= "Q" + say "Here is a list of windows services:" + say + say " No. " left("Name",37,' ') "pausable" "stoppable" "Status" + say "-"~copies(76) + do i = 1 to j + say "["right(i,3,' ')"]" left(serviceArray[i]~description,40,' '), + left(boolArray[1+serviceArray[i]~AcceptPause],8,' '), + left(boolArray[1+serviceArray[i]~AcceptStop],6,' '), + serviceArray[i]~State + end + say + say "Enter a command: start|stop|pause|resume , or enter Q to quit" + parse upper pull input number + select + when input = "START" then do + if number < 0 | number > j then say "Illegal service number specified!" + else do + rc = serviceArray[number]~StartService + call SysSleep 1 + /* get updated object */ + serviceArray[number] = .OLEObject~GetObject(serviceArray[number]~Path_~displayname) + select + when rc = 0 then say "The request was accepted." + when rc = 1 then say "The request is not supported." + when rc = 2 then say "The user did not have the necessary access." + when rc = 3 then say "The service cannot be stopped because other services that are running are dependent on it." + when rc = 4 then say "The requested control code is not valid, or it is unacceptable to the service." + when rc = 5 then say "The requested control code cannot be sent to the service because the state of the service is equal to 0, 1, or 2." + when rc = 6 then say "The service has not been started." + when rc = 7 then say "The service did not respond to the start request in a timely fashion." + when rc = 8 then say "Unknown failure when starting the service." + when rc = 9 then say "The directory path to the service executable file was not found." + when rc = 10 then say "The service is already running." + when rc = 11 then say "The database to add a new service is locked." + when rc = 12 then say "A dependency for which this service relies on has been removed from the system." + when rc = 13 then say "The service failed to find the service needed from a dependent service." + when rc = 14 then say "The service has been disabled from the system." + when rc = 15 then say "The service does not have the correct authentication to run on the system." + when rc = 16 then say "This service is being removed from the system." + when rc = 17 then say "There is no execution thread for the service." + when rc = 18 then say "There are circular dependencies when starting the service." + when rc = 19 then say "There is a service running under the same name." + when rc = 20 then say "There are invalid characters in the name of the service." + when rc = 21 then say "Invalid parameters have been passed to the service." + when rc = 22 then say "The account which this service is to run under is either invalid or lacks the permissions to run the service." + when rc = 23 then say "The service exists in the database of services available from the system." + when rc = 24 then say "The service is currently paused in the system." + otherwise say "unknown error!" + end + end + end + when input = "STOP" then do + if number < 0 | number > j then say "Illegal service number specified!" + else do + rc = serviceArray[number]~StopService + call SysSleep 1 + /* get updated object */ + serviceArray[number] = .OLEObject~GetObject(serviceArray[number]~Path_~displayname) + if rc = 0 then say "The request was accepted." + else if rc = 1 then say "The request is not supported." + else say "An error occured." + end + end + when input = "PAUSE" then do + if number < 0 | number > j then say "Illegal service number specified!" + else do + rc = serviceArray[number]~PauseService + call SysSleep 1 + /* get updated object */ + serviceArray[number] = .OLEObject~GetObject(serviceArray[number]~Path_~displayname) + if rc = 0 then say "The request was accepted." + else if rc = 1 then say "The request is not supported." + else say "An error occured." + end + end + when input = "RESUME" then do + if number < 0 | number > j then say "Illegal service number specified!" + else do + rc = serviceArray[number]~ResumeService + call SysSleep 1 + /* get updated object */ + serviceArray[number] = .OLEObject~GetObject(serviceArray[number]~Path_~displayname) + if rc = 0 then say "The request was accepted." + else if rc = 1 then say "The request is not supported." + else say "An error occured." + end + end + + otherwise + if input = "Q" then say "Quitting..." + end +end + +exit + + diff --git a/modules/windows/oodialog/AnimalGame.rex b/modules/windows/oodialog/AnimalGame.rex new file mode 100755 index 0000000..c49ab84 --- /dev/null +++ b/modules/windows/oodialog/AnimalGame.rex @@ -0,0 +1,290 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * samples\oodialog\AnimalGame.rex Animal Riddles (bitmaps come from a DLL.) + * + * This example is based on the original oopet1.rex example. However, rather + * than use the installBitmapButton() method it uses a Windows feature that + * allows the programmer to assign an image list to a button. The images in the + * image list are bitmaps that the operating system uses to paint the button + * face. + * + * This is a better way to get the same effect as installBitmapButton() because + * the OS draws the button with the same look and feel of other buttons. On + * Windows 7, the buttons look like Windows 7 buttons. Whereas with + * installBitmapButton() the buttons look like Windows 95 buttons. + * + * Note: this program uses the public routine, locate(), to get the full path + * name to the directory this source code file is located. In places, the + * variable holding this value has been callously abbreviated to 'sd' which + * stands for source directory. + * + */ + + -- Ensure this program can be executed from any directory. + prgDir = locate() + + -- Use the global .constDir for symbolic IDs and the symbol definitions are in + -- AnimalGame.h + .application~useGlobalConstDir('O', prgDir'rc\AnimalGame.h') + + firstEditID = .constDir[IDC_EDIT_RHINO] + lastEditID = .constDir[IDC_EDIT_HORSE] + do i = firstEditID to lastEditID + b.i = "unknown animal" + end + + dlg = .AnimalDialog~new(prgDir"res\AnimalGame.dll", IDD_ANIMALS, b., firstEditID, lastEditID) + + if dlg~initCode \= 0 then do + msg = 'Failed to create dialog, aborting' + title = 'Unexpected Error' + ret = MessageDialog(msg, , title, 'OK', 'WARNING') + mgr~goBack + return 99 + end + + dlg~execute("SHOWTOP") + + return 0 + +/*------------------------------- requires ---------------------------*/ + +::requires "ooDialog.cls" +::requires "samplesSetup.rex" -- Sets up the sound path + +/*------------------------------- dialog class -----------------------*/ + +::class 'AnimalDialog' subclass Resdialog + +-- This constant is the diffence between the firstEditID edit control resource ID +-- and 1. +::constant EDIT_CONTROL_ID_OFFSET 2020 + +-- The pixel width and height of our bitmaps. +::constant BITMAP_WIDTH 152 +::constant BITMAP_HEIGHT 178 + +::method init + expose firstEditID lastEditID bitmaps buttonIDs + use arg resFile, id, dataStem., firstEditID, lastEditID + + self~init:super(resFile, id, dataStem.) + + imageIDs = .array~of(IDBMP_RHINO, IDBMP_TIGER, IDBMP_ELEPHANT, IDBMP_MOOSE, - + IDBMP_GOAT, IDBMP_DOG, IDBMP_SEAL, IDBMP_HORSE, - + IDBMP_KANGURU) + + buttonIDs = .array~of(IDC_PB_RHINO, IDC_PB_TIGER, IDC_PB_ELEPHANT, IDC_PB_MOOSE, - + IDC_PB_GOAT, IDC_PB_DOG, IDC_PB_SEAL, IDC_PB_HORSE) + + -- Load all our bitmaps from a resource only DLL. Since the .Size argument is + -- omitted from the getImages() method, the operating system uses the actual + -- size of the bitmap. + sd = locate() + res = .ResourceImage~new(sd'res\AnimalGame.dll') + bitmaps = res~getImages(imageIDs) + + -- Connect each button to a method with the same name as the symbolic ID of + -- the button + do i = 1 to buttonIDs~items + self~connectButtonEvent(buttonIDs[i], 'CLICKED', buttonIDs[i]) + end + + +::method initDialog + expose correct beenHelped bitmaps buttonIDs + + ret = Play("guess.wav", yes) + + self~configButtons(bitmaps, buttonIDs) + + correct = .array~of("rhinoceros", "tiger", "elephant", "moose", "goat", "chihuahua", "seal", "horse") + beenHelped = .false + + +::method configButtons private + use strict arg bitmaps, buttonIDs + + size = .Size~new(self~BITMAP_WIDTH, self~BITMAP_HEIGHT) + flags = 'COLOR8 MASK' + margin = .Rect~new(2) + cRef = .Image~colorRef(255, 255, 153) + + do i = 1 to buttonIDs~items + if i = 6 then do + il = .ImageList~create(size, flags, 6) + normal = bitMaps[i] + press = bitMaps[9] + whiteCRef = .Image~colorRef(255, 255, 255) + + ret = il~addMasked(normal, cRef) + ret = il~addMasked(normal, cRef) + ret = il~addMasked(press, whiteCRef) + ret = il~addMasked(normal, cRef) + ret = il~addMasked(normal, cRef) + + self~newPushButton(buttonIDs[i])~setImageList(il, margin) + end + else do + il = .ImageList~create(size, flags, 1) + ret = il~addMasked(bitmaps[i], cRef) + self~newPushButton(buttonIDs[i])~setImageList(il, margin) + end + end + + +::method validate + expose correct beenHelped firstEditID lastEditID + + -- Get the edit control ID offset: + eos = self~EDIT_CONTROL_ID_OFFSET + + -- Disable the Ok button until we are through. + self~newPushButton(IDOK)~disable + + self~getDataStem(A.) + wrongstr = '' + + do i = firstEditID to lastEditID + if \ A.i~strip~caseLessEquals(correct[i - eos]) then do + wrongstr ||= '09'x || i - eos": "A.i || .endOfLine + end + end + if wrongstr = '' then do + if \ beenHelped then ret = Play("clap.wav") + + ret = Play("yourgood.wav", "YES") + + -- Put the timed message in the center of the dialog. + p = self~getRealPos + s = self~getRealSize + p~incr(s~width % 2, s~height % 2) + + if beenHelped then + ret = TimedMessage("You got them all right.... with my help ","E N D", 3000, , p) + else + ret = TimedMessage("You got them all right","B R A V O", 3000, , p) + return .true + end + else do + ret = Play("nope.wav") + + msg = "The following answer(s) is/are incorrect:" || .endOfLine~copies(2) || wrongstr + title = "Incorrect Answers for the ooRexx Animal Game" + ret = MessageDialog(msg, self~hwnd, title, 'OK', 'WARNING', 'DEFBUTTON1') + + -- We are through + self~newPushButton(IDOK)~enable + + return .false + end + + +::method IDC_PB_RHINO unguarded + ret = Play("RHINO.WAV","YES") + return self~giveHint("I only fear the 2 guys on my right", "I am strong", 2000) + + +::method IDC_PB_TIGER unguarded + ret = Play("TIGER.WAV","YES") + return self~giveHint("Hold that t...., hold that .i...", "A song about me", 2000) + + +::method IDC_PB_ELEPHANT unguarded + ret = Play("ELEPHANT.WAV","YES") + return self~giveHint("I blow my nose like a trumpet", "African Heavy Weight", 2000) + + +::method IDC_PB_MOOSE unguarded + ret = Play("MOOSE.WAV","YES") + return self~giveHint("My name rhymes with a sweet brown dessert", "Chocolate ......", 2000) + + +::method IDC_PB_GOAT unguarded + ret = Play("GOAT.WAV","YES") + return self~giveHint("My relatives climb the Matterhorn", "Mountain ....", 2000) + + +::method IDC_PB_DOG unguarded + ret = Play("TAKE.WAV","YES") + + +::method IDC_PB_SEAL unguarded + ret = Play("SEALION.WAV","YES") + return self~giveHint("I am slick in the water","Hint 4 you",2000) + + +::method IDC_PB_HORSE unguarded + ret = Play("HORSE.WAV","YES") + return self~giveHint("My son won the Kentucky Derby", "Giddyup 'N Go Pony", 2000) + + +::method giveHint unguarded private + use strict arg msg, title, ms + + pos = .Mouse~new(self)~getCursorPos + pos~incr(10, 10) + ret = TimedMessage(msg, title, ms, .true, pos) + return 0 + + +::method help unguarded + expose correct beenHelped firstEditID lastEditID + + -- Disable the help button so that it can not be clicked until we are through + -- here. + self~newPushButton(IDHELP)~disable + + beenHelped = .true + ret = Play("help.wav") + + -- Get the edit control ID offset: + eos = self~EDIT_CONTROL_ID_OFFSET + + do i = firstEditID to lastEditID + A.i = correct[i - eos] + end + + self~setDataStem(A.) + + -- Now enable Help again. + self~newPushButton(IDHELP)~enable + + diff --git a/modules/windows/oodialog/GUI_Template.rex b/modules/windows/oodialog/GUI_Template.rex new file mode 100755 index 0000000..c266523 --- /dev/null +++ b/modules/windows/oodialog/GUI_Template.rex @@ -0,0 +1,382 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2006-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/* How to use this template: */ +/* */ +/* This template allows you to create dialogs with ooDialog without need */ +/* for the resource workshop. */ +/* */ +/* It sets out the class directive and the basic methods for a dialog */ +/* */ +/* ooDialog is very fully featured and it would not be useful to try to */ +/* anticipate and include every possible activity. */ +/* */ +/* Not all Dialogs require all the methods listed in the template. */ +/* If you are not adding any control through a particular method then you */ +/* can delete that method and let the superclass handle it */ +/* */ +/* ========================================================================= */ + +/* FIRST - Use Save As to give the template it's new filename */ + +signal on any name any /* error handling if you want */ + + /* ------------------------------------------------- */ + /* Code that you want to execute before creating */ + /* the dialog goes here. */ + /* ------------------------------------------------- */ + + /* ------------------------------------------------- */ + /* You can pre-define dialog object default values */ + /* here by setting them in the a. stem */ + /* */ + /* For instance if you have an entry box with ID 20 */ + /* a.20=[default] presets it */ + /* ------------------------------------------------- */ + +MyDialog=.MyDlgClass~new /*(a.)*/ /* Create ooDialog Class instance */ + + /* ------------------------------------------------- */ + /* Here you can initialise attributes that you */ + /* associate with your controls below */ + /* ------------------------------------------------- */ + + /* ------------------------------------------------- */ + /* If you want to create a non-modal dialog or have */ + /* it start minimised etc. then change the following */ + /* clause. See Show, Execute, ExecuteAsync, Popup& */ + /* PopupasChild in the ooDialog Reference */ +MyDialog~execute('ShowTop') /* Create, show and run the Windows Object */ + /* ------------------------------------------------- */ + + /* ------------------------------------------------- */ + /* Here you have access to methods & Attributes of */ + /* the ooDialog Object after OK/Cancel has been */ + /* pressed. ie: MyDialog~Attribute */ + /* ------------------------------------------------- */ + + /* ------------------------------------------------- */ + /* Code that you want to execute after the Dialog */ + /* has been cleared goes here. */ + /* */ + /* The stem a. can be used to pass values back from */ + /* the dialog. */ + /* ------------------------------------------------- */ + +exit +/* ========================================================================= */ +/* Error Handling routine - returns full information to console */ +/* */ +/* All error information available is written to STDOUT (usually the console)*/ +/* As this may not be present (running a GUI with REXXHIDE) a ooDialog */ +/* errorDialog popup is also presented */ +/* */ +/* While this type of error handling is useful to some people, it also will */ +/* mask the print out of many syntax errors that happen while your dialog */ +/* is executing. */ +/* */ +/* If you are having trouble debugging problems in your dialog, 1.) Comment */ +/* out the 'signal on any' line above. 2.) Execute your dialog from a */ +/* console window so that you will see any syntax messages printed out by */ +/* the interpreter. */ +/* */ +/* Those two steps will solve many of your debugging problems. */ +/* ========================================================================= */ +any: + + signal off any + + errObj=condition("o") /* get exception object */ + errObj~"_SIGL_"= SIGL /* add value of SIGL and sourceline */ + errObj~"_sourceline_"= sourceline(SIGL) + errQ=.queue~new + Say "******************* An Error has occurred *******************" + do err.val over errObj + if errObj~at(err.val)~hasMethod('HasIndex') + then do /* display them after the single liners */ + errq~queue(err.val~right(13,'-')||':') + do err.line over errObj~at(err.val) + errq~queue(" :" err.line) + end /* DO */ + errq~queue("---") + end /* DO */ + else say err.val~Right(13)||':['errObj~at(err.val)||']' + end + + do while errq~items>0 + say errq~pull + end /* DO */ + + Say "****************** End of error diagnostics ***************" + /* in case there is no console - show error message */ + + call errorDialog 'Error' errObj~rc errObj~errortext '0a'x , + 'occurred on line' errObj~_sigl_ 'of' , + errObj~program '0a'x , + errObj~Message '0a'x + +exit -1 +/* ========================================================================= */ +::requires "ooDialog.cls" +/* ========================================================================= */ +::class MyDlgClass subclass userdialog +/* */ +/* The class directive */ +/* Rename your object from MyDlgClass to something that makes sense to you */ +/* you will need to change the reference to it in the main program above */ +/* */ +/* If you are going to be calling this object from other programs using a */ +/* REQUIRES directive then add the keyword PUBLIC to the class directive */ +/* */ +/* ---------------------- */ +/* */ +/* ------------------------------------------------------------------------- */ + + +/* ------------------------------------------------------------------------- */ +/* The init method is called when the dialog is instantiated (by ~new above) */ +::method init +/* ------------------------------------------------------------------------- */ +/* expose a. */ /* Give these variables scope of the Object */ +/* use arg a. */ /* Uncomment if you passed a. as a stem */ + +/*if you do not want to define initial values with a. do not pass it to super*/ +/* otherwise rogue default values may appear in your dialog */ + self~init:super /*(a.)*/ /* we call the Super Class (userdialog) */ + width=300 ; height=200 /* Set the Width and height of dialog */ + + /* Now we create the Windows Object */ + success=self~createCenter(width,height, - + 'This text appears in the Dialog Title',,, - + 'MS Sans Serif',8) + /* The above line creates a dialog in the centre of the screen, if you */ + /* Would rather specify values for x & y use the line below instead */ + /* success=self~create(x,y,width,height,Title) */ + + if \success then do + self~initCode=1 + return + end + /* ------------------------------------------------- */ + /* Here we can initialise any attributes of our */ + /* dialog. */ + /* ------------------------------------------------- */ + + /* ------------------------------------------------- */ + /* Here we can 'connect' dialog item events to */ + /* Methods or Attributes. */ + /* i.e.: self~connectListViewEvent(id,"Changed",, */ + /* "ItemSelectedMethod") */ + /* */ + /* NB: Many createXXX Methods (which appear in the */ + /* defineDialog method below) also provide a way to */ + /* define connections. */ + /* ------------------------------------------------- */ + +/* ------------------------------------------------------------------------- */ +::method defineDialog +/* expose menuBar */ /* Perhaps save a menu object if you create */ + /* one below. */ +/* ------------------------------------------------------------------------- */ +/* This is where we lay out the controls (widgets) in our dialog */ +/* Refer to the ooDialog manual for the create methods and their parameters */ +/* ------------------------------------------------------------------------- */ +/* ------------------------------------------------------------------------- */ +/* DlgArea is a class of imaginary rectangles with an inner margin that */ +/* allows you to reference coordinates within them by dialog units or */ +/* percentages. */ +/* ------------------------------------------------------------------------- */ +/* u = .DlgAreaU~new(self) -- Whole dialog */ +/* a = .DlgArea~new(u~x(''),u~y(''),u~w(''),u~h('')) */ + + /* ------------------------------------------------- */ + /* Here we add the control objects to our dialog */ + /* Dialog Width is available to us as self~sizeX & */ + /* Dialog Height is available to us as self~sizeY */ + /* ------------------------------------------------- */ + + self~createPushButton(IDOK,self~sizeX-60 ,self~sizeY-20,50,15,'DEFAULT','OK') + self~createPushButton(IDCANCEL,self~sizeX-120,self~sizeY-20,50,15,,'Cancel') + +/* examples to cut & paste: */ +/* self~createPushButton(id,x,y,cx,cy,'options','text','method') */ +/* self~createCheckBox(id,x,y,cx,cy,'options',text,'attribute') */ +/* self~createComboBox(id,x,y,cx,cy,'options','attribute') */ +/* self~createEdit(id,x,y,cx,cy,'options','attribute') */ +/* self~createListView(id,x,y,cx,cy,'options','attribute') */ +/* self~createTreeView(id,x,y,cx,cy,'options','attribute') */ +/* self~createStaticText(id, x,y,cx,cy,'options','text') */ +/* self~create[Black|White|Gray]Rect(id,x,y,cx,cy,'options') */ +/* etc. etc. ... */ +/* other controls should have unique ids over 100 (or -1 for static text) */ + + /* ------------------------------------------------- */ + /* You could create a menu here, or really anywhere, */ + /* using one of the menu classes such as the */ + /* .UserMenuBar, and the menu methods. */ + /* */ + /* Save the menu and have it attach to the dialog in */ + /* the initDialog() method. It could be saved in an */ + /* exposed variable for instance. */ + /* ------------------------------------------------- */ + +/* menuBar = .UserMenuBar~new(200, self, ...) */ +/* menuBar~addPopUp(id, 'text', options, ...) */ +/* menuBar~addItem(id, 'someText', options, ...) */ +/* menuBar~addSeparator */ +/* menuBar~complete */ +/* ------------------------------------------------------------------------- */ +::method initDialog +/* expose menuBar */ /* If you are adding a menu perhaps. */ +/* ------------------------------------------------------------------------- */ +/* If you have no need to initialise/populate items delete this method */ + + /* ------------------------------------------------- */ + /* Code here is run after the underlying windows */ + /* dialog object has been created. Whether the */ + /* dialog is displayed depends on the style keywords */ + /* used in the createCenter(), (or create()) method. */ + /* By default the dialog will be created invisible. */ + /* If you use the VISIBLE keyword, the dialog will */ + /* be visisble at this point. */ + /* ------------------------------------------------- */ + + /* ------------------------------------------------- */ + /* Here we can populate list viws etc. */ + /* ------------------------------------------------- */ + +/* for example: */ +/* List = self~newListView([id]) */ +/* if List \= .Nil then do */ +/* list~setImageList(imageList, SMALL) */ +/* list~addStyle("[Style1 style2...]") */ +/* list~insertColumn(0,"[Title]",[width],[style]) */ +/* list~insertColumn(1,"[Title]",[width],[style]) */ +/* do data over dataset */ +/* ordinal=list~addrow(,[icon_no],[column 0 text],[column 1 text]...) */ +/* end */ +/* end */ + + /* ------------------------------------------------- */ + /* If you created a menu in defineDialog(), attach */ + /* it: */ + /* ------------------------------------------------- */ + +/* menuBar~attachTo(self) */ + +/* ------------------------------------------------------------------------- */ +::method ok +/* ------------------------------------------------------------------------- */ +/* The ok() method is invoked automatically by the ooDialog framework when */ +/* the user pushes or clicks a button, or a menu item, with the resource ID */ +/* of IDOK (1). If you do not need to do, or do not want to do, any */ +/* processing here, you can delete this method. The ooDialog framework */ +/* provides the correct implementation for you. The framework also provides */ +/* a default implementation of the validate method. By default validate() */ +/* returns true. If you want to have a chance to validate the user's input, */ +/* and perhaps prevent the dialog from closing, then over-ride the validate */ +/* method. From validate() return true to close the dialog, or false to */ +/* prevent the dialog from closing. */ + + /* ------------------------------------------------- */ + /* If you want to do your validation here, you can */ + /* add the valdiation code here. Then, if you want */ + /* to allow the dialog to close normally, invoke the */ + /* super class's ok() method. If you want to */ + /* prevent dialog from closing, simply return 0 with */ + /* out invoking the super class ok. */ + /* */ + /* By invoking the super class ok() method you */ + /* ensure the dialog is closed properly. That is */ + /* really the best way to end the dialog. The best */ + /* way to not end the dialog at this point is to */ + /* simply return 0. */ + /* ------------------------------------------------- */ + +return self~oK:super + +/* ------------------------------------------------------------------------- */ +::method cancel +/* ------------------------------------------------------------------------- */ +/* The cancel() method is invoked automatically by the ooDialog framework */ +/* when the user pushes or clicks a button, or a menu item, with the */ +/* resource ID of IDCANCEL (2), or the user hits the escape key. If you do */ +/* not need to do, or do not want to do, any processing here, you can delete */ +/* this method. The ooDialog framework provides the correct implementation */ +/* of the cancel method for you. */ + + /* ------------------------------------------------- */ + /* You can add code for closing with cancel here, if */ + /* you want to. Then, to prevent the dialog from */ + /* closing at this point, simply return 0. To */ + /* continue with the normal closing of the dialog, */ + /* invoke the super class's cancel method. */ + /* */ + /* By invoking the super class cancel() method you */ + /* ensure the dialog is closed properly. That is */ + /* really the best way to end the dialog. The best */ + /* to not end the dialog at this point is to simply */ + /* return 0. */ + /* ------------------------------------------------- */ +return self~cancel:super + +/* ------------------------------------------------------------------------- */ +::method validate +/* ------------------------------------------------------------------------- */ +/* This is called by the ok:super method. Returning .false stops the dialog */ +/* from closing. Returning .true allows the dialog to close. If you do not */ +/* need this method - delete it */ +valid=.true + +/* + valid=.false + select + when [error_condition] then call errorDialog [error_condition_message] + when [error_condition] then call errorDialog [error_condition_message] + otherwise + valid=.true + end /* select */ +*/ + +return valid +/* ------------------------------------------------------------------------- */ + + /* ------------------------------------------------- */ + /* here we can define other attributes and methods */ + /* ------------------------------------------------- */ + diff --git a/modules/windows/oodialog/bmp/bigpiece.bmp b/modules/windows/oodialog/bmp/bigpiece.bmp new file mode 100644 index 0000000000000000000000000000000000000000..805d5dcfa2593f60bd12d62b963797d11609c94b GIT binary patch literal 8118 zcmeI0zfUAL7>2({kwO*Gq7)GlMUX3+6qM;eiWDKap`}Drlr&RNQXxuKTydnZL`zMP zDg~XZ%O7$57S8i|JhPr(%doSnyOYi^j6Zw)KJR?CXW0GY&*xtymfwFA`Hh<8_>1EQ z*^2GOFCwo$i~PgUEQJWaQWWKhzf|Sr3^pGnfRF) zegVILU%)Tm7w`-C1^fcO;}&qjp+Cg%9efAh!FTW-dy-@$kA9efAh!}st#bPwOd_j|gq}k4-e($=0@)B?&SXdULGGG z<>~231l@vzY)Qc(@UE|~<@NQIHY>ZkyK;7RCW2qVui#hkEBF=s3VsE@f?vV!!NCFN zAluv9Xw#2h!LQ&~@GJNg{0e>rzk*-E@5#vtH$aTv%gakKbQ|~vPll`+_y)d#Z{QpF z2EKuB;2Zb`zQMnNZ@4D|-@rHU4SWONz&G#>d;{OWH}DOX415FMFkd*~&>vm3#PBVA z3*W-G@GX1`-@>=>Eqn{#!ng1(d<);gx9}}|3;**x$j1*K*vADF!2B{%<%z#kIfDGO zi2|xCOJi?)_sYSR?s!_#jZG16=|)jaQB2otHd|FY*Huv!EOk|}RR-_6+rh}HF;3-D z-5OI389py`lh3$FqHnrLL{@59t;}Y_qV#Y@?5|Q#CPF8Ul4&-oi{3$PF44X+2Wm43 zlaFCtAfKp`54{)nY~>2O*0mxQk{>|9k5;NmRn4dyjERZW@TB(uEQ_7F}IoOlswey zL3dp<2@uB2TYr8Rx@967cGsh;naJi$32X5iH^?UZ>a(Y%+n>Ad@wij z%aR_E%HB(s=J)H@Z7#Ic)4+p0y)V*xuaV#l=}t)RQoozi?Oj5n8kgmFLVDlG!zgRL z7kwGOD{tdB^02ZlOKEstOju_k4-MVccAMb$o6~)$KL@m5aMSWTtUKx7hlekqJ73#+ zXudDLMqL&`+;r=G59u~;=r$6u`U7~W?&|Be%s`%p-0!!i+xvFTG8RrebM2iF;@D+>?mmZBTbEx(FbRd~R!e)3EoYx`#9?Y3TBRBPR^+RXLos!`QV zhBeb~8*E*{nAUozzL=}NHBf*qxL8`FheNLJ*RAu5>Y^n1w{M`6hm?f)O@yi}G#j-F zFyNT(*1m|kWoA2HMl_Vmpwh2qppG>S`Exy+EUxKM>Tg=;QB%oSvU*wtW4tCplAKp! z*||@5sn?{nM6%)Ndq6;lrFyZ2g@O0JtGF83H8#8EaM zG@_pADkGL!xC}?AbT46O-Ix-gYWR#hxbAyzCD+BUZZ>`FsCGttuWBQ|Iyfq;B=YYU b%SLousVHTdYR7LzoL0r!G=YK98`S+Dm_jU_ literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/blank.bmp b/modules/windows/oodialog/bmp/blank.bmp new file mode 100644 index 0000000000000000000000000000000000000000..da66d9b3a9e5a3fc541c72ebb1609e1deffd54bf GIT binary patch literal 18238 zcmeI&u}fS*5XbRfAS74XS_&4CscbAPQrH9qAqd;p1xvXmmNrYUv=U1}i(v$MbVP;hJa<0m~mHr`4fIQsTH-e|Ho@z3Wf z@vT}HFFbRo*=(lS@0lKc{ZP3Lm3uJ?qbY91D2(}WC^#3Ki}|_x(Ek3uBA7?h@$s=X zH#c>9daCpDb6s3q==%CvH#awY7M~k@F7GY8w?t?%nNUH|+S(egp}I%6@A!`I_>S-Rj_>%6@A!`I_>S-Rj_>%6@A!`I_>S-RJ3Bk5>>d8$ z;h_RQ@B=^a13&NsKkx%T@B=^a13&NsKk&u8GFYW5L%i?g@C$yyFZcz&;1~RYU+@cl!7um)zu-Uo34Oo1;ySJ_hh9<+_}|W*)|qhlqY>hB?kWj3*Dd7r7VxT_E$2dB{BU9mqWN-N^ex z<{|UYcOdi7cVi6qhoAX3&eN8RVK1_Vyg!WX{*al>OlBtg4rCtsZsh$T^N@MyJCJ$k zyD^IU!$x1xFvp|l!wCKtCHs)~hyDu8JY*g+4}AwR4}CZC{xF_AD1U!=+KizxdD&eU zuepY<4f+3a&&?Pr54jh82NuV<7uknC6`6<3L*}9HK<1(EM&2JX4`a)N-t`p?bDY;j VUKf4xG7qmI510RY^l{*C|G!^pIza#c literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/blanks.bmp b/modules/windows/oodialog/bmp/blanks.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f669ba55e54380dd2077fb73e9c1421b6d0c62b8 GIT binary patch literal 2002 zcmeIyuWK7|7{~F?V9?0g&IKY?9vIYARCX{(Mor)`wVex5ku_gYSrsZHDwc@{VymMk zA_kA@{)o!K#IyG`wr2`6W4U|o?z!i3ujje^IKTLDpy$`=Tj@PV?}#DsMuX?`{hKDS zsgoG8`9sMcMK}?v2N6zm$EBiH)T*mJmM$+ZRYhK*>+5Tsot^3S z_EvXycUrAhTCdmIY&P7B`xf`*TIX7?(qJ&41K08KG5b;*(b~v~Ajrq$WAZWin0!t? zC!dqgOGigXYD@AZ`I0)lHhOLJ+UT{>YopgjuMNN9H~fa*@PkJ|Cq%c9;|G4=2Y%oO ze&7dw;0J!-2YxKc@dH2b13&NsKkx%T@B=^a13&NsKkySj@e@7q6F*1f_=%tRiJ$n1 zpZJNN_=%tRiJ$n1pZJNN_=%tRiJ$n1pZJNN_=!K6Oi=mk@Mp7`3cv6Rzwisc@C(22 z3%~FSzwisc@C(22McxReR3pT7H#axh?RK1V4TnQrU0q2y!V!*egd-f`2uC==IXO9D zUphQI^ImMh}PBEvLb2^>U7&&t;77H0=!#8>|rZs%SH+;i4e8V?< z!#8}xH~KexV^g-O_#A$nhQD@g3js9pCXC z-|-#a@g3js9pCXC-|-#a@t=N|zTV&SJ8mezto#`FJGLAWrGwsARd0#^ng6wyo`Al* nbasDEzxr!`qw?C%=(WAP*83OU_vv&0Q`5)(+WAF)?exPReQ1{r literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/cake.bmp b/modules/windows/oodialog/bmp/cake.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1fbd725136adb2406ee2cbcd6bb3c48ba9a43ab7 GIT binary patch literal 30970 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 DMT%cA literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/cake1.bmp b/modules/windows/oodialog/bmp/cake1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d63cfb27886c0b96861808d90a2df966101b4ced GIT binary patch literal 30970 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/cake10.bmp b/modules/windows/oodialog/bmp/cake10.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7c9fda149059a25293b78e6f4f7c6295abe87bdc GIT binary patch literal 30970 zcmeI3yN?ye62{w-B@CH#Nzry|s`|HFw<~Zg!<~Zg! z<~Zg!&3)zU>C>l-bJ%=huU@@k4<9~cZ{ECN@7}#*A3l6wA3uI%pFVv;F68CNi`X;7 zo^j4@-MR&mGj{*}eVjQP?*S1UBREEIjNll-F@j?R#|VxQ93wbJaNN0bhmGJE!7+kk zM6Dxg9Z~CuT1V76qSg_$j?f>WKSFqKS6(j{sjFA`V;gg=ugm} zpg%!>g8l^k3F|mPe}eu5{R#RL^e5;~(4U|`L4Sh&1pNv66Z9wOPtc#CKSO_p`V9RU z`tv>5(4V0{Lw|<;4E-7UGxTTZ&(NQtKSO_p{tW#Y`ZM%r=+Drfp+7@^hW-rw8TvEy zXXww+pP~Qw@nfi>chG=|RwVbEdFVbEdFVbEdFVbEdFVbFQ--~rB@ z-M)PrxiJqNMmpeR;AG%r;AG%r;AG%r;C%Ar2?~P^&X+G=vH{Zr^as>5fOdfX0Q~{_ z1M~;z56~Z=KR|zg{s8>}^$*Y=z%)RAfc^me0r~^<2j~ybAD}-#e}Mh~{Q)Hn&>x^b zV4YD3Ui61{8*J$RbIIASzx;yxc*HC&z+c=%@`SG#;>Fo_r*|Ba35%FJj<%Q`nS%NY zMLY3@*rw_AOjc=4%5JdE;(8CW)-h2f{4n9fRf;V!TjxHENv|p%GWw8mdZOhVD|8iF zI}^!i5IQ^M$LcHjmIOg0O$E-Pqwx}GEIhK9qC|awOz3ftvpxkyHiT1h1Jth6QWs^n zNnERxsg?;@H{w|;CX%H-d%VQNM$0v^S?ybZ92q@*%(E?M5#}Uom^6`{K9{rm+#+04 zZpHm1iI%ig73+Ok6gM*c7F3o#H2_E4N z$|Y~$?BMWf3N!j$@FMK#98iqvSWKlpl;#(vB2j=4IK1^b*eo?_DLN`)rmK*=y@qR| zN!L0%F;ybD5XWMw-(1nv(|uA*^lqYnXQk=DM1nzEbWxU+GpwAKAmU1)k^!^QuY?jx z0a2+-eToC^;|?i@|I zo`h8wB|4JG0ASHS`-=)~XL68igjya_u4SUoWZsa^<{CXYg!fl!4btghlB)i2UrqTN!l*zsv!bZ&9tNuqk~E@7p-M7iNvi227QPL7)wBAB#|-!O;i1tNY-kVsG^do zZxJoe@|v|;pz4|Io3ciu7}I%)mQGbO^{xQBrAXZvpgVO^OcF}2M8*BoeNm6lC+xnK z&K?1&|K7th{q&gHmZ@n0Di^C~PVdb?qgh#SMc67PuWJ1kqI8azCFDWlJXGCRpCfp8I+TBhz!YDccR23 ztI5|+vtiZwXL>BY_$FRnT}CPY#V|M6ci4DS$+uQca>3QWw$21qz$bIvlX`^Q{?tJ!+Nslj@SV(FBv# zC5y)yN;q=)I@{WcDIqHNon(^jqT9{^aSf+uiKIt&mzZ>W^!6(-$tR*FbFI`~=+CHj zUo{KkXi*qTD?ACLbJY!3!B9q*93hAM8lJbVSPE3ZuET8dce6jhgjfY{)b5B1M z-1G7KWYuq&aBEp(0;9*obzyR9cQ~+`whilAFu7IB=bqke;_Om+OzwtiuzXoZa+MLu zZ1+XwMwIsYeQKa^Lrun2_4^lFmD*FfdfSJw!s^JB5b|{EOso*$q*A8*0xP(m+{JIO z(goB}m?*)Lq>*81CYpEqgnSJcPH3SDQ*w5oc=9Dv)%h&WGh!7}UMO3IoFt-(Fofj8 zcG4%&pgJCk$}_o}@9?dMfAiLt1hDm&W$X@)0 z@oC;qn|`XVx=&bZ91YE}LUCQ!%~eQN$0UJHj7ff!?@*{6_K7|srar1;ZK#H!*t3NV z({Z}I_dsNr_+d8`F_nb2WTFNUlWG**Sq&YMp}3}F$;DI!G5O(TA|e>E2^sxROdQp0 zh%Oe=F`yu(n9Tj;e7ZoPl^chMjwKgU<(bsR6CWWZ0_VTs7em7(8i(n%`Vw1ZPrGG%+@ zw1r(Mj#!5RlX`@wkX)K8*=Uh&mYC>~hbMV(`xqLUk$JDaL5i=yq#hD3lIDpl(Jowh zCi&4nFc>Jwvy0M`MUgD2{`vC{adGE@qvlZJ;(_2` z{eblY*3Vc!WBrWvGuE$Jzh?cK^=sCjSbt*uiS;MeUs-=;{k0Z~oFb>lDRPROBBylj zs}heNKNd={R<(HX;)S?>|Gs$j>Xmr&=8bs!_N{pT{=N9{;RC(stLRJZ1+^DSi5oX= zKyo4O-o49N33&%ZI3yer4he^ZL&729kZ?#iBpecsTeofr35SG3!Xfc0@hb5u@hb5u z@hb5u(U<5;^dfx0H|RHaSfk&d-=N>1-=N>1-=N>1 z-=N>1-=N>1-=N>1-=N>1-=N>1-=N>1-=N>1-=N>1-=N>1|M1~MRGA(6PoF*&3VnsX zLSLb;&{yay^cDIFeTBY4U!kwiSLiGB75aj; z2!W13N1!9n5$FhX1Udp8fsR1u-o1OAmAHBHCcVj{BeV{j0!{&^fK$LJ;1qBQI3GQF zgfZ4|K7amPRHQ5PD?C-uR_IsgSLj#hSLj#hSLj#hSLj#hSNN~cuVAXsuh6g1uh6g1 zuh6g1uh6g1uh6g1udr01U!h;I&p6@GKl*87js8FXDe?Qecf5}!S#IDT-bD7qZ!S5M z`0o5($7Es?r(Q?f%oUj;{~6OkeWrF+`fw)C+AQU;*mVh`%T|XmX(wu#@W@>)+eo%7 zyo|~1DjzcLW#wFA&N*fDAhh{RTF!y!b6`K^FBj_@M3p)f1+#&fx1iDUSTk9P@&em% zz@dZXEp+9Ka^1WGny)m+m+tP9gsWVqQYN}y5l`<}ll1=l>%Jy+)!&oKx>yes$hh<| z&%U5XI3-!aQIuUi8f z5snQEsw{RCTp=KGo^$yD(Fl(TM|O2I3a$_sc#1m?r!c7S(^Ehxs$((b=8((xOj)7` zAqoukYwk-_uYtiYrN zqp>(so>XvIn71J2PNOmb=CwZ%$|yxdxhduU{IY*^<5N@gcD39XS6>y}(ua$#TA*mp zW5%dmbWc<Y&<-veSUbUzRnnRWq3M4Mrx>e>kePWY(a3gu!(}aUwL6$#g<6>Np&gEttVH zpm57bs2~u#E4Znhm)7m8!%^9IIg?}P&wb~)SDvZ4x0-s-LjtOpsc&Ph7Fp?TI+Uqv zWZr5pxR*(==nE#UEYd{5tkil;TGkttaZ$*$u8BFHA8QEm`WB1#VJj#blxEP87VKR^QYk%!#LO&SZ~(wEnZlXZrau&D*9~8&J4eYxW#` z8JM{&G+a=25Yxc5`wEder)>qz(j|q_WlXJp&iqKez*+}bP#cxZWwK%;W(&iSiHU%N zn<$A=WlXN~@NY@e5dB^8mAx~vGa4`*Mzdie$7J11d)L|6_4H?Ysy_QA-rf`fBvunl zro$wSXDrcrcF1ctVQci?A9Q*nH|zGJIGuLaW&I1MG1ghfn$Q zO*PWFWIPI{fK2D8@+t$CEmlln4L~UgM>N(e?tT@Kq#GR!#Qhby2q-At$YRKVt$?ay z3V>MX*G3o;HmpD2py##?2NUwriFR8G1^eFFwoKkL7nE(u|A?24gnWB#m>iOx=*X=b z4*RYxj;6Dp4A+szZFT2eL-AklSfnoM%C6bD^{@X26quOOwS4A=n{FW-lX(hYwv^?M&BVp628H%$_~NbY5>LJt1?P z&8Y0R2ZM7iUnE+Nc0}hu)iHFBT^G3)pKh^9&wt0nTg$tS@7Z=F@E&mJzXb=`ZG$*> zL(c(|F5;`ju*TiH$#cSN#H61=^V%dqXiEDGBW9I~k)SqRpJ;LQA?q&5qs@#k8J~I^ zK3=`!Nk#36*L2Nf);@?^;j%axAb6&U4KS@f^2)#;J)Ip-=b(UzTHQ}`od`_Jml-u& z#ige2)lbaIb|WadC}y(Vti%;f%!n0Hghex%%*{R6>JOuB?S6+=i&smSJTUt%GjFxS z-fJyJvG1wE#Y}Bex1|=#{hm^cbEZceUK}};$qA>~CT8bu;Ou&=bzZrl=hS~J+xhv~ zwEz-*R%Y@Qe1i7cPap64h)l;bo$0(YWj1Id>3vQc8AQg$KBvqEZ6v+VX(NNk*x2Wk z*`ST2_c?835E&c$oH84BFA2E6nz29?Ao%&r})qVTI4f8JC*Y)Gn`F=ljs{7r?y!q?T|NFb)*I)i<%%9Qv z58nU4`w!*@kN^5NV?O`Mm|yXZU!yVjYsOJ7_==|a^y!oN^xseBw}1c3T-~|Cd%}A$ zR}T!{=s!UJ0s7C-e}?`u^q-;s8vWPkzefKx`XAB%i2g_PKcfEy{V(W$naqN@1#=7L z7R)V}TQIlK+?T~Xe*D-h3;N4sUc7i=?%%&}UcGu{-n@BZ-oAZn-o1Ng-oJm3T*$j1 zFJi9{d$la)#*G^wxiWX}-o;~gM^V+6+tju9LqI7V=c;26O%f@1{72##B~ZkZ7r zBREEIjPN?b>j!ah#WpP)ZMe}eu5{R#RL^e5;~(4U|`L4Sh&1pNv66ZB{3&(NQt zK0|+o{(J|0=+Drfp+7@^hW-rw8TvEyXXww+pP@fPe}?`H{Tcc*^k?YL(4V0{Lw|<; z4E-7UGxTTZ&(MGP@F7%DJLo@s`qV7YU!cE0e}Vo2{RR39^cUza&|jdxK!1V$0{sR0 z3-lN08}vuKL1{+34dPzDd}%&^{*19JbNlvf^W@1BW1wT8W1wT8W1wT8W1wT8W1wT8 zbMM|gTo-fm=1t_rJai1{fYX4}fYX4}fYX4}fYX5U(W6H&hCVo-KYwlpOb^f>;AsHu z0Q~{_1M~;z56~Z=KR|zg{s8>}`UCtA&>z4wK!1S#0Q~{_1M~;z56~Z=KR|zg{s8>} zmImk#&>yhRaDq4eq0@#w^nd%hn1BBA3-03)vsi$?xQXO~uV~`En4f;U*EyN6iEFR3 zZRUYYng53AD83Q9Y5H`gz}hC|I9Rj9qx*WNF_DvHpKxWBWvk5g4ew*pUByF2Um~Xy zTdpOeC!uX;A~^-2Yh=IVuQlcqWRWzL4K@chE`f&U5i?DR{s2jsaL{0X3X0qiPRSk6 zcBL)8D0@f}_ga~HnUM7x@p#8X;{AnfA5&`iHKkb{^FWb|PM`A{3I>F0l08gH6sBLx zdH9?c?y=i(KM9df+vQl#X;*MpkgZWqshZ$?8#OcK3_Q~1wl@gdN})~1%?LuO5h;jV z6Klsa5f1@1p&9{iXqO$)PJ~&yQg)sO!R4@ffuAXfQbaNvZ$#*Dr$Dl3ka`dl@+ic z{fSVllo7S6)c*b@-@4(GD7;;gt8w|LXo(;0YFVIc&vV8sUA88Rs8G=dl?s+iv7gBj zxlFFn;kR8#%BG39GA=z$l(95qCzF<_P!e^b3dL(zkSi6XNQ@S#tW*+OG>{B>9<<^) znuP| zKJ(UAU~219jt@K(pt_lS8gA{f;uf9C}~F+eNzLoo@I>_o@?boi#8p-wn` zTPk}7q~p&Xp6Ndx)3$Bev;m!)b!5)u!@$OFr{RvUlb90M`VpdaE!&Ecl|wp5_c2-h zmifwjhcyS-5u1fSOVhAS>&#PvW;dcVavlxSP3XX;u6(z z<=J(_tH@gYD)#}>y8%0rSkOGBt1L}sXfPTIdzj0BqTr4Wrx58lS(=;BtQv)DYTwe4 z{2GMoWV9?urV>yh6})ss?-fh@rUXsO=qIQZMcM&UL>OOM+Idj0!uk%)AZsr~5*Hc| z+c{E9SYTANbuU2k7F=7#0s~Q)U(nSG(?qVLErZ=?l8BN4BGRFTAx8p-w#`hs9?Jvn z2!p1olNzaclDc4_8l-E~DGwwe>&l@q!67bxIsA-=hQM~W8#E#<rkfP=@OT$`v0P}nB-w68^mAhOrGmtCM_8@%~PRSt&}}|t~6mo zj++#Ts=zOI-f9g*sf)v}j!O17G#j?1QsIcUZ34?;{jJwYIM2uA4x-&?wVGU;Otjo@ z{r6@fDh7h7+8u?b2T_$?D3Gr9hv@q=eRZx@naWUDYnKOy=>nMaW7Y~10~Mbk^sSg* zzD!>)fk`V>JYGV=Qza;=QcxtYT@cd>k{-OAN^Yo2WTM-mgyaU@q#MyE1|PoQ;9W|c z=#DDfO@V*MHF4JY4J-VR+*J3vy;*aJIf_?%CqtUz2I(f^~id`p65)dr7 zOs2qK4n&Mm0C$3FT{u(VG{h({(X=h+B{QWb&Qn#G1nWZYC%*6N#!F|<1E)Wb?W*4bba==6v)PYhdQO7r*^n*ENMbD z0^*zFBF^5|hUM1hh~#_jHB;jV?VoNHYJEOFdR_k>arWolsb}w+Nxt_9r)mE+_ zEqrKb1jGg};u+C!e9hGN@8xHIMqJk^`AkmT>-&ixeDOBa9$x#$ug_lL?8S%gBA(@^ zevU|PsB5PEx6Jy=<_*;fi0=5`d!6XNqwtG1UE6LT7+Eh$VYXF<*5|#=&j{z<{>BLX z_hk3$BQnMzZd!k3!7YqVMgi%YKO^`z5Hbc2fL4mAzgyyhl&-`>W5?Brm7;&hD|8qs zF)3r-v1>^q*#IdUPqAVF>>wuHx&lTtBxMR+XO_dscF|NgJdj5*Vf)BT^TCIxs4h{5 z5F(_co6QHg0;ofnNLtLanPQu32q-}Wm=gs^G^xk%047K~rj9~6r|#IehCI_51Y^_- zpjwEM<(Ov#=@OIZbLQw4$~&S?CG~r&dyFej+rABzp$HLzA+eT>x1#j9G#qObl5507 zBF|?)o#Z&#NRcW4jGLO6ujLxjROr9dZUk5+E)^9l^2pNkB|`}Yq7^a1dQY;mW`IW) zN*v+XdVoE6l#?YYE=0b@wwsF7XmN4~*DV8XJ%E{9O84Zcp!pARL7k|15*35FO0lD` zD1~;L$(9JUsG;QJS~zzqw=B-nxksctH`YBj>(pPPk`w!o1K|<1LK-et^M+bycF)rd zH7de!;fgcegSx$?U$Tr3V1r2>4X2)*Zr`hcyunngbpiZcb#f zC%9Mkta0w}oyH`;DTnPjtJ%Kfwn!*eeD~zNMu6QLT$&<5E1(tc~8&FVWV2ShQBKBj~%DM_*0s*_Op04Hi`Og0US#noU`>kE?UsZfuIR5~8SZw1si)B&-W5FilOn zO^PIG+Ym{_7A9Tlj5uw_XKi7^1+6w*2CX{}_$4a2>AHu>33%;*#o2VA0Ca<4GaC0D z&gwLFG)`g)^+G<2;7L5P6wo3@Yg{MHx~qK{Q>bq3xlbVwagJF~1Hwhewa>zIoV{I{ G%>Mxo%5l^H literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/cake3.bmp b/modules/windows/oodialog/bmp/cake3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..522b9c916cde99b3eaa034940724bf6f2b253b04 GIT binary patch literal 30970 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/cake5.bmp b/modules/windows/oodialog/bmp/cake5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cdebd2ecead37d8352d09bde26cb93b623ae39a1 GIT binary patch literal 30970 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 PX9IN+t~q9by?81jGR?S;LG6 z1T8RGHFExl;0&n!PQAL`kG|FA$xYh1(^aQVo$vhWRQK(fxs&gI_~SoJ9N&Gz*uT*F zA6`G=^$&JS*nj;uW1s)Y*splG$IKZ1WAiLe_=+aGy1HUlzg@B4|N9HOxOaiqf){5O zj~HI)KSKWz`Y+Ibf&L5hU!eaM{kQ19MgJ}OpV0q={wMT5q5lQ_FX(?+7{?gL7{?gL z7{?gL7^kr>oIQQ|lyQzeU)ZZxuh_$f580bHZ`iwc@7VkI@7aeBAK1r_9}x?2IpV_i z0=^fVvs<@rf#ibSzkeTR&gOeS1jh`H85}b>W^l~ln87iFV+O|zju{+x?%ZKBIA(Cn z;Fyu?j9h2rIwRK^xz5OSMy@mTXXww+pP@fPf5DO>6TIjj`p{pXzd(P1{sR34`U~_I z=r7P;pua$Wf&PMZT%f-|e}Vo2{RR39^cUza&|jdxK!1V$0{sR03-lN0uh3tize0V5 z{tEr|9{SKA^sG@ezfByVAF*`B^ z`4^IQ{0qKK!>2P@sWmCP&N_-~-Pb#fi8A5)gcGwATVk}%ypKt*DsD3RkaBvUh2WQWhi>^`;$ z*Q8rw^Kzza=Bkzg3f4Si48jF-0*?e0J*XtGOo;tVipWGV zjf#BBg`{XYkf@9aPXlo*?Xr_emnc#aorzY6o~xWpsVIb(Xp~Axd9Kj}JmbcLmODm6 zt|if{^AZ(FL;$d;pZ!I-wlg_MHbN~ADc3TQYcg&~WuR1}?&J~K-MRqMtAU9o2$@KH zzf{VlsZch8*N!M=OpQz;5(I;YeyOBG1CvLgyMa)JAKA za%;;YGH%y}V|vHmG_g`=YGTDEf3>qODTZOuaL}ZYfeXI_OHB6_bRLD^YPhbzjs2>V)0b zQrQEL`tLp5)6b8oZJC-DpmMQ##`GQr8oQMVSGb+TY*T1}?2kQY?{dr8!61 zv&rX9qhZ$hdwR^j_z*8Axd4$~hDk)o(pZT_LN}YNaGA7{KR+;fiOCc`iDR@)l>QB^ zk%~;?$+5@)++#diCK)Rd>SU7^jRm5ys68;ofJEfLbEHACg^DpO4-_tLiBhq`=p!uA zY{=+{+dYg0K#ubb>G%vt%b_w%4iGwY+z^IH8ZtjSK`UEjb}D2IN5b7Cle6w7ZOLTq zImhiL<)6sKkYHT31(QaiiYBLK1`~4zneD_R4$;XwLz0Kyx#{6YJpm0$wMoY0PEh#t zjzlt6Kb8QZzwZ!#>v4H`X|Id#{Pp@OfBFLyFj2NCB2gXj2P@Kxc%0+wK?KUk3pUL} z?dT!?{)P%9>*UaQo#_10Mgb)1lqwRHkgA9>Zcx~K*5QC%UXEt)^{7x}Iyri7^6calk#i!M6{#O*jWO9VaKTw>DY(c7=UB=3lt%-X#9eUR`M@+7xt;i&|okF^< zVak+}9$D1Uk--ZkZs+l>4sGJW!8Flz6_Zz?u&c3f_R{In6-@Nb8y+Cix4h0wL}_tF z)x&&hEfh|?VsXV&D`{^?ed?quXYIsp6_bGkPAsOZl1D`KQ&*K zD2#>*xfc`aRdbJUQ?BZD+KGn2Y&&Do3nMn4wegN)0=UG&Nvk)Xt*KTJ%PJz$ZDJIY ztS88tS>yy~q7#Hx%L^4Ra>C+8%V=tSn&by2h6rLBIQ z_NQAn(+DR3JhPRlJ)*O>ZD=d3@l1()-1LA>I4R$hU0?;*Q{8Is_hOgnd?c1&Nzy1E zcLltjTPMWZpKjI6Jd@%nVaFf#4B2R=+#3`TnZ&YhnZyl(^w;nxD zIN7PI+BbSWez)NMRhb&gW6&CyAW?OppWQ+PeK z6E)W9lwDOhx3I=lh=mxV>r{M>sDb*+GaY~58(*itnJVuJu3O<+sJWa9?@#tE0zWl6 zi#q+yc_B7K?m3AESav);=bqZy#Y)oeUG8vybAl*xtX6M z(}4Hf!V>FB*gP1?XT;QcB8GfSOw>3qYOM%*Lp8{dFB;Rk%BB2^%8!%sf)Aq-RMN{W+&R;+*3#nz)tg=NvV z@Kcdg#mZPinCO;=J9)VB?H2q}y;!XLwyE5e`5B3|_{oP)b)C?3W zQ>_7ePya8?D3Mf>?RJWm;2Ob%La8fCJ@EBnOJEIQqEDNNyM#cab}y>v&o>4!5tTS3 z6~3yzIJNIQdj>*WJ2&`YOzL){9+U(cfvL(#LOau@wpt)XHkwJ-OTy?sj}morYu7-j zhzuC(@u#qR-VjV8s$?M2EqzOgL7Hh+L(da+N3FgZlX>g2lG~_En#N=?JIzR^%bzUo zsgq%{8#Z5bcWPF0RBdOD>ew-Nw!1Oe`Z_(6v$=P|LXO(Op46{>2vfiGc12?U2bERY AMgRZ+ literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/cake8.bmp b/modules/windows/oodialog/bmp/cake8.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1db7d3394419b0744a3a58d9925935890eb4a6d4 GIT binary patch literal 30970 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/chihuahu.bmp b/modules/windows/oodialog/bmp/chihuahu.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bb01ed5f1b5986d1449e6e1188a1dc2f6bc26467 GIT binary patch literal 28134 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 J`2VQ-{{a2#&fEY1 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/fork.bmp b/modules/windows/oodialog/bmp/fork.bmp new file mode 100644 index 0000000000000000000000000000000000000000..20d1f1e25067fb6f8c235dda1e904c6e3f411fa6 GIT binary patch literal 1350 zcmeH{F%H5o3`IW@D493{Gv{Dn>s>O@)uWHqff;e5^5V2ofQgBvZoZvw*H!Ddz6{rc zLT>0YIDrA|v`0%%%;PBC!Mm8ml36oowwk61TLW_}&2!xWuIfUKO_UZJrYJ9th?nf{ z7I!obb&qYR9NcQ^#wo&9kJ=Fb>W89eN4MIGV4*lG8B2?X7Cd*{M)hI$^ug_m_vw7I je&_s<xDV{?bC#9*L_oNQ-uLIKl~ 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/handfkle.bmp b/modules/windows/oodialog/bmp/handfkle.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1e80f861c071e64424bfbf9140368e6f9c988c95 GIT binary patch literal 918 zcmZ`&J8r`;3}w**agjmS=sCLgE}H69qsL5LJn#xx4G+qZv=SWHM}5-PK^04spC3i? zQF;IPdZs!)vA+G9PxR70{JSP1Jd{#1Sh1zs?FQ=~tUhGsJ52l>!ZKq-IuT*<{Tu^V zvz(?Bmxht;4_GigV)XieMKV2}7j@5e@FmSz4p@*aA7Vtde8kAI==#SOiLgnJK~ti| ztIoEKxQh=0N6d1mzLP^KC=f6&j?Ls4DnP!HOT*&iG(_A?t!w7Qlq=6JRZ=*ENXBeP zq;zR1PARY&f|O390`1R;x!R!30lf*T?#rVqXD+13U$YL^NQyF%tjZ5o&a1J?juV?J zDp&Lm%)IW>`W=Kq2@FpQJ(K7g1{ou4Jw!l-2!J5UqgE0r!9~KnXM&RmzzTaA^~3Yp z&ZBd~B6(wkjiFuFg!Wv#eAig7RdrlJfdb;iA#B5D5+u_{lhZFQqXdXF`cSzbZHV0c Vh5@>y@p8Ag8Tb9zjDJFX{|0OOsY?I= literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/handfkri.bmp b/modules/windows/oodialog/bmp/handfkri.bmp new file mode 100644 index 0000000000000000000000000000000000000000..afd90c29dd8c4cce220e191bcd195f10b818f737 GIT binary patch literal 918 zcmZ`%J8r`;3}w**ao|DM=sCLgE}rVuW5!HfH1G;u0}afPv=SWHN6B%W0;R2wpB{ft z{`mZUrDk84-w)%3-ul76^FoA|mZdM4v8DU{jx`Rvz2qJ{3_Jm~@6#MM(TNCC>~p19 z=IL@87EH1C+Ru(y(M~*KH!Ih0IAW&a;r)cUC?U-gmTzuE&BFv}WX*Jz$b_ktQT zu#Gl@D5}n0hX)NE5K@>p4?7LSkpX3|z^Esgr)0v2$f*3hVJHXA84*cj%M6T-MK~ky zj)_YtE>><8vNc10qY69jA=N2VM>QkFO2%yUOr)Jk_(oEgA>W3Hi9sDylr(N9oRvaD zjEd1qoP13;R1LjN)<#1oND`LZ%H9d9h+4SgWFwANxF~d_vs^niM-FtRb#&VTLPSb6 sBC@yNtWncSl#9CW%0SqV076_Js)7j}C}(8d610Wl-#CyOIPF*Y10K?)hX4Qo literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/handleft.bmp b/modules/windows/oodialog/bmp/handleft.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cef6d4eae705c8565d4920a7fba8260404c08d4a GIT binary patch literal 918 zcmZ`%J8pzP40V)9D>Q|#k#nTaU0j7CMfM0=rJ2H4phXnkBTYMU;XHl|J5mN1;9Nn0b&)loOZ*7yIl{;Avat!mg|i~g z%Em?$^@0w3GT+&f7J^Ag&PS?6=RR7_81SkfWkel_bD#E9QK|vSic(f={x1sGP?Q!M z9eZITR=jt0Sn1#yM@2Msu~$MCG(p3mvGFk5!>FyXG}{Q>#m~)7aYb)nz(^b literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/handrite.bmp b/modules/windows/oodialog/bmp/handrite.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ff473f0f95ea80aca13a4fb57b119d53fe4ce79a GIT binary patch literal 918 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%0A}-pa zq?#jT=1VUBTZ#?n5@X2L_(ElwxrQxfES%0g+}3;vm~Dtl`s(>Ie3fQut1p|OHY2y; z%P5P`;&IN5_*#0n?fEK7u+^tO_Kqj% z%Ww&hzFS6M$$xE*YY9xAUn*laTwYljY!4$Sz{_r??Z&0x*FEc(J-L@fzi z{xFmLmleO^p$w;aufkVMuH4<0E-y0#24Bf<6c! zDz2ih0xNs{n~$P8Q-KlFGj>iW>beW88L|p1e;?ocVf)NTXNq*6tnvI!vj1;Y&NO$m zEQiJ8ioXcB*D$Jg4p|C%Xf0q`x=6m?AR6ofY#!PAmE4P@86bSvY`f=ljF@MD z^65=hs%Kflt!6Myc(&3lGC}jyAhLwJE9?Qj=D7Gn%IzN=U*a6P9%p>+FkIJiy8{hl?2v{CNP&$^KKUdh5e6A zcSU)$r@Ql|`y=luJT4J-cU=5eQDpC6*+AZVKI-vf!Htsc?7!@>$g5t&b)b4aZxnZ~ wD_@bMW@K~vO~W3BcK}N()&&pm0T*&w;##EKA)$lo4k(tFe6P5cNY|$P598MUA^-pY literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/install.bmp b/modules/windows/oodialog/bmp/install.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f8dd7b0ff0f9bdcef5eeb548fc247b877a358b75 GIT binary patch literal 56278 zcmeI5ziuVVwcfW41LH(5pa(Dnr33i^tmGsn6&!`i3?>RE872codI3cY8n`+fI3Ndl z0VOAuK@1s@fgS1ru3`uD@B7wT^{035O$v98$qTUe6uY~+{;pc})mN*kd;Z&hzyIGm zAOH0~?RLN5>c9NQ-R^&I{tvtV91jlu{ljj@zuh1H5GVd}x%=_QA9p|gpC5Ps`oI3? z?&ke&_lVn_?RM{RXSfU84ek-QyTBiJhP%Ms;2v?i8~kx+xC`73?h&_p#2d?a2L26+#^ncd5=58UEpqTk2neI zJ?;#5fxE#y;v~TLxHH@Z?gsaWlThE|&TtpF8{8v~geZ?na^c?%e;;uY{(IaR?gDp% zd&H?h-s8@27q}bTBTkL<9(RVjz}?^;aca2txHH@Z?gsaWQ)9lzo#8HUH@HU}5h#zO zqLSSB_sCy0`g`0N?gDp%d&Ef*-s8@27q}bTBTmZk9(RVjz}?^;aZ;G~xHH@Z?gsaW z;}7M*A9sPf!9C)5KzYesV@W)-?Zg7t{9Y6co&vrlm`OkO1_{A@Fzxvg$cEA4huXn%s z&2M(U``zz$zyJO3cOO4~-2L&7f871)Pk-9|`Okme{pBxz+5Ppef8G7xa8HMR_?jcrxc#p(o}i0+csId9uM?D8MVwlXnX?6!DXL z^yH1BypSS1k?pI{lUrsyhLblyd7`;q?D4D66IoCmzJMopZ-DY*ns7Yh*PtiwG~+2e zc^i3-H`oh3eI0tz_{qcDV$TaH!V}rP4n1LwC-LNAd7JY*(PS_3_;u)s_=)T%Uo_)+ zoASJfCLGW7b?8awC+Nx5o1z?VvzK`KI`m}VClAZ*=Ql-p2~{|n=j+guZa-n*x&Hd5 zCr8`tB_6&GJ?Zun>B;BIH$`~~T{xEK>(G;dpFAvAUoYPjH0|2VSNW4D}Hjmp(sk^ z?&0qKPR4zXBME9Z<#Kg$E8yqbSRtxVTvwo>Q* z6V{A{C+AD0lR=g5{TGI(!5vCZVehU{lFz6~xC22^XIkt_>VvPOesWk{XJjkj|-hL&+>DM_~|-teE9*NmfLc2{-FnmD865o)AJKt ze;D2;1n;p=&%f&drr6(|p0DU5nfDstXD76OYLk6uH`Shhi=( z`^gGVNbX)J!q7CIdu^)(%38Zwv_np+(taCRFN?9x<yiZEZF!nc+G(` z^m4hRs&JW`n z2ub|=C2I18{z;P?EEjY-5alCJ) zO?9lk_b!`Uh@zj)8f=7;FmZG({khMMci}lli^HkZ7^0W`F@L#ts%T=wlJ=cf?}HF*#>86EA;8W0C*3ppyee6!GgE;kB8 zD3zX*xJrdYqXSD+R{eOc9SzL2j_!YvJftD>v0OjgtBy-8U{;Vg3o~@3Ggl9S*HD!C zuk!byr?ik9xPgqA6HvnP!~3hs(Q8AQc^HRyi5*!wo%7{V_3Ma2Y}9OseZK)H5u0Se zP_@!ZPZskMBg!vNnPEH#Pp-fdjms)~aTIW4!?-@<3G$$Yzc@an1!w5xMwHZ#I&Iib z$jeXZE8xlaTZD1f!Z@|Qa3foPZa|3deXNexl!U#r|B%iBeSu zsz^8SnnCyrullZa0$EqS&A~RN~wmMW}dv*=Ll*-s2{&W0W_Pf7TNv zmfS>Wa!Y5vy-$8(?UddcQK+#_${SE8Y{sv+6TPLRqyJyhjfKGWA)efBOugRgFN zWuC|K_4eV;b&QtN^Uh6_Z1Q;F`9rVD-y6}KQW$wyQs-%Goef{9`!o462eBJ(XiM|IyWH%&}t<` zr7|QED@6$|QnnL%9ATrJ8tnJfqkF(~tS6-`ZV$@jI;t>?5-SxTuO>fwyf7<6P#`*; zGy+z4eb2;SHH$&sk|sTP54j7O;YQI(%};KXW|edyU65lylafv#$|Xt&he>`y73bLK z#&@F|l#Dd@^u#uk;wC4{)jc{a4G(@H{gj4NATkF{E-!y*1x-Pc!N57=43&_m8&wlc!T>^DdfcWKMyNT3`gIs)2Ldl{K1*u+3b=y>71t+qjO9|E9 z99G8xPbO}1a>|%}2RDEVBtIdN#@C$j7*E!SvWF*~pI}31{Dgi#HHDZ(zQ5D#C#r;o zZ2TKLQ3~QJ4Nn;7DU-pO<`7qDjvh#wU{~>z=vmP{p|OMQ1dL36V%*adcTYW*f5@nxCi~CB=ypoPw*4|P9ojIld_+q>o1yDMC1Ilb>Yz?#WUFdh}#}3i&bXurgVmVK>pbSm!6yEXpel z`2y*+j1dNia4VG%7eV1^kKhjB*JnF$DAd4+Li+fBKv5!gauiiTa#JHL=fO>cD&i@` zPT3CS9rR?do7i^3n4Ju~s1?;#2@RFzC*ml>3Nd-k{N&SMKM8&k_7icG5l{};PYO=b zc0#ZFD$WE#)vUnk=hk1@PHvY^F(xOwlGsA2tSI!SKog&7rp`~)!%=~QT0$kIAN^R) z;SR-56gL#eXXY!#@0>rf)2u_o&iE6c!QJQ-OWGMuUSi6meo@tGP>uH<(#tI8Tu zbQmKXy*Bv?h>=Jc+(L6plU|ob@!&dv5R?%$kr!$rBq=Afy6PNFv%JW5(vyLkz*8tjX}HE$Le^o04sIg!U^u`cQ7@$ldZqTR zj2RN8kL6>xpBQTNI5>(bu(CgewD$01%}X+gtnu%d`1O z4a;g~A6#IWHKH+KWo+o*yUznr0Fj28C^l$<9VM41%vXY!gbhW@8^uqgc@?|#q^;?M{X`7B z+fRm^Tr?_Ye)0nXW5&}TQ>hL6Nd*8;)a#R@47ERCKWTVEJ76O@KmP%KQudP+lO)B# zm^|7~XfC)>j>&NQDnSJ{o-~fq`ALL}1Xa`RqjZGYbHGo+enMn5YWV7`IZERvC{$-X zR;N@Ju!q~SpD6Es(9LYi7|OvzBS$r1-K8fAa4S41j{G@^WD zmRXmc6fenhXn5F9TG%SBXFSPHgeR32tsq}U{rDj&^OJl&*-zjnz0V%7pU6Z{k4%1& zc#`&$AyXA=#ZQbUji1b6!4vb7zV{^Xg!P?PkuIOA^LSP*Cw>z46Jo3BJ3m=g_NSIS z#U&gqtQke;Cwt#U6^*@eb4}Sx{^BF5m#+2Gz4w_gLmK(XTz5(8BN!q(iera8rSp@% zcINW+*r6vY+X-ts8er3Y(yN!HRRvQ};v<8iY}-#VfysUXKVhF$J)zg35pm@HSe|t} z(Tr#0C%yb7Kp;DohX=0w3yl>SDF=%^7z#R+Wbc%l{fJ8(9+ z-w-?X#O$Q)JAuZAg^=DnTTU%2`rpV;H1?+q_wdB_lYDAx>c~&T#3Mn*VMHojY5QZ5 zjr2r*vA#pkDSp!O%WOH#_7met+D|qDAF!WPEqbckS5k)VXy@Q36gZk*h{7+{WQt4m zK}V%^2qB3P1+_Lm*)PC?ft@g`2Q;-2gd96J5u!*kJLn5CHM)m z9+m?}d)XMf^kkEt$bPaRW>wDo#P$;jtx`mKBR>iINqgA#pO~Z26QENr`m^jOgirfP z%Wi1K*?vNUmHlKZ@VjmMNfmTRcJop?(vPyA5W61uOdg~CX-Yg5D%7g@$!+a1qu;gA z82u(58wE-fk!H?^SJT0hw4bzOrg|izD7KNM;R$*oK4pHgLb1}5O@5;NCmUHwo9O}l zSL+Ph{G?Lo{3Prr6q4lu)!?c#`h^dOup9)Qw@ze;qX+NnHHuy;nJkPS9q*Zp_BP&kg z&NtalmQ%_X_LItdtTT$a$xpV!&M|dYuo0M2{AA)L&^z)73#;u;Ge@!rgwMf!M+!YgiM7=wf}@s8$}U6>GGZ$YTJIYRo5w6-bhbMSJa5` z69HYYlKSgiWMw~Dr<`GfpP&V4KZ#&cfpPyToiKUaP#7u7%uTr022AbuNq(}(w6 zHsP`T1WLPqR(jFf#{DPDZ_9pCd3O={YTJHtAn+>g9-df72E|F3VNYwbpR7|ho^-|H z*7lPKW;_`dO1a-q_YFY7KBZ-jvY)Io9qTb6O7Ii*_Mj(?pR8hAPnN!}6Ffz>3fW^D z7L0iys1-laz+-6K!xLJz7!Kn#DS{l)?@5CnGb@rlU_Y7mpQttZAuEc0vch5yQSoe% z&HX2hpG0jHZ>quk?hc{7|6~p`MVM}8exf0`+f2%SLKt?X*8ZJ!%H}7uv}ZerF3_7$ zDyiV)?#pfC2Y9TC@6w1RcDo6)9pUxBPu6)(Rfu&R+fg)*e5ZvP?dfZ4XY1IZC-d44 zot(84+fUZPBQrMx!U>MTS)i++oA#4TgWV(J`i{iW@nq9}((wdtLZ0-`+D{^8uJ?K1 zCm3pNhp8FQXg{f}F+EMH@-6v^;X}iaMApu_X!esmDUSSvYiUOunoi4IKd{reT2_zh zx}Vn+1)d~4Df`Jrj2>4C8FL-|)q$F@2S;dR`^jGH(39XM-F||u8c#Nd9Wt5iCoppG zM2)qFC$gVJo+`+=zGKF&xx1oG{KWe|!e)Rvl>J1j#h}wQ`$;s&1)k{r9q=URaO`L^ zN3kNqPqMnKpz2+oyhB{(Cwu!(`twnu``6Ne!L=q%yNS@n2tj$hUc8?!^5WO*Cjdqv zOPtxgrX8&NSr0zKlaZrPA`qe3PmV_hPiB4+v77y5FLvn3YVXMjon7lYP0&N}bjjmk zwgak=i_lUtfsvn#_LK4b9qcFW4c29fG}%ucVrNAV7qo;fB3?o_(>@RFCqYq&!L@d_ ziJycWMzbc};|Of~NmN$~q+joq-`0Ktx1fw*D%JNPaw|Ec{bWz*WsocT$@ka#O()fwk z3Hl!V1XNIOko`m!6dD*?N9{kk15ebeTviMMwf_V`z(};;Rcg}tiERj>Ro#Y?`%h9& zZa>F6#;y9_)PCaK`rd0su8p5)z7zJ7mTMOyy=1hX6i;bq^ONI>LL0~eTh0jD`N>9} zJ$J5Rji=d9DmGG;{dgnx5q`q#WFvyIbFw3%h@S}jSN0R_5@+X{qu656dVCD7;wOqF z6fko5PvA+e{dkSXTtqw6il49!5q1>N0~OVtQx&Ttih37mM%G|SeG5fJ;rN#Pgt~j4 zf!)Cqzv3wDI1Bs9h7iR;j{VF}&e@b5#ohS3LKCr?Pk|@0pB#=CNsVaYHh^Om8nFj= zBR}g2hW=nE?Qdt`8*%pSCrnL^05d;9Y}$XKY|TzOKZ(uQLKOIkW;+aVj4$B^exkN- z>pQ_u{F;UEB<&|gGLXr+kW%hL5&ERKmi8SK3*K~M-hYw|qmN4)l^(oEdmLioZ9)x* zcn9+cC5Sitwxph+f|nq?eu%U1FLuPI8FI+FT}s}A{lo|#{6zMXtvp*)E?dLfQWPXO@DtVvwB8^gXs-vZ>?i6^9I**7_M@!v#0a4( z@gTT}`ltAb-T@ZE$et40MZpsfQ?;v&H+VpwLNap`GZb4|#8xOxe4k}LKT}bpC;eEi z9P`ezmwnNHYK z+WR|SMt)*INiG7rqcOx!`WI11$?0hPqJD!7MepyZ#!GS&IEunD%E49o-V;(|-jnXx zdLolRx#fyI@vMxnXV){G&QX}~Zmy51Qt%VnI%YTSU*cXt(P@8#hW$k6K{tlWSl1ct zC&e&?2nQmy_}(L{eX-4cQn6(}*^ZrhGQYcn(8GSR9Y+;RL3#fPnvY&G=J9J>?hl?JDvohh@oIdd4iv;>?dT*p3^-%8IdIMMCgIH z>;!4^%ugf~DMnz5!s;sS(UMB1S$0`zEsmnVotx+@0SNYl7SML$@%^28kLNQ? zXfa~ELZ zCZMEen`J-Q&a$U6t?ktMjuge#+yk*oPd53<0p6_2O|zXC=fuY*enNvJFY!0f#833z zjx3k_ID|r)#i&7jn4}E$6IYJ8J%l(oig`(16T_)Eox~GnTwkSjnn875qN{`+a%2{U z3p7#r{58tR|Ni*9#VKp)M?dt=^H(hG<|m~*@mK*j}+KC1a4;@r~_m(2F^S^H(%`VQ}0_K?$6=?O$| zc$27DjKW0#(&M-IOy_{seKjxDPnc>jaunDK=7@}NiV-?SBd*YZ`9 zW$)IvOR=$pl@%e=z?Y(MJRd47Ou}LdDArNR*3yw(Hx7MgK{gkCWhD;s^8jT|L^;KW zO|$d+CwxMQGPs#-yXj4`eI-39U7?Z0Pe8UQH{}?=Z9R!+!B2!mclr#Vru-h1DWBdS z-i#{Shq+yG6qhDAiuRwB7`BT(t?P)JI5v9n9by5E4#qA$S@9EigWliSjK(BtvY%*@ zW;~$*W_|*ggC+SMP4pJPz4H^|k%MP3)ss*vq0nk<)?QPOz3>i%sa}`qxF?NxLV9{n z047xXFfyc7#fXA7>RTs`qhJrF3`rs>-Da%^xtESaA+VpoPdc83Z&#$Pg%R$h2K1cr-k5X$nyeH+05d&vhbpBFd52sV7)u=RGJO1O0Nlp!561 zjBkv0`CZaAo_Or9eGTnB+vF9*QwA20SAo?lu|@FC3R0NzUbH)nwNMDD7=_xR^Bm{j zJ0HDMYeJe3gF_LH1RFm&m7XX+tvQj_6*DBhOsQ1i1T&Jg))_B0`AL;`SmW`G2kA^T zaYE)NStiOA+(v(+3`ha1!nU4JzR_-?_l#9;aTRhp($bN!+o|j(aJAr6>^}ifj>YbJ zGVv1=%xyd|)EAM1k5Ju?C$s$oJfSfX3G^NdJR{M>y&HS1N*@%C>H^iWLxMsxKOu;} zKEMcWRI2w&VmOKXhsN-?Lhdy^9+8JMgP(w~800hrCZd2RpXt)c4G1@+W$CW|tndW; z3H+qEgiwN%T^pU@1N+I1{DfX`hFSTGZ7Y0y`GN9=};}N36ZA79*80_8d1bg5LonF z$hPJ?chJbCAzGl^klgxGO3+>7ClQQh7t-nHvusOa*&Hf{93hFy#Cyc>6K+<=#L+T! z*MT^}Q8X{2D>|+a1v#t>JKo#Q<+k$r4$}hiMLy)5h%$zruDhPB_MpHWYawllAX^}X zZL=LIa%$-YKe<9B^4lBHTWI1$6ymkUML;s0aH98N$CZY!YFxX))#ujyWThskLGhCq z>Y`c5kb|-+WzE6Bldzv$->aNb9U;^<-ghBLMTR5nCk-`9ffT~m512jM~rL%6L2R z6Yf0^*LuPJe8=OhzU4E02PFAP7lY6u_Md=G;s_gqvuxwr{DhvgE~xFJ2l)wg0kdeB zw4d-6?6Pm|pLR6Gry}IY4&bTE5bRm$~ zwi6m!cp^k#2=^>#Kd&)S+DP0a>?au;)DyFj4MiNK2cNFGo}eg`4MkrU*ofuXPPd;3 zPKuwvgVy$wfKyos{T&eVlj_~QIp`H_eFrT`AYEs!8T80coQ^wDaf6{|>S;4SK`jFL zB3)s;ziEq|2Y#YH6=OBXu+Di%mrJ3Lp(IwsIryjy z7Pe~~e}uxxPvA0o>hGV-#cg*hGyy~MtC7^5ItQQ}Qj|eYj40iPB0I#YoG$D5{n(El zUyGkmF?v~FFJ|TfKcPGnD3QSO1#ZPZTH>Hd-+vPA=P|R@ur3%+JuLTC#5VXb=glGFw13rqI}gjaJRXLr6%YCh=RH% zKj~RXKC&7Qg$*?cej+pxmjkJdCqe|R*pnA-iqz5ssfRr$DiauPexi=f|I;HI%0WaK z_2k|7ZTpkoGHUMU=!PkN@(V~DD( zQDS93p>6B&eCB~xtxGlOH5{wJ+Bt%f7*7s$r8!k96G_(J$$la%j3dvMP;#P{P$*MZ zsXcz8SlFI1P_{T+piuHxHGIf|nyX6E^7vl0zRxyBYS*i|4&Qx6=EYA0UPl3C(vz8^ zhz_r_^tag>Ke5ti-X8Xo4LmVFQBi5M`i`o4*(3n)1b))~{~ZV3YtgK)t-5Y}%_c@v zY62N9WcYJ9gsYx7=c{7z0>m}z#NsFagq{>P(Rt)2YI^6_&YBI16HJ1He-SRrBt%*9 z6U%jahevg4;U#e)3WyJ$NG;7z(33!vJ+|i9$xXx~#Zf*)Y}-$i7JA}!o?0hUoZ*=D zWacQ?A*Sk4R0-Qog=?DK@nqkA($t$aYR6CjF2R$|PhwCeO;CN({;hbG4gR~{wz)zBQ2vPLY z%5TbM>ZPS7LK4exR%ZF(#81ehGH+-iE+WTQDUBy#KVe@DdJ_DEJX^GkzPIN@|BFWP z6Xhp834Q{qtYeeN3Qtf4^s2sbPhqQ=I;Ub7QG!S&qC}60+0L*(7Jg#;$(Y90HTy-h z22=!P&U7onxAf~4h&|zMX0wJ9#vM3<(1^nT6AEOg>GBy9Pjw1qI`EgK17*RLY=O>A zGEJWNy`i+9(9n&ape_|Ht3VvL(ePLHvBpmvyWt6lGPS!BS?dXQ*}fMAt?eQT2xV!;wMIx-f(b3+Nj%2 z(ta}X6TwO2C!2PZeLazZhoG{hxNs$gp`d6_Kr2<$0Y9NDiJNTNPf9`u&y)Q`DL0`W zjPmUsuoi8LQ3a}|3)6JPRltpA>#K&w5jq9(;fhX219^w1o` zRduloQEWL8JDKss_LDKc?Q04QZffkY7`GO{wj+KEUy)e#@NsC^O4p-G8(P%jY9RgL zST#ORqghw{qz^fS(1H9U$IWwm!=6SYK%hy);R9>5LvWN_&~zZ@rRGNoeC?)Al+j+3 zJenPa8LiNWV65+i{e&RNQ|7^EUr(?P{17`7xBmZPW!1%!8ZJE15%2TxeogF$?e>!` zv5$UecCZtf)71|rT^>XJ1lO@2cYj4`omHrWD~b%H2ysYFy29uQM<`Cphu&Lwf`7zP zYCO&xpGIZV69#wjp0JxZ1lU2+EL!@Ie#Lq*;!;-jRS+G%rw&}ids3?BrS}iVb19DP zCyI@l*tbgO`#}O*dXkvncpBTpN50QH;YN@x(4kh-_`co%_$?DYch*3r?7P+|SuX0n*Dtn!24a>;#QO_UjCkk`t4M_@v zY+*Rqy}e(i;^*1_&kp56v^sje>?qcERkW`cZ|fTcuP~%*=HcCZnl9-9vHe~)&xo!6 z=STk+B1O^u6IFW%6TC$peX_N|V-<;-V##FJy68Jnb<1PA6KBefY#Z!7h75V>vsAK+rI<%qQ>Gl2^ZJ^Vx{#waS zJW;a23Q7lAm4>qCURs75)Fi&s8~bHe`*VZ^YU+?} z#^W3_&Ae4k&&OqrKoPZ%ja|{PzVn=B!%7{7eWBHJ8tplWJ~vEtg(t$(T(VfWXL@in z8fd3o?8ik$@h$xrKoV_jTWWd_(rQ1j8$^f_cvA7zOqQ=r5O566(i2-sdcNBK8{dJE zCSP>}B6|A)}~Z&tBE8S_coRYU-u)D!<7#LV9jfZm(Y+Kl=N z8cK8$2tiOycbG&BYjH7Xb^`0Y+h^HN+&q8}abvTPQmqd7MBDv;eH`z&M9&lkp*YCI zYg4fwS9@$n#7+5(OLO_=pF`2v;0yZBOzoEm`PMXnc)_k?Ehf>5dv{0bmf`+gu*cAsr{@P(_0Cvq_5!|V|VmS>K?;}*QR1WZoN@3 z^AiwdsEv^`-bF@+#wdL!MU50|HHoOUz3>9BqY5FC7b#zTm)3}YB9@vUL4^_8W7??a zMjPWxAc&rUMovp@IK_@Mm3}@itlH)$YBc(Z`H9|_VKrCp=z=Gk{G`c1S{(dDeT@y# z`oDg;dR`0rjk?B9o*V0VX@9d&Id*$|ptFMp{=b2RyEL?9bQ#Zb=n*n9+v%-=XtjY; zHXEZdyI$DmQ}L($IpTeqlc@0Pe5=O`ky_$L5vL0zG{jK+h7h6)i8ho|u^U;9Fvb&g zS?xjA+$=@6jVGk6_ioHj5C9a-W3LAtC+{pI1dpGY78{}!(ph~Z0cPi#AXZit>d;xM zrif2ff%7~!)}hpX8h;v@JsZeD_0s>(CmOouCn+HhI^B-Z3KTD3NJ`X{nH}?;nV+cn z0;xL^0nSst^mxlk=+Z=$`(4#8?AVXz1|%a5_vFcOqHxr~`46$-H0CF?X+2LkJBTMJ z3h&)m&(VIpHRBCJ$xl)cRA)vDw7B7k5EV8}My(o6Qrj1@4rUXmqT7L9+PC#gA*HMv z@qSYB3n{vrBPA64WF-Nbyre`LAja^%(acY5M-4&j<*W9HrXC^T)GVo zp(pCSAM+C_aLLjI2!x1dd|RUN6Pe(uMKTO|^M4E)Zzx|rKCCCiMu|a_!~CS>P&tW= zHh2>ULsckpdwl$YX><)d&yI6E#h>D-hR5I_!V~>>;I<_nu%E1Zl1o(YBF7L*5Xo8g z7o!or9uk6|lqFYRavAa^Qj^u#)V7~cFd(5l4@L2Pp&+p}2pJOxMG4XnvGaK<%27QL zrW~}NY)e4=B*$*F!~@gwhmfqg#@wHxg}+Uj(d#5|kP;c|592>9ZqI(A$6JS*JdneY zjon&nv9A%O^OMGbd%k0&K%|z9o8O$pfv_|e6*fYk8YmSFwch&zHpYqI%z>UjxPT)DY-~X@g zH~;cK{@Z4Ew%Hs=o6F7SjC4u5A?-*9(&mQaq)XBbX-7JcHam`!E=f0}9qB;Y95_z8 zB;Am9qyveg_PON$8`6$+AZ^Y#PP!!Bkana4i38}vancQGM>>$W2z@wCx*_dI2a*bM zM!F>3kana4NrgKjU6O7{JJNwf2IPKepBw()kq#so;f!=ix*_dI2a*hPM!F>3kana4 zNya)OU6O7{JJNw91D=sCNjIb&=|GZE&q$Y~8`6$+AR!2Sq{)qacKm-J$@piaOVSN# zM>>$?kTcRH>4vl;9Y}K08R?RAL)wuJBsuPkbV<4)?MMfboOwpNB;Am9qyvc?&_`C0 zCOi8a_+L&xBVCeiNITMjq>6Axx+L9@cBBJImE(+bNxC8JNC%QC%o*vDbVJ&a4kZ3V zAC8l5NITMj#0m6~hh!CLa4fuKtcfeaGZ2Q+K~<*#^ygvo)%*6Z z+ya|-AO0jgIL)^gw0!sB3�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 F{}0N}J;VS2 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/kanguru.bmp b/modules/windows/oodialog/bmp/kanguru.bmp new file mode 100644 index 0000000000000000000000000000000000000000..323d0f4857dd5fd2e24bad452268b5672fb0bbac GIT binary patch literal 36046 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/moose.bmp b/modules/windows/oodialog/bmp/moose.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e0e801d9ab9901a6d66e3e11c8247444e1955151 GIT binary patch literal 28134 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/oodStandardDialogs.ico b/modules/windows/oodialog/bmp/oodStandardDialogs.ico new file mode 100644 index 0000000000000000000000000000000000000000..7d2519ebeb417062d1fa66ba21399496d85bc841 GIT binary patch literal 161361 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 V9h_3oQVC^7@Xf110Y1~e{U2{ZZD{}i literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/phileat.bmp b/modules/windows/oodialog/bmp/phileat.bmp new file mode 100644 index 0000000000000000000000000000000000000000..322edfac9d92a7ac2331ec7e542e99653860d464 GIT binary patch literal 18238 zcmb_gEw3KO6`o3!Vq}E|Mhd94D8#^^zy*~pl|;HE)G#s%3|UoyK~`WuKvS?%SQTtg zRA9EqmHZb1Os+22KIe1JnVs3)YxjNq?#wxJ<~+~&*x9{)`nNy-weaWhA4~ZYW`Eb; zAIbyPKln>2ZyuKNZ~XFSE(QO}Jj;M9rsehP*X8wpUzgwi^Urcq7W}qy^F_h$20zGO zKz;`K8RTb>pFw^J`6c9+kY7T61^E@^SCC&p{tYl2jnMtJlnwHR`Ns3DY;PgIh5Qz4 zZ@2RG*I$=ygS;)}yYId$Po6v}Km70m_QD5jZ(w@^+aG`YvHbMYPvw_ieks5H`YUu; z->{CoH`sdv%m)u1AhMhC=+PsLTbU8dj96yGG9#85vCN2NMl3U8nGws3SZ2gBBbLuT z`>f1}WkxJBVwouxaG$|_2A>&xX7HK8X9oTZ{2BN&@E4>PEbyc6Ru*6{z+Qm80DA%U z0_+9Y3$PbpFTh@ay#RYb9v5IQz+Qm80DA%U0_+9Y3$PbpFTh@ay#RXw_CnZ*eFgps z{1xac@K@lkUqA-_3j7uLEAUs~ufSh{zXE>+{tEmR_$%;N;IF`6fxiNO1^x>B75FRg zSKzO}UxB{@e+B*u{O8Y~0~K`y{x{!zQ#Rmlz~6ws0e=Jj2K){98}K*aZ@}MxzX5*( z{s#OF_#5yG%b|5gE$M~EQqrp&Vo1#;w*@>AkMG8`U=D#BhGKX{kBY4 zo`64r(}ZXz;7`DxfIk6$0{#U23HTH6C*V)OpTK_t{)Ct&;7`DxfIk6$0{#U23HTH6 zC*V)OpMXDs(ggeo_!He%z(>cI-|x2akDq_WeLO=0BmBcnBm=IP;2rT~ z<-<87kO z$?7#LvsHlYj=$Sr%rwqf+=D|UAQ`yRJaos%-ddfjuP-MMcC+i7;rHAZf!N<<6ck?uys3g+G4gc-#c!6k9u=v zsy&V^`q24NzwS5Rp&brxc~;@=md-~$BTKS{2WCJd9)}h8oL@6{9Lx^vPw#y?9_Yu% zaj+K(4<9}RhvdhcXVffx@`+k`4K<3c3|o3u*vERu89aRV4*#cwzbb1_m@URyk2rS* zwStGU;E<Pj{DCj;8IsjXV#oo8l8O6|@P2zsC7_SgVk=MNHKz7Nc&!l< zArHduumi%qzPDorPJwyQ&G`hDHq>Kxud^`&nK0n-!C&c@TB%1wLpyy3 z_ht@Cp;iqF@Q&YvITVyjp|N9R9%ZS=q1KFSs+8W2&9mk#TG`x)m}wYwmuiTF)k0Ow zl6rt-8tE&~1GPwcth#!CuDpM5C2%8}aF5wahXchyHRDanxWY(}dri&G5hM$7UH!QQ zQP6eK1rBOt)n}1&V0>k>t?Q_}!k~K^yO6DLPVlxp2aQ~ua#ZSHB5bY!yP2vVw@=Ha zW#yiOo&~a{_5q^noD<1$BV_xuSbdRt&p~UI_VC?tQscYG3`nx zecvM6v*ewT*K9wHv=TVz!@}yA_mN~PGUoNXCij$BU?rMbC+LVJqR^ZV!m>RN*p2oC zS;TdbZJ&$**6)acU55ilM70WTblQFXyFEo#d!X(%PkCMPK<7?}gFhjv7oSOt;lS$l z30wIdd+F7^pc%eol{jcaq`C)J`s|1r&Vg38ovR(*F4Hq7TVs(act1D?u6MqN$)i0( zXilHbd6CZq@dL~1EAJsMeGbaI)|M*@hll}dQBP5w$(DzXol~fJutbcjoc>M-bp?^( zmmg8x)tZJ5hxRO}wLYkAuCz;IUv%e5CF=PAnV9KEm{a}eYok5$Og40p*2WZO?UTJ&dW^mg7 z+C9==9cdXlT!cmCpiB0o6Op73tb3<70=i8594LbLegIoPA3FCrXQ}Fk=KUYUy#%+6VLd^+S69$Q==U z0!5|7L3Mh+2Yc;@i|0V+OtCYg`b583%k?;*_5d}Ovdwzr%4k{Z^-v{2H?~MU4*njT zH>8>$^@pD*z4IgcWU0p?pANQ3yCm1QD^VUik2?$Vhf#Cg4p0O?&)*L}_MojBN&BJ={+RClFbpePth@)K(B7&2+sktOpdBU7l)Zrg5gSk+Zu zJHiZQta_S3*X}nzvYIywh04JaAy%OSben0i7m{oRqh^SEqV0zLMx_uqBocZ~pw_k( zaqt;ovW~2?H5g~v&W7N}_Zx%sPTRaaa2&ovqeYWi-vh9Hf1n#uvZB2Naw@}-hvUzO zT`fpaA@{Rf`L0x-7QB6{GUM0C^Q_^thbGM(-=m@KZLL+VyRC-4hn6yOm3AxDkI(Le zgPa4d^+`A%&<^skMHGX3g5`>uXFCqGY#xX?=HNhy(AvtPL1DBz1M9}Y9B_VUA1g9) zmAV}2a^%11^aJb;eRh3Xgiv2&m*>6zmC zs%A8Z5j9I@QTOmno08g6`oZcR2*(@nXV?RCL}A~PY#GZ&VERGi*4elpROx31_eDJu zs-6w+qR&ic)DP84pPJ+-p9}F08TEv{dD1CYT{g2*4*bNbG20&}V06|G8a@qjz%2 z*d;(ih&=UkqFo@F7+3%fn}8KsB{Ygq{#s?TkJL-#5Y< z=`C3~4@QD|AOh-H5LGr0353errg5Nl8|FZf(8nV}PuO3Mgk|puh8srPrz-awCnp@R zmA!-udy}(49sAQlWXX_rjcruZ2<`I=94Pwu6B2q-ARls9@Kw(YeXA>pyd$%Qs01pAMu1;1wVT|xeuohVk7;&2TZfuMCK!`k-i}j>S|{N`Rw%pbXd`>`9889VU6^e z!*M2>bAiAtTRxI}q?ctWY*Ne?#Z?!zI38sQp$ naf#+>xhq_;2^(90{r1Kp>>W<`PKKtsU?5{Vu^6wnE2aDo|CNN2 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/phileat2.bmp b/modules/windows/oodialog/bmp/phileat2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5e4ded18ec099621466e92e68fae2ec139b0a05d GIT binary patch literal 18238 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 J^Zm@W{U2r`-#`EW literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/philouch.bmp b/modules/windows/oodialog/bmp/philouch.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c494e659e32ada12c64cf431b2bc4631c9e974bc GIT binary patch literal 18238 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 A9{>OV literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/philslep.bmp b/modules/windows/oodialog/bmp/philslep.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f919d3ea7d5ebd1d066c7d0c66e6e421a8ed46aa GIT binary patch literal 18238 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 B%O3y$ literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/philwait.bmp b/modules/windows/oodialog/bmp/philwait.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a8f6aa1b9473ec5401757f819b6d012a8a0f5ebc GIT binary patch literal 18238 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 XCLOv`V1Gxb!XVI+p40jN`^f(R=M{Us literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/s2anim.bmp b/modules/windows/oodialog/bmp/s2anim.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7fd65c5398131b983033cab8b164abfd281357c2 GIT binary patch literal 13238 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 LZ#X}~9!vfQq41H> literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/s2backg.bmp b/modules/windows/oodialog/bmp/s2backg.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c84ef9e3ea900a520a128b7098f4592c47afdd7a GIT binary patch literal 289958 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 J4lO|D{y*vL1}y*p literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/s2input.bmp b/modules/windows/oodialog/bmp/s2input.bmp new file mode 100644 index 0000000000000000000000000000000000000000..94939912dbc023bc944c349b7456b52d26b5c09f GIT binary patch literal 13238 zcmeI1ziJ%G7Kf`fm*zU~Vn+i8hXS*KHfVVtV4cY<*l<&)ofsTj$+E#>*x1~l!NEFN zSTIfmoA?O~JqC+A)_nlKfM4L&{mwaE-PJSwr)DIX4fYJbuBubjb-q4TQ<7Rg{P<_# z)V}|RbN8tI8$Cjq`=|PU{?54%-#GVQ6r0>uq6*c>BZspZjydp&EH4Fa;`6g=*xH02Zi36{?X(0$rdI zRj5WD$%7QAL=~!$NAhq5Dp7@Monp|26!YZLQ?C;bCpFeP>Cv3BadVw6sSZMs*y*s zISN#w3f0IX*)RnvQH5&c5f^yyqYBl?BRb%b6_Tt7iPsN<;lYn8R3nd=03Q6PLN)S; zN#VhdDpVtn2m}v)RG}JqL~ugjM-{4(M`AZ`-gI~F+;R8r-E;Tv-**olJaCU5J#tT; zJaJE-K6THZKX)%)yl^jHzI3l&zjklmzIE^3y>sv1zjvQLeR7{ae|BHKe9`%2PVfI0 z)h*7xzGr_$BWHg_tY?37?Y1memM9lY&Tur80IvMU7nslxdEa7@6#x&4#PqhYeh_y*BSjdG6)_&)=T8vb`W9;tB0u z`d(Z+VR1C%>-Ac>4o?%Y9&d2AnuJkf1<4d*kLNxK3omf)~Pw}a5-T4E9Xu| zo^;#I6K^{wJ$qm|_w9%EEBET;Bstj5Tzg>IlE3=!@er^?vR%0h>rHfQjxV3}=z044 zN9+))RInYn_QX0p#6Euf?JyZ^H?DxiU8%-drswI2BV%MMF=Gsz+~xhwnPa|xo`#kk z^8htqNfCGAB3zy$EXFCxU_W1L8%El*jFdNNyhS3zF5qLOy{~B7GRbze&ty%=fRS>E{mmLzv~amC1BZ1 z#!|TqYwA25TE(!43c-%g^KaMdvs;p|neCIvbp==?EX(uk#+h)yub@DFs&vp^v~TbF1PFw7w3`7`ZF20bi7ZLuC`xzMz~V2WGXdwzmYNZ1%o<;{6;pm{8ZaoxiCa-01ZWa4D87)m*af-eoEsMA@9D zEr3)sMG{UM3T9cet}e3-;g4_`Dcj#hZ{|y|#EfeiPi6v43Oyjgj1wh8w|n!|YLzX{ z7TI!xi?&!)g}NEv0!WfU%pKz0aHKgETHlmZeOH zq%}76rTqNobmcPs7s$8LY&KGhb#bZ4GdIghuJ{3-%%wY?i@R1VsNHkN%itD&E?=Ze mth=GT^Xe<{CQ0M^DpmcShPr^Fg%h1X0O6nm z$p_E{bOQRTDw54RFIJIAYbnXW4PjCxU#Qw9)00zzg09t03U0zz;A9t03U0z!HK9t03U0`h|lz=HrHNI-tL0eBEV z1PPFU>|Q^CGJ*s|gaLREKm-YhFaz))fCv&0u?FBl01+f00uI1~03t|0L>+(!0Ys1h z3&BU21pP$H1VsD+co0AY3CM;Fz=HrHNI*7e03HMoK?1UI1Mnb#2ojLZ9DoM_M34Xz z;3KLClc=9WDVsh34+4lF0XYZ*@F0K)5|G0&01pC)AOSfr1Mnb#2oj)x4{;Dc1PRaq zAK4*MMVKW0Fc?0>K>!gXzyk0g4g!cE0TzW1aS%WR36Kar#6bWNBtUXf5C;K7kbu~e zCr{kdr%&C@&5e8Z?3sK1{JFcmy>%~Myl^jHzI3l%y>hQ#zjkllym4>ezIE^3y>sv1 zzjq%#d~hE>esrHde|BHKe5vc{q7PK;F46eeE|J#mJFnBW<^QMGiBIKB&U5L-x}Vf? zWsSZp-SemKoV-l2o=Y3CG49i&@`6B-t>x1C*8k|dNZ7LIeHoyiM?7Cpx?EnpM6<}Y zUgJ2TWLrvum=@M0BTC!CTILbC+EFu4o=4S-6Sie0DPv{r#+aimS*s+izGTq&PMv0m z1j=}Gb3`gJ*3G36~BA+BD-O59GGNQ<+JY#+alnUC#2X zmb;OmHn1JjM;OMss@FCt?LD0rJS=HWO}-px+L1P7iqOW&xj**3Y8$Rxq}b$T)M|PB`Fc=Zql#gra-rCf zp;qcsNTew(V&xQnIK5=$Y(izX?3W>99#Y5I4^U>=xsgZhfZ5YnhRLF8?LLx{n3d9r zmy_j24r+(^;#h%$rzY<7zCXZ9y32c_P|;QP8hPc-Y9g>X%<}C$daDg(HXZeEnAf^^ ztzP(QYl1zzUKhk`^Hfcp2*i0d%W{=wC)S7(uNjT5 z`JGq2M|avR1y0n9m!^Fg*SBX0*jIXY*4sdP?w7cdrbRBTvPiGe6gi(>{jQNR;8!sQz8v7+|{c@ek^$+PdoRT<^p-O>NNf-dWl?BFz1-6f9<)t zx*~jsY4_23?R0_We3ihc2aevdWs9{?vE7rjGhTE!;UzDwJN*^y_22;E&lN&hMBfa<}1?JC}?Akqx zJ~E%Q%1cfZLg~puFRbXb$K`&!b_Y(^>U~1!ideeGrP7~arqMll?Z&x4v$p1HFAe4s zzP`Q|Lb)2pdhSowYnJk;<~FZP&)ym|^u79(c?pfq^zVg4>(AW!HTVDy>n^<~`kmE? z>D3DMf8@0y&O-Qc^;#gX5_()-Wb161*rW5B(~!67f*r|=ubDAFlji1jiCZ%Vmmgkx z9y__Vc{L9tGv^CSb}@;olN;H$Xf0*bf+??_)>lO!ez*xvgh(qdUKy0X!(~2~v$A`1 z%~mY=3%juu$;Qf%1GMx;VOiyBD!0=;UP>oRDjZ=^Zq=IO053_eRs_^ZHD)xIOG&0` z=+%Ks#Pzi_&7`M_l{x5@jO*A6ubhS4=B@I|1J|mF*XZPPh*zeSiDj<+;*}R&>gT{{ z?Y6t0ERlv6zX0jKqLyf-W}@NBc)7cZsbCgcSlJSrXvH5JiU)~FVj*J3hIDd$-nTm9 zWL`VciwSXc)YU+aO3$KAyu`zLUYR9*tWfn*!7R40a7n9da=-ZET9q5Qudi5oUmj}_ zrALa=YaCAG)#od`mU`OQ3a{pH6}{}XYNsn7Fyq=Tm;Eg@w)&=})_4(DD{^tK-P^}w z&i$07^}bDB^_UgGPSUH@=YBq$RWfha#;ZJ#x{dPoyIUD&qvmu3*ev8feE~9x_dQF;KFt2|Bfd`Z0 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/s2list.bmp b/modules/windows/oodialog/bmp/s2list.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c68ffc1371c83d57a1862995acdcae4cb31d002c GIT binary patch literal 13390 zcmeI1&5qn449AJ4TJ@C7N;^^?p~oIpJ&$^CrM^+#qOUWDzSqWO|lDyZ(GdOn}(@pvfoK!YE^^Hd}FMmhz3;TllGFmSZe6le;ZMuE#Yi#jLPrE!%_ zOw+6BRi;2$@0MRpuQCP7dbj+l)oY74oU+)t-fkYdVSUL(Dmz!mrPP3b!}J&4Nm=Y% z?~n_kVq{miZM~t>v~!Wl&V^hybd^ySJJ=0xOyoq=n*h5fl8f-V#hOgz#7tEr7gGjn9RCiM38>iRXs<`;(1#R3rp`X)fu zCXefmLw4svK^#oLWe{x-Bi}5SQoUNPAlD1;S;wrIm8TFyma4vDNa^LQ1w)UAR`r?ak%Kool_?4o7gwJEuhujU%{j@l0Ojr;kHCg3D!%jq4KJx_sjZ zu2?Qu3xboA9l^!piMFtjoPtYuFSA_JW=|XFw2P99_A|8RH#TYi67>n4LIP&E2#a_e zU>2^LOUSh}mzIcXZDyJ99jFhR|u0B@{#nKl_l9Baq|^!rq|2*QUQ<{!npdE z9>}1k16F0FAG$=43b)6lIm(HqarH_`=Kufz literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/s2mov.bmp b/modules/windows/oodialog/bmp/s2mov.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a3b5c1534363937e381897bb79a0c9ff6d45fe46 GIT binary patch literal 13238 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 Z>3Vg&d_xkF3`4sT&?)Bx=>mTO&fOh}@ literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/s2prop.bmp b/modules/windows/oodialog/bmp/s2prop.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fd8ae1d417b1e7187e8aa199ca4f9de6eb9ce72a GIT binary patch literal 13390 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/s2tree.bmp b/modules/windows/oodialog/bmp/s2tree.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b42c075d6268ee1b20c41e9382b8736f187db5a5 GIT binary patch literal 13390 zcmeI2OOD$x42I=FQFLWDyB?v-E{d*$*|$J%>qUrFP zpR}9|`ug+NcSqyL2j{+m^#@+R;WfEW@9uWHIrP9nPT;w_6?`k5f>?MDIKpM%ILE2Lsld}H@ba9)Jtx-7$z?0d zsn@BOO#xeU=&vIisx6f%I&e*keV8)Yg8v7uy_CxmY*aBUT&$^00#kINmxIi1!I~mV zM1iZM*rrUj;Dn1wlJq-Xa>AC%6kX)nLE4rnlP&nmzrePoGDX|!cyihFN^Vb6 zWo*GGSFG2CM(mR-q1Qam6Z~5yF!}>aD&NRtGZh@GSLIxnr4L0BZ{tFu23W?WQ)`~z zq}L{snhSJ5wVX;ZsaIT>EgwyI*w#4v%8|J*vwFsQsd#))k&E(jK1_|n*Naz7=53GJ z=aSt8y3tQrzcLqQ+F>xi;PPgO&~te;`g6iXzcOKjtSKUf2vD}^y6h0wahfj|1ac03 z$|`x@xbK-KN}D2XAqTm9+V0%tLN&IQ&sfM2ikgW9j#MwWAweq;_<9kHBm#TX{V4Uqv@lq;O}owE zORVL>hY}=IXF3%iM=#?fe6t1F(w&#-;3NWGvmTcIFbaoEPD%qyDR4c zz3_JA9jv~G)woI=@50p*Nt~;2(Qlk`r0ZRlsuk;ndEtKaD*0L92vgpV)%QPoBIgpB z+vZTN1=Qlbo_efBHjoQG-M2{OxwyZMmaBSQTt~luL5GoQq0=N0+rznXgra9C7ZULI zA-olvx8rawWrq#tqWufE`(pWmGv^AsXE5?7VztlH6LH^T*28)Q9BF_}PfVO)r0J{c zn2YX5-8Wl}UIfB4!mP5$6FC?6eW+K>P;d!-gekMv?UZZMsRiYR5x;H7?F~Oem@wmu zYO9z_-(E^C;2|WQ$*hsY{*0?ux74rGi+T9IBsTdN&ech&E;=EkHuo?x7F(30ctqG zA9G>;Z8VBwI2G41WbGTnx#af_{CHSF9L`nYNZm1)p+dUQxQ_JProYUk7}aV%hD9RL-oSP3sCfT`_gkrse~@T;JczUg0~Q>3kT0UafCUF03kj7{*V8MY0X_f{9794nx25K;1!GQ;9ss;lV9C#oRK4N0SkK^t^nye%Oo;aj@XP0}1dU4i+4E zASph?!GZ%16vBr%Sa9Hh;*=l`794nx>&1%~>gCIq>gwuBU0+|TSFc{Fo0}W;`t@t| z=FJ=R_U&7Be}AvuzkjbjeE6Uq9v;-kj~~^iPoLE1&!5$oFJIKxuU|tx$$3g{FY%&h z3$4({W$<>rZ*lCz)3#nTntI8?iL1}kHMOEpye|(lYs;l$=8yL}Pt(R;s~$A{YEG=S zoi5N;$;H>%^Gf_&ub)0L@>;*$o!99l1{rsG6|F&ngF+*(RjCX0N?I%3BLi)}mvTAMG_qK%2P?1AFj4t_uTW{|l~&d&U1aT5 zWOi%S_bBxOpP&?O(kUs~M)HYHrJHPcsbbjut?G`)NvVGxubodZzf!3QMY4&D{-R%l zuh)hK{c75j&Ds-#aZ#!7bYsD=#Jin?OeM6-tL&Z(V&z(2ev^rd+~YXh<#Y&z@FZ6X zkGz%*+s+`XU9~i6!!Z={)YUMZ-A>~b-yTZFGG!ps7_1=?o7vR((5r7)-TaNwu7cml zk(ZynawqnEp0Z#2D(>4g^deZVeR)p3i~2cb8T7Ax4d;#L_{8g7yvpER?Nu11_49tT zUe&NOJFifx)_VoBPO7e-SFhHMI#j_(i?wq?|t@K zifz9L2d%d6R}#8Bud!Iy5&qvV&%-dyn{kQAzBu8|u`mv!6qXOJx-Z9xbp6`!Dt|pw zqFl4h8^Jf=oJcJ0-G?s;&E63$v@0G+B|01)l?5|%bW{hcLbWx)0ZsSdRVuJQ) zO}@)3X$CDhTCS=|C@Y7dOm=vMl=bM`YuvCX7QI@r{a%grLN|V$@@2xeVawtD;(w) zTAn_0j16(2jmIYCxa4TImvQrD*|B_%kMNQLk`=*lixrwk`jr(|%Rc!&aweTEM@yQJ zcdu92oNkgeX6|w?t4YOBKZu24h!n3H&!f0q%B;L54O@7nf{kdqL3Cwab_JiXqgGBE z!p5*vw=>=86%XcnEt4a=KYOqFv9;H*VSR#$S7}ebyPGW<*{!vc@Ahhwr12iFcl`q% zWQn1H*QjCB^G7Z0^E#^fJnzVB-LU!jqgIAqz1UHuH}j6Y8nMmO$1P60!Y?+~A(~q%o85kK8Xc`A$cM_w?)8 ot3H8wzwTH{SKWTL5tXO4o>1#<%S#sL*3++Zl7*+MyseMd|2=9xBme*a literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/sealion.bmp b/modules/windows/oodialog/bmp/sealion.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a1e09f6e14b5ae59514278f5042876221a4ce045 GIT binary patch literal 28134 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/wlkfig1.bmp b/modules/windows/oodialog/bmp/wlkfig1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7db68cb434cc8eff85b9871bb7b9471f3fc44d17 GIT binary patch literal 9718 zcmeHKJCf8e5bdp{Y6xbSDtrP0syG1$ARyyDgmaV)D9$l40WkrG*ob6<;dRTcZ?|Oc zz}6Pn9$QjddU|@@EqgwE`t_FNc>jXv9cmwOea3Y|FU5X-L-hR>(GOhZaU#NxPNz`d zjw+qcXFC5p)BU%vbpLRnFL!sabH|JP=yKs2E}U%Qn;a)#p@P0r;Ew8sx9PXV3(`W8 z1Nrbb^J8hg?gj_5Ee^9kk!e zZ7JI2;M6KQabtvYo5rSEgEGdsxy1?23SvNrX~>6x`fFc=qkKFbYJXBb3l_GB4+}jw zMmVC+v*AM=J&PRQUl#?KtM%FV40PW7)lI>FJ$}X;$FletC+Yxa&i9Rv{W{S7aMS0% z(kHt8%KXx8Y{3^HHxFgo5tjku{!d{gYCd9P-C8<6 zPODGQ3@i;8A4mA;zZ@=S%}jMV|C=y79DkhjL_D!JlO-~1XR;Jgi5HU2SskapkCSm> zP9b&>Qd#TbS*yijS(p(d_`4I92Shw~$-Gx(cWCmc~x- z9IM(MOZXrNIMe?SpII|=VkZtOeL`-j4{d=g_>Q-Dd966Gm^fB$MUE?QI8M?Tq9yZ@D_4wwywZQTu=+qlQdg_Q}PLKiD+Aalk>@QOYAFf;@t9{2=DZ0TY=N^iQam2 z{LJ4x>Md^vGUG7gQ{?(eeReTcFni@KCoRmp*yU>QcL#zn#(Y0Df;pZ#|L^ zzI*t)EV5a*Kku^n@e!22%`Ct0Mq=ADJ(4mVZ@D;0kE-U#?C{AwmTBXv zd2~EJ04jLQEf>besdNdf*5jB8`7kaYJZKo%F%n)w{R5_7c1ST^2GN-o+05@)^<0}f86jIxn3@LY<6X_Y}N0~7fJWzB8bSY$qO zCSnk6?EgGH93HEDXnH+!F-KtPDiF|=x$~RwfPu@lyI2%~UW~(7cwb!2hjHe^ zTADe54rt3+3w}_d)$Ocfi&Bg&N0u#}!+;QzK5t7K$M8Mlw8Nvtf7oz}W2_3%Z?PP7 A@&Et; literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/wlkfig2.bmp b/modules/windows/oodialog/bmp/wlkfig2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b5801600b76242251293307f2905a595c9df6e75 GIT binary patch literal 9718 zcmeI0J#rK=5QTedsagV?tzu3!Y_(1ychpo z@&(I676;bDQ?8G->-E$hEO6;)dJ#1hr_&Na?^hjrjy79yE=VnBMem}?40;%6Hf0^> zcsLd+ilPZx!2v`*MRzS42Em!jQqm^rj4H~QBe(4CYVVG7qCC2_Fg;r1ogI!&BQ?)h zz*^-M&f(Xa0=CKJteZ7-pQ!ynw4^A{W}3IV-2-bF?!(jvh?xndwodj!QN#__KOiK1X-t z!^8B&(S94qE_|QFVp$ve1n&;DtEn$po!(p&2)RlSDKAz5hn$n zphiB7pz{C}aZ=!Ex}BhAx&eX9LF*-d#2s;nTZ*zsQZPdDhr}BwVmYD=rh6{qc2v(3 zQ$5@!mxJaphcU?;L<^W)-pqj>jTYxmE=QPH4?0VvkUyN$DUU+TfHRpp9PpG!J2=yv zJLl<)E6!>^R$Lpz3lMYX7J5X{026RX6<}>~IVsxAAtYVtPF57pDwr2xe2o^DRnY+C z`9r-sqG;>9k~?W_sXL-+0CM$s?nunyi8&l`NB14|Ch3U5&78wX?OXjSeY zYFjwS9rH)ZriSYyhx&OX4SByQvS%DIha=!?af$CI4^N-&YvYUBMu~GO(@J0 z2ui~yyx{o=`j*w>M(Y^Ni#aTW*Ek>L$bLC$gU&_%7%FNW=xO&s(Ix7Q*vN7RsI+Jv zp{3NjJzPDG8eUM}qs8koaLgF3XPYjx>y0#Mbjy>K}^-R@|6*4F{2Bh|h7tB_NX J`hIN<(SOLdZlC}F literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/wlkfig3.bmp b/modules/windows/oodialog/bmp/wlkfig3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ac8bb3c4c55cc9f27af4c1addc20522b6440938f GIT binary patch literal 9718 zcmeH~JCf8$5Qb}Fi0CzX=!oqTU=YCx_5f?F$9*v8C>R@@qiqaq3=V;XgE9MOJ+ksC zsTkH938_o<`1I$iH2nSk$JG@eUCLKn`gkk_|H|WI z`@tQ}a=YEi?c1$<|NNOa(VapW9QPk+PCFmAi z0VR~f^CtLonj9V$4LOtBVtl@bIdXKgd8ulQ(e~SiHaKdrc+i{<7#uq|6$=8t+ssCP z!tskmkD=f(=7=R>v)p^q&~qyHckSG=sA0=p1nRHEU^{m?ZKjhnIEVFg)KhGBc0F%MCzYddOijv6-g$QN?{K;of@ z@vLgr6fvR49L=+IT!o%vhD|+F0aPi@0mCNdd3qAFo}ovXr8q|-c0|tsM`xHsPtR1& z4sJ|0YqKM2; zFvpo~^yHvzjPbJ)uim+Xah$|MdzgU39ultJ#W)T&TLw+TW*_1?yYqOR%H>S^b_@Sl zv5)b39!&ulrWsDWw2M*wk~`VuuxPa!o^5AyaH z#_B0opdaSkbrFHR9N6R+l4FL2Y57*K@Ig^g3r(s^>w0N;#`%$I1MIOqy08 zw=hq1U`Xq0{-I>_XJ3aDs6I578cwTr87Xd84j{BY;WfrE!>Rs>^}rD1XVcQ6IxTf} zwKuT_nbWAXs+N3HFXf;WJwgk8Riqs4XBb4b+v@77YLuF9piNPXT|E*}J|lk9JC0&G z-S!}#NmKVvK(U_mx(kr9AgNgKn9{MGY_mB&#j=KBqwBeD{?4eyuXcsz-qCKk;Jp^JcXzgQS zJ%ksE4q!5lP_*wGa%w&cMG8&0+t7s1o70X$_VmuSt9(Z|Nkxl& zvIghEZ`V5wc;_YW>gCD9IvK&s{J4OI44p=x!w9#IP8^CV@+Y*w^uk6 zX;EEJf`g()mydYsaU*pV-G&o;(^$kaI)*td%<#atW-%nk4|+vtGW?O}&GeyQqloTlE2$;@Gv=aA3b!Sl05#Bro- RvFMLEm@p-Y*?F^+{{Sv^ZHoW^ literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/wlkfig4.bmp b/modules/windows/oodialog/bmp/wlkfig4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b5801600b76242251293307f2905a595c9df6e75 GIT binary patch literal 9718 zcmeI0J#rK=5QTedsagV?tzu3!Y_(1ychpo z@&(I676;bDQ?8G->-E$hEO6;)dJ#1hr_&Na?^hjrjy79yE=VnBMem}?40;%6Hf0^> zcsLd+ilPZx!2v`*MRzS42Em!jQqm^rj4H~QBe(4CYVVG7qCC2_Fg;r1ogI!&BQ?)h zz*^-M&f(Xa0=CKJteZ7-pQ!ynw4^A{W}3IV-2-bF?!(jvh?xndwodj!QN#__KOiK1X-t z!^8B&(S94qE_|QFVp$ve1n&;DtEn$po!(p&2)RlSDKAz5hn$n zphiB7pz{C}aZ=!Ex}BhAx&eX9LF*-d#2s;nTZ*zsQZPdDhr}BwVmYD=rh6{qc2v(3 zQ$5@!mxJaphcU?;L<^W)-pqj>jTYxmE=QPH4?0VvkUyN$DUU+TfHRpp9PpG!J2=yv zJLl<)E6!>^R$Lpz3lMYX7J5X{026RX6<}>~IVsxAAtYVtPF57pDwr2xe2o^DRnY+C z`9r-sqG;>9k~?W_sXL-+0CM$s?nunyi8&l`NB14|Ch3U5&78wX?OXjSeY zYFjwS9rH)ZriSYyhx&OX4SByQvS%DIha=!?af$CI4^N-&YvYUBMu~GO(@J0 z2ui~yyx{o=`j*w>M(Y^Ni#aTW*Ek>L$bLC$gU&_%7%FNW=xO&s(Ix7Q*vN7RsI+Jv zp{3NjJzPDG8eUM}qs8koaLgF3XPYjx>y0#Mbjy>K}^-R@|6*4F{2Bh|h7tB_NX J`hIN<(SOLdZlC}F literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/wlkfig5.bmp b/modules/windows/oodialog/bmp/wlkfig5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7db68cb434cc8eff85b9871bb7b9471f3fc44d17 GIT binary patch literal 9718 zcmeHKJCf8e5bdp{Y6xbSDtrP0syG1$ARyyDgmaV)D9$l40WkrG*ob6<;dRTcZ?|Oc zz}6Pn9$QjddU|@@EqgwE`t_FNc>jXv9cmwOea3Y|FU5X-L-hR>(GOhZaU#NxPNz`d zjw+qcXFC5p)BU%vbpLRnFL!sabH|JP=yKs2E}U%Qn;a)#p@P0r;Ew8sx9PXV3(`W8 z1Nrbb^J8hg?gj_5Ee^9kk!e zZ7JI2;M6KQabtvYo5rSEgEGdsxy1?23SvNrX~>6x`fFc=qkKFbYJXBb3l_GB4+}jw zMmVC+v*AM=J&PRQUl#?KtM%FV40PW7)lI>FJ$}X;$FletC+Yxa&i9Rv{W{S7aMS0% z(kHt8%KXx8Y{3^HHxFgo5tjku{!d{gYCd9P-C8<6 zPODGQ3@i;8A4mA;zZ@=S%}jMV|C=y79DkhjL_D!JlO-~1XR;Jgi5HU2SskapkCSm> zP9b&>Qd#TbS*yijS(p(d_`4I92Shw~$-Gx(cWCmc~x- z9IM(MOZXrNIMe?SpII|=VkZtOeL`-j4{d=g_>Q-Dd966Gm^fB$MUE?QI8M?Tq9yZ@D_4wwywZQTu=+qlQdg_Q}PLKiD+Aalk>@QOYAFf;@t9{2=DZ0TY=N^iQam2 z{LJ4x>Md^vGUG7gQ{?(eeReTcFni@KCoRmp*yU>QcL#zn#(Y0Df;pZ#|L^ zzI*t)EV5a*Kku^n@e!22%`Ct0Mq=ADJ(4mVZ@D;0kE-U#?C{AwmTBXv zd2~EJ04jLQEf>besdNdf*5jB8`7kaYJZKo%F%n)w{R5_7c1ST^2GN-o+05@)^<0}f86jIxn3@LY<6X_Y}N0~7fJWzB8bSY$qO zCSnk6?EgGH93HEDXnH+!F-KtPDiF|=x$~RwfPu@lyI2%~UW~(7cwb!2hjHe^ zTADe54rt3+3w}_d)$Ocfi&Bg&N0u#}!+;QzK5t7K$M8Mlw8Nvtf7oz}W2_3%Z?PP7 A@&Et; literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/wlkfig6.bmp b/modules/windows/oodialog/bmp/wlkfig6.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9fa965265d6bc9067502c06fe51cce60ea609149 GIT binary patch literal 9718 zcmeH}J(3eK5QW=is!U+xD&_dVpZjC&emz(hOYB|E9HOS{&;!W5*|e4;BbOQ#so^Zm*7p@@&e6k`+XXb^ zI8*md{~%|-+wW|WfEM*&Bmsk$K@tpdT-u?fN2gm9Fsx}-5^8G0$*W^hzLFj&%02kh zZT>p@j-Il5n%4FxULMnOq8n;;(W5lZNke+7z-p4gxsx6-T2>c-q^H)x-&#G}jJ7y_ zU`(v*rmj8;fdvy)p!_7&w+SlGSt8`mFlYL>4Dkm)z1|JO%4#1J28Xo zS*1aLu{fxp${kVThh^%4(KB~KJ+Wu5pcQ&bt`M${MYnB^b|+*n>^by~a?D(D20f6e z2NfjMQ}$Kp8{`x{+MQ87I$Okhjdy=kIHX5akJL`;8{>#OsOwle;+O+6eKz#SejDOw zJ@MRmCVJ$o7KKA`$=Q>ur#LpmDXSw}TtB6vhB$LQk}Y?~+j%c~LbmkjxJgg0=BMg` z&AhknrKeKeOj;qITsE6rsW{P@I`96mf=$!R29X-58@n`|lR3+$9IRYxO5fQvYh}9*nG!CgRo`uTMcc9 oQ)V~QnhqZ8$SIh%WpW%+JG=Ba9D`KmSS^=>!6iIvX5B~h4~pq#NdN!< literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/wlkfig7.bmp b/modules/windows/oodialog/bmp/wlkfig7.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6dbcf3cde9e56f56619b71defe044236512a01af GIT binary patch literal 9718 zcmeI0JB}PT5QaIBfOW8=1+*t{V8AEP0URjPeH89dHV}M{i5)n0;6o^KqG0_O$$A(2 zv4FDe(R8!P;>W*!K6ao#zWn!F>({6Et^JPDXMDfnduhM)`rEIq{r#b}fAIC!Q)~Fw zo}R`7cNE+0c5AnPZ|(bEf41*GUfQ?kXVg>ROaIqiUZ{jGK2$}wem#MO0%H3EcNE`v zZ~ncl7i^2ZIj|po=KeUkU+?lo0_DohRZVN5R{BdJ1k|sABb`m5?igx4$Mn`>=uy8~ zj&^mW*pVAuz2R_sc)D9Mf!y8p$QoNX1z#1v`v}a%c0@#!(tg!imlFZhA|x zUEak|YSZA@T2j#A-6cgLbit9~QvrG^kl`R;d=^SNk}&vWN!n?KASj8@3Z%6FNeqWv zHaSysPEI)*B6X=CgC&rJYRFoU#*k{~l5!5{5f7(}h9sOj2|A)jVi;vOb1v3K`?R#D zU56;|CZ-W_ap*b(hxNoD8F(GxID2{&lTvq_Jw2M1xXe;5M-xk7BV6^Q0MFsXQrP5h zdrHfk8wlMPk3bt~1{b$1Xlt_YpMpAQg<#M=jhTW$4&?48>(d zl2;$4M`w4a1`DBUo^cC380`8m6xDjL9D6%rkW{2l%HkA{ROoS9k~c(94ixpg^K8N1 z;mPn&MrH+pb2nB7y7-UvrAn#ej2_Gfg z;H7A{Yeux~$f-D$L&b1jQ5BH>rtYj|B37L2&|X$6PMEWDu>HJ<-gnttI|ndzUL7Q> z=m=)TLH#_J4^bBW^wjC-pv(KPdOI4o>d*B*n=^76cOG-=xzJ-z!b2XF9G)vVdwLX! zTS}^$s{I85&Ved=po^BMrmG?`TYtkUj;v%keNZzTTPBt{`uoD}G5p#fU1vDyJfxK1 z4Si2>rWZO}AITf4U1IV+?cx2#?f~+UG;U$GIOsPVBI=emH1kO+b#fQa-a4ma96-kk z8Vhc5-`6w6(NCELuV0$m7>8LrPlrjTWM#p literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/bmp/wlkfig8.bmp b/modules/windows/oodialog/bmp/wlkfig8.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9fa965265d6bc9067502c06fe51cce60ea609149 GIT binary patch literal 9718 zcmeH}J(3eK5QW=is!U+xD&_dVpZjC&emz(hOYB|E9HOS{&;!W5*|e4;BbOQ#so^Zm*7p@@&e6k`+XXb^ zI8*md{~%|-+wW|WfEM*&Bmsk$K@tpdT-u?fN2gm9Fsx}-5^8G0$*W^hzLFj&%02kh zZT>p@j-Il5n%4FxULMnOq8n;;(W5lZNke+7z-p4gxsx6-T2>c-q^H)x-&#G}jJ7y_ zU`(v*rmj8;fdvy)p!_7&w+SlGSt8`mFlYL>4Dkm)z1|JO%4#1J28Xo zS*1aLu{fxp${kVThh^%4(KB~KJ+Wu5pcQ&bt`M${MYnB^b|+*n>^by~a?D(D20f6e z2NfjMQ}$Kp8{`x{+MQ87I$Okhjdy=kIHX5akJL`;8{>#OsOwle;+O+6eKz#SejDOw zJ@MRmCVJ$o7KKA`$=Q>ur#LpmDXSw}TtB6vhB$LQk}Y?~+j%c~LbmkjxJgg0=BMg` z&AhknrKeKeOj;qITsE6rsW{P@I`96mf=$!R29X-58@n`|lR3+$9IRYxO5fQvYh}9*nG!CgRo`uTMcc9 oQ)V~QnhqZ8$SIh%WpW%+JG=Ba9D`KmSS^=>!6iIvX5B~h4~pq#NdN!< literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/calculator.rex b/modules/windows/oodialog/calculator.rex new file mode 100755 index 0000000..83a4851 --- /dev/null +++ b/modules/windows/oodialog/calculator.rex @@ -0,0 +1,299 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: calculator.rex */ +/* Type: ooRexx Script */ +/* Resource: CALCULATOR */ +/* */ +/* Description: */ +/* Sample that demonstrates the usage of RxMath and ooDialog */ +/* */ +/****************************************************************************/ + +/* Find our installation directory */ + +j = locate() + +/* create the dialog */ +calcDlg = .Calculator~new + +/* Set the defaults for arithmetic operations (optional) */ +NUMERIC DIGITS 16 /* precision can be up to 16 digits for RxMath */ +NUMERIC FORM SCIENTIFIC /* controls exponential notation */ +NUMERIC FUZZ 0 /* number of digits ignored for numeric comparison */ + +/* Display the dialog */ +if calcDlg~initCode = 0 then do + rc = calcDlg~execute("SHOWTOP") +end + +exit /* leave program */ + +::requires "ooDialog.cls" + +/* This requires loads the RxMath functions. */ +::requires "rxmath" library + +/* The Calculator dialog class */ +::class 'Calculator' subclass UserDialog + +::method init + forward class (super) continue /* call parent constructor */ + InitRet = Result + + if self~load(.application~srcDir"rc\CALCULATOR.RC", ) \= 0 then do + self~initCode = 1 + return 1 + end + + /* Connect dialog control items to class methods */ + self~connectButtonEvent("BNO1", "CLICKED", "BNO1") + self~connectButtonEvent("BNO2", "CLICKED", "BNO2") + self~connectButtonEvent("BNO3", "CLICKED", "BNO3") + self~connectButtonEvent("BNO4", "CLICKED", "BNO4") + self~connectButtonEvent("BNO5", "CLICKED", "BNO5") + self~connectButtonEvent("BNO6", "CLICKED", "BNO6") + self~connectButtonEvent("BNO7", "CLICKED", "BNO7") + self~connectButtonEvent("BNO8", "CLICKED", "BNO8") + self~connectButtonEvent("BNO9", "CLICKED", "BNO9") + self~connectButtonEvent("BNO0", "CLICKED", "BNO0") + self~connectButtonEvent("BSIGN", "CLICKED", "BSIGN") + self~connectButtonEvent("BPOINT", "CLICKED", "BPOINT") + self~connectButtonEvent("BDIVIDE", "CLICKED", "BDIVIDE") + self~connectButtonEvent("BTIMES", "CLICKED", "BTIMES") + self~connectButtonEvent("BMINUS", "CLICKED", "BMINUS") + self~connectButtonEvent("BPLUS", "CLICKED", "BPLUS") + self~connectButtonEvent("BSQRT", "CLICKED", "BSQRT") + self~connectButtonEvent("BLOG", "CLICKED", "BLOG") + self~connectButtonEvent("BLOG10", "CLICKED", "BLOG10") + self~connectButtonEvent("BPI", "CLICKED", "BPI") + self~connectButtonEvent("BBACKSPACE", "CLICKED", "BBACKSPACE") + self~connectButtonEvent("BCLEAR", "CLICKED", "BCLEAR") + self~connectButtonEvent("BCALC", "CLICKED", "BCALC") + self~connectButtonEvent("BSINUS", "CLICKED", "BSINUS") + self~connectButtonEvent("BCOSINUS", "CLICKED", "BCOSINUS") + self~connectButtonEvent("BTANGENS", "CLICKED", "BTANGENS") + self~connectButtonEvent("BARCSIN", "CLICKED", "BARCSIN") + self~connectButtonEvent("BARCCOS", "CLICKED", "BARCCOS") + self~connectButtonEvent("BARCTAN", "CLICKED", "BARCTAN") + + /* Initial values that are assigned to the object attributes */ + self~TLine= '0' /* set text-line to 0 initially */ + + /* Add your initialization code here */ + return InitRet + +::method initDialog + expose tl + tl = self~newEdit(TLine) /* get the EditControl object */ + +::method getLine + /* Return the current text-line content, */ + /* or 0 if infinity has been reached. */ + + expose tl + if tl~getText~Left(5) = 'ERROR' then + return 0 + return tl~getText + +::method setLine + /* Set the argument as new text-line. If this is ERROR raise an */ + /* errorDialog with additional information. */ + + expose tl + use arg line, merror + if line~left(5) = 'ERROR' then + call errorDialog "RxCalc returned an error:" merror + tl~setText(line) + +::method justZero + /* Return true if the current text-line is only one 0. */ + /* Most functions will then ignore the current text-line */ + + line = self~getLine + if line~Length = 1 & line = 0 then + return 1 + return 0 + +::method getCheckedLine + /* Return the result of the current calculation or the line */ + /* if it is only a number. DataType will not return NUM */ + /* if any operators are present. */ + + line = self~getLine + if DataType(line) = 'NUM' then + return line + else do + interpret 'calcResult =' line + return calcResult + end + +/* --------------------- message handler -----------------------------------*/ + +::method UNKNOWN + /* The UNKNOWN-method is called, whenever the defined message for a */ + /* button cannot be found. This is a good way to roll all the methods for */ + /* the 10 digits into one. The last character of the argument is the */ + /* number that was pressed. */ + + use arg message + number = message~SubStr(4) + if self~justZero then + self~setLine(number) + else self~setLine(self~getLine||number) + +::method BSIGN + /* Toggles the sign of the leading number on the text line. */ + + if self~justZero then + self~setLine('-') + else do + select + when left(self~getLine,1)='-' then + self~setLine('+'||substr(self~getLine,2)) + when left(self~getLine,1)='+' then + self~setLine('-'||substr(self~getLine,2)) + otherwise + self~setLine('-'||self~getLine) + end + end + +::method BPOINT + /* Append a point.. */ + self~setLine(self~getLine||'.') + +::method BDIVIDE + /* Appends a 'divide' symbol to the checked line. */ + self~setLine(self~GetCheckedLine||'/') + +::method BTIMES + /* Append a 'multiply' symbol to the checked line. */ + self~setLine(self~GetCheckedLine||'*') + +::method BMINUS + /* Appends a 'minus' symbol to the checked line. */ + self~setLine(self~GetCheckedLine||'-') + +::method BPLUS + /* Appends a 'plus' symbol to the checked line. */ + self~setLine(self~GetCheckedLine||'+') + +::method BSQRT + /* Displays the square root of the checked line. */ + /* MATHERRNO is filled with additional information if the */ + /* RxMath-funtion detects an error. */ + self~setLine(RxCalcSqrt(self~GetCheckedLine), MATHERRNO) + +::method BLOG + /* Displays the natural logarithm of the checked line */ + self~setLine(RxCalcLog(self~GetCheckedLine), MATHERRNO) + +::method BLOG10 + /* Displays the 10-base logarithm of the checked line */ + self~setLine(RxCalcLog10(self~GetCheckedLine), MATHERRNO) + +::method BPI + /* Displays the number Pi */ + if self~justZero then + self~setLine(RxCalcPi(), MATHERRNO) + else self~setLine(self~getLine||RxCalcPi(), MATHERRNO) + +::method BBACKSPACE + /* Delete the last character of the line */ + line = self~getLine + line = line~Left(line~Length - 1) + if line = '' then /* if the line is empty set it to 0 */ + self~setLine(0) + else self~setLine(line) + +::method BCLEAR + /* Set the line to 0 */ + self~setLine(0) + +::method BCALC + /* Interpret the current line = calculate the result */ + interpret 'calcResult =' self~getLine + self~setLine(calcResult) + +::method BSINUS + /* Display the sine of the checked line */ + self~setLine(RxCalcSin(self~getCheckedLine), MATHERRNO) + +::method BCOSINUS + /* Display the cosine of the checked line */ + self~setLine(RxCalcCos(self~GetCheckedLine), MATHERRNO) + +::method BTANGENS + /* Display the tangent of the checked line */ + self~setLine(RxCalcTan(self~GetCheckedLine), MATHERRNO) + +::method BARCSIN + /* Display the arc sine of the checked line */ + self~setLine(RxCalcArcSin(self~GetCheckedLine), MATHERRNO) + +::method BARCCOS + /* Display the arc cosine of the checked line */ + self~setLine(RxCalcArcCos(self~GetCheckedLine), MATHERRNO) + +::method BARCTAN + /* Display the arc tangent of the checked line */ + self~setLine(RxCalcArcTan(self~GetCheckedLine), MATHERRNO) + +::method Ok + /* + This is the method connected to our exit-button. You don't have to implement it, + ooDialog supplies a default implementation of the ok method. Note that the ok + method is always connected to the button with resource ID 1. Note also, that + once you invoke the superclass ok method, if validate() returns true, the dialog + will close. + + This is what the default implementation of ok does: it invokes the validate() + method. If validate() returns false, then ok() does nothing and just returns. + If validate() returns true then ok() sets self~initCode to 1 and ends the + dialog. To end a dialog programatically, the superclass ok or cancel + methods should always be used. + + This over-ride sets the calculator display to 0 before ending the dialog. Again, + this is not necessary, it is just done to demonstrate how to over-ride the ok + method + */ + if \ self~validate then return 0 + + self~setLine(0) + + return self~ok:super diff --git a/modules/windows/oodialog/controls/ComboBox/comboBoxTypes.h b/modules/windows/oodialog/controls/ComboBox/comboBoxTypes.h new file mode 100644 index 0000000..d943763 --- /dev/null +++ b/modules/windows/oodialog/controls/ComboBox/comboBoxTypes.h @@ -0,0 +1,51 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_COMBOBOX_TYPES 100 +#define IDC_GB_SCHEME 1000 +#define IDC_CB_SIMPLE 1001 +#define IDC_CB_DROPDOWN 1003 +#define IDC_PB_DROP 1004 +#define IDC_CB_DROPDOWNLIST 1005 +#define IDC_PB_CLOSE 1007 +#define IDC_RB_NONE 1009 +#define IDC_RB_RAINBOW 1011 +#define IDC_RB_TEXTONLY 1014 +#define IDC_RB_FIREBRICK 1015 diff --git a/modules/windows/oodialog/controls/ComboBox/comboBoxTypes.rc b/modules/windows/oodialog/controls/ComboBox/comboBoxTypes.rc new file mode 100644 index 0000000..285270e --- /dev/null +++ b/modules/windows/oodialog/controls/ComboBox/comboBoxTypes.rc @@ -0,0 +1,63 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#include +#include +#include +#include "comboBoxTypes.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_COMBOBOX_TYPES DIALOGEX 0, 0, 289, 169 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP +CAPTION "Combo Box Types" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + CONTROL "Simple", IDC_STATIC, WC_STATIC, SS_CENTER, 10, 10, 69, 11 + CONTROL "Drop-down", IDC_STATIC, WC_STATIC, SS_CENTER, 110, 10, 69, 11 + CONTROL "Drop-down list", IDC_STATIC, WC_STATIC, SS_CENTER, 210, 10, 69, 11 + CONTROL "", IDC_CB_SIMPLE, WC_COMBOBOX, WS_TABSTOP | CBS_SIMPLE | CBS_HASSTRINGS, 12, 29, 69, 71 + CONTROL "", IDC_CB_DROPDOWN, WC_COMBOBOX, WS_TABSTOP | CBS_DROPDOWN | CBS_HASSTRINGS, 110, 29, 69, 71 + CONTROL "", IDC_CB_DROPDOWNLIST, WC_COMBOBOX, WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS, 210, 29, 69, 71 + CONTROL "Color Scheme", IDC_GB_SCHEME, WC_BUTTON, WS_GROUP | BS_GROUPBOX, 10, 107, 214, 52 + CONTROL "None (default appearance)", IDC_RB_NONE, WC_BUTTON, WS_TABSTOP | BS_AUTORADIOBUTTON, 17, 123, 100, 8 + CONTROL "Rainbow (Bk and Fg)", IDC_RB_RAINBOW, WC_BUTTON, BS_AUTORADIOBUTTON, 17, 140, 100, 8 + CONTROL "Rainbow (text only)", IDC_RB_TEXTONLY, WC_BUTTON, BS_AUTORADIOBUTTON, 136, 123, 82, 8 + CONTROL "Firebrick Red", IDC_RB_FIREBRICK, WC_BUTTON, BS_AUTORADIOBUTTON, 136, 140, 82, 8 + CONTROL "Drop Down", IDC_PB_DROP, WC_BUTTON, WS_TABSTOP | BS_PUSHBUTTON, 229, 107, 50, 14 + CONTROL "Close Up", IDC_PB_CLOSE, WC_BUTTON, WS_TABSTOP | BS_PUSHBUTTON, 229, 126, 50, 14 + CONTROL "Done", IDOK, WC_BUTTON, WS_TABSTOP | BS_DEFPUSHBUTTON, 229, 145, 50, 14 +} diff --git a/modules/windows/oodialog/controls/ComboBox/comboBoxTypes.rex b/modules/windows/oodialog/controls/ComboBox/comboBoxTypes.rex new file mode 100755 index 0000000..30b7940 --- /dev/null +++ b/modules/windows/oodialog/controls/ComboBox/comboBoxTypes.rex @@ -0,0 +1,194 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * There are 3 types of combo boxes: simple, drop down, and drop down list. + * This example shows a dialog with 3 combo boxes, one of each kind. It is + * mostly meant to show the difference in the 3 types to allow an ooDialog + * programmer to pick the type to use for a program. + * + * One thing about combo boxes is that a combo box is not a single control. It + * is a mix of several controls, an edit control and a listbox and a button. + * Because of this, the normal setColor() method does not work well for the + * programmer that wants to set the color of dialog controls. For the combo + * box, ooDialog provides the setFullColor() method which sets the color for + * the entire combo box. This example also demonstrates that method, along + * with the removeFullColor() method. + */ + + sd = locate() + .application~setDefaults('O', sd'comboBoxTypes.h', .false) + + dlg = .ComboBoxTypes~new(sd"comboBoxTypes.rc", IDD_COMBOBOX_TYPES) + + if dlg~initCode = 0 then do + dlg~execute("SHOWTOP") + end + else do + say "Problem creating the dialog. Init code:" dlg~initCode + return 99 + end + + return 0 +-- End of entry point. + +::requires "ooDialog.cls" + +::class 'ComboBoxTypes' subclass RcDialog + +-- Normally an init() method for a RcDialog subclass is not used, it is really +-- not needed. Here though it is used to do some set up stuff. Everything done +-- here could just as well have been done in initDialog() +::method init + expose mediumSpringGreen gold midnightBlue fireBrickRed colors animals fruits + + forward class (super) continue + + -- The setFullColor() method takes a COLORREF as input. Be sure to use the + -- colorRef() class method of the .Image class to properly construct a + -- COLORREF from the RGB values. + -- + -- Create the color values to be used by the setFullColor() + mediumSpringGreen = .Image~colorRef(0, 238, 118) + gold = .Image~colorRef(255, 215, 0) + midnightBlue = .Image~colorRef(47, 47, 79) + fireBrickRed = .Image~colorRef(205, 38, 38) + + -- Connect the button clicks + self~connectButtonEvent(IDC_PB_DROP, 'CLICKED', onDrop, sync) + self~connectButtonEvent(IDC_PB_CLOSE, 'CLICKED', onClose, sync) + + self~connectButtonEvent(IDC_RB_NONE, 'CLICKED', onSchemeChange, .true) + self~connectButtonEvent(IDC_RB_RAINBOW, 'CLICKED', onSchemeChange, .false) + self~connectButtonEvent(IDC_RB_TEXTONLY, 'CLICKED', onSchemeChange, sync) + self~connectButtonEvent(IDC_RB_FIREBRICK, 'CLICKED', onSchemeChange, .true) + + -- Create arrays of the items to be inserted into each combo box. + colors = .array~of("Green", "Blue", "Yellow", "Orange", "Red", "Pink") + animals = .array~of("Horse", "Cow", "Dog", "Pig", "Cat", "Sheep") + fruits = .array~of("Apple", "Peach", "Pear", "Cherry", "Raspberry", "Banna") + + +-- Typical initDialog() method. We just populate the combo boxes and check the +-- radio button that matches how we start up, no colors set for the combo boxes. +::method initDialog + expose cbSimple cbDropDown cbDropDownList colors animals fruits + + cbSimple = self~getComboBox(IDC_CB_SIMPLE) + do c over colors + cbSimple~add(c) + end + cbSimple~selectIndex(1) + + cbDropDown = self~getComboBox(IDC_CB_DROPDOWN) + do a over animals + cbDropDown~add(a) + end + cbDropDown~selectIndex(1) + + cbDropDownList = self~getComboBox(IDC_CB_DROPDOWNLIST) + do f over fruits + cbDropDownList~add(f) + end + cbDropDownList~selectIndex(1) + + self~newRadioButton(IDC_RB_NONE)~check + + +-- This is the event handler for the radio buttons that select the color scheme. +-- We just check which radio button was clicked and do the appropriate thing. +-- Note that we can set the color for the combo boxes back to their default by +-- using the removeColor() method. +::method onSchemeChange unguarded + expose mediumSpringGreen gold midnightBlue fireBrickRed cbSimple cbDropDown cbDropDownList + use arg id + + select + when id == .constDir[IDC_RB_NONE] then do + cbSimple~removeFullColor + cbDropDown~removeFullColor + cbDropDownList~removeFullColor + end + + when id == .constDir[IDC_RB_RAINBOW] then do + cbSimple~setFullColor(midnightBlue, gold) + cbDropDown~setFullColor(mediumSpringGreen, fireBrickRed) + cbDropDownList~setFullColor(fireBrickRed, gold) + end + + when id == .constDir[IDC_RB_TEXTONLY] then do + cbSimple~setFullColor( , gold) + cbDropDown~setFullColor( , mediumSpringGreen) + cbDropDownList~setFullColor( , fireBrickRed) + end + + when id == .constDir[IDC_RB_FIREBRICK] then do + cbSimple~setFullColor(fireBrickRed, gold) + cbDropDown~setFullColor(fireBrickRed, gold) + cbDropDownList~setFullColor(fireBrickRed, gold) + end + + otherwise nop + end + -- End select + + self~redraw + return 0 + + +-- This is the event handler for the Close Up push button. It is meant to close +-- the opened combo boxes. The reality is, as soon as a combo box loses the +-- focus it closes up. The act of pushing the Close button will close the +-- opened combo box with out any further action. +::method onClose + expose cbDropDown cbDropDownList + + cbDropDown~closeDropDown + cbDropDownList~closedropDown + return 0 + +-- This is the event handler for th Drop Down push button. It is meant to drop +-- down both combo boxes. The reality is, as soon as a combo box loses the +-- focus it closes up. Since only 1 dialog at a time can have the focuse, you +-- can only have one combo box dropped down at any time. Only the drop down +-- list combo box will remain open after the user pushes the button. +::method onDrop + expose cbDropDown cbDropDownList + + cbDropDown~openDropDown + cbDropDownList~openDropDown + return 0 diff --git a/modules/windows/oodialog/controls/ListBox/incrementalSearch.rex b/modules/windows/oodialog/controls/ListBox/incrementalSearch.rex new file mode 100755 index 0000000..c0f4b1a --- /dev/null +++ b/modules/windows/oodialog/controls/ListBox/incrementalSearch.rex @@ -0,0 +1,257 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +/** + * An example of a custom implmentation of an incremental search in a ListBox. + * + * The list box has its own function that does an incremental search of the + * items in the list box. When a character is typed, the list box: + * + * "Moves the selection to the first item that begins with the character the + * user typed. Multiple characters typed within a short interval are treated as + * a group, and the first item that begins with that series of characters is + * selected." + * + * One common problem is that the "short interval" is too short. + * + * This example makes that short interval longer. It also adds some custom + * features. The user can reset the search by typing the Del key. The user + * can also back up the search by one character by using the BackSpace key. + * + * We use a UserDialog here, although really an ResDialog or an RcDialog is + * much better. + */ + + symbolMap = .table~new + symbolMap[IDC_LB_FILEs] = 200 + symbolMap[IDC_ST_SEARCHSTR] = 210 + + .application~setDefaults('O', symbolMap, .false, 'Courier New', 10) + + dlg = .SimpleDialog~new + if dlg~initCode = 0 then do + if dlg~execute("SHOWTOP") == dlg~IDOK then do + say 'User searched for and found:' dlg~searchAndFound + end + else do + say 'User canceled' + end + end + +return 0 +-- End of entry point. + +::requires "ooDialog.cls" + +::class 'SimpleDialog' subclass UserDialog + +::constant expiration 7 -- Time between keystrokes before the search string is + -- reset. If the user does not type any keys within + -- this amount of time, in seconds, the search string + -- is set back to blank. + +::attribute searchAndFound get + expose selectedText + return selectedText + +::method init + expose selectedText searchStr curIndex timer + + forward class (super) continue + self~create(30, 30, 186, 124, "Directory Listing with Search", "CENTER") + + selectedText = '' + searchStr = '' + curIndex = 1 + timer = .nil + +::method defineDialog + + self~createListBox(IDC_LB_FILES, 10, 10, 166, 90, 'VSCROLL HSCROLL PARTIAL SORT NOTIFY') + self~createStaticText(IDC_ST_SEARCHSTR, 10, 102, 64, 11, , '') + self~createPushButton(IDCANCEL, 74, 105, 50, 14, ,"Cancel") + self~createPushButton(IDOK, 126, 105, 50, 14, 'DEFAUT', "Ok") + +::method initDialog + expose lb stSearchStr + + lb = self~newListBox(IDC_LB_FILES) + lb~addDirectory("C:\Windows\System32\*", "READWRITE READONLY HIDDEN SYSTEM DIRECTORY ARCHIVE") + + lb~connectCharEvent + stSearchStr = self~newStatic(IDC_ST_SEARCHSTR) + + self~setHorizontalExtent(lb) + +::method onChar unguarded + expose searchStr curIndex + use arg char, isShift, isCtrl, isAlt, misc, lBox + + if self~isDel(char, isCtrl, misc) then do + self~resetSearch + return .true + end + + if self~isBkSpc(char, isCtrl, misc) then do + len = searchStr~length + if len > 0 then searchStr = searchStr~substr(1, searchStr~length - 1) + curIndex = 1 + end + else do + if isShift | isCtrl | isAlt | (misc~pos('extended') <> 0) then return .true + searchStr ||= char~d2c + end + + self~incrementalSearch(lBox) + return .false + +::method incrementalSearch private unguarded + expose searchStr curIndex + use strict arg lBox + + self~setStatusBar + self~resetTimer + + newIndex = lBox~find(searchStr, curIndex) + if newIndex <> curIndex then do + if newIndex == 0 then do + -- Setting the selected index to 0 has the effect of removing + -- the selection from all items. This gives the user the + -- hint that there is no next item with the current search + -- string. We leave the current index unchanged. + lBox~selectIndex(0) + end + else do + len = searchStr~length + prefix = lBox~getText(curIndex)~left(len) + newPrefix = lBox~getText(newIndex)~left(len) + + -- Only move if the new item is a better match then the + -- current item. In other words if the prefixes match, + -- don't do anything + if prefix \== newPrefix then do + lBox~selectIndex(newIndex) + lBox~makeFirstVisible(newIndex) + curIndex = newIndex + end + end + end + +-- When this method is invoked, the user has not typed a key for whatever +-- the timer period is, we abandon the search string. +::method expired unguarded + expose searchStr curIndex timer stSearchStr + searchStr = '' + curIndex = 1 + timer = .nil + self~setStatusBar + +-- Set the timer to the expiration time. Be sure to cancel the +-- existing timer if it exists or we will get a goofy thing going. +::method resetTimer private unguarded + expose timer + + reply 0 + + if timer \== .nil then timer~cancel + + waitPeriod = .TimeSpan~fromSeconds(self~expiration) + msgObj = .Message~new(self, 'expired') + timer = .Alarm~new(waitPeriod, msgObj) + +-- Reset the incremental search +::method resetSearch private unguarded + expose searchStr curIndex timer stSearchStr + + if timer \== .nil then timer~cancel + + searchStr = '' + curIndex = 1 + timer = .nil + self~setStatusBar + +-- Test for a Backspace keypress +::method isBkSpc private unguarded + use strict arg char, isCtrl, misc + + if char == .VK~back then return .true + return .false + +-- Test for a Del keypress +::method isDel private unguarded + use strict arg char, isCtrl, misc + + if \ isCtrl & misc~pos('extended') <> 0 & char == .VK~delete then return .true + return .false + +-- Show the search string under the list box. There is a StatuBar control +-- that is a possible future enhancement to ooDialog. That is where I would +-- really like to display this. +::method setStatusBar private unguarded + expose stSearchStr searchStr + stSearchStr~setText(searchStr) + +-- If the internal width of the list box is less than the width of an item, +-- not all of the item will be shown. By default the internal width of the +-- list box is 0. Here we measure the width of each string and set the internal +-- width of the list box to the width of the widest string, plus 4 for a margin. +::method setHorizontalExtent private + use strict arg lb + + max = 0 + do i = 1 to lb~items + s = lb~getTextSizePx(lb~getText(i)) + if s~width > max then max = s~width + end + lb~setWidthPx(max + 4) + +::method ok unguarded + expose lb selectedText timer + + -- Be sure to cancel the timer or the dialog won't close until it + -- does expire. + if timer \== .nil then timer~cancel + selectedText = lb~selected + return self~ok:super + +::method cancel unguarded + expose timer selectedText + + if timer \== .nil then timer~cancel + selectedText = '' + return self~cancel:super diff --git a/modules/windows/oodialog/controls/ListView/ReadMe.txt b/modules/windows/oodialog/controls/ListView/ReadMe.txt new file mode 100644 index 0000000..0b25511 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/ReadMe.txt @@ -0,0 +1,69 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2009-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + ReadMe + + 1. ooDialog - Dialog Control Example Programs + ----------------------------------------------- + + This directory contains example programs that demonstrate how to use the + list-view control in ooDialog. The examples range from simple to medium + complex. + + - columnClickListView.rex + + An example program that shows how to determine which row and which + column in a list view control the user has clicked on. + + - customDrawListView.rex + + Shows how to use a list-view with emphasis on custom draw. Custom + draw with a list-view allows you set the text color, background color, + and font for individuals list-view items. And when the list-view is + in report view, this can be done for individual subitems of each row. + + - columnIcons.rex + + This example shows how to use icons for all columns in a list-view, + how to use LvFullRow objects to populate a list-view, and how to use + the internal sorting feature of the ooDialog framework. In report + view, the columns can be drag and droppred to arrange the order. + Clicking on a column sorts the column. + + The subitem.editing subdirectory contains several examples of embedding + dialog controls within the list-view to allow in-place editing of the + subitems in report view. diff --git a/modules/windows/oodialog/controls/ListView/columnClickListView.rex b/modules/windows/oodialog/controls/ListView/columnClickListView.rex new file mode 100755 index 0000000..b9e61b7 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/columnClickListView.rex @@ -0,0 +1,98 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2010-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * A simple List View control using ooDialog. Demonstrates how to determine + * which column within a row the user has clicked on. + * + * Note that you must add the FULLROWSELECT extended style to the list view in + * order to get the correct row number. If the list view does not have this + * style, Windows only reports the row number if the text label in the left- + * most column is clicked on. + * + * Each time the user clicks on the list view control, the row and column + * clicked are reported. This is done using "say" so the program is best + * run from a command prompt window. + */ + + dlg = .SimpleLV~new + if dlg~initCode = 0 then do + -- Add a symbolic resource ID for the list view. + dlg~constDir[IDC_LISTVIEW] = 200 + + dlg~create(30, 30, 325, 200, "A Simple List View", "VISIBLE") + dlg~execute("SHOWTOP") + end + +-- End of entry point. + +::requires "ooDialog.cls" + +::class 'SimpleLV' subclass UserDialog + +::method defineDialog + + self~createListView(IDC_LISTVIEW, 10, 20, 305, 145, "REPORT SHOWSELALWAYS") + self~createPushButton(IDOK, 280, 175, 35, 15, "DEFAULT", "Close") + + self~connectListViewEvent(IDC_LISTVIEW, "CLICK", onClick, .true) + +::method initDialog + + -- Get a reference to the list view. + list = self~newListView(IDC_LISTVIEW) + + list~addExtendedStyle("FULLROWSELECT GRIDLINES CHECKBOXES HEADERDRAGDROP") + + list~insertColumn(0, "Row (Column 1)", 75) + list~insertColumn(1, "Column 2", 70) + list~insertColumn(2, "Column 3", 70) + + do i = 1 to 200 + list~addRow(i, , "Line" i, "Line / Col ("i", 2)", "Line / Col ("i", 3)") + end + +::method onClick + use arg id, itemIndex, columnIndex, keyState, nCode, listView + + -- Compensate for zero-based indexes ;-( + itemIndex += 1 + columnIndex += 1 + + say 'onClick() row:' itemIndex 'column:' columnIndex 'key state:' keyState 'lv:' listView + return 0 + diff --git a/modules/windows/oodialog/controls/ListView/columnIcons.rex b/modules/windows/oodialog/controls/ListView/columnIcons.rex new file mode 100755 index 0000000..d21d548 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/columnIcons.rex @@ -0,0 +1,223 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * This example shows how to add icons to the invidual columns of a list-view + * when it is in report view. + * + */ + + sd = locate() + .application~useGlobalConstDir('O', sd"rc\columnIcons.h") + + dlg = .ListViews~new(sd"rc\columnIcons.dll", IDD_DIALOG) + if dlg~initCode == 0 then do + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + end + else do + say 'Dialog failed to initialize, aborting.' + return 99 + end + + return 0 +-- End of entry point. + +::requires "ooDialog.cls" + +::class 'ListViews' subclass ResDialog + +::method initDialog + expose list itemColumns + + list = self~newListView(IDC_LV_VIEWS) + self~newRadioButton(IDC_RB_ICON)~check + + itemColumns = .array~of(-1, -1, -1, -1) + + self~connectEvents + self~setImageLists + self~populateList(list) + + +::method onReport + expose list + list~setView("REPORT") + return 0 + +::method onList + expose list + list~setView("LIST") + +::method onIcon + expose list + list~setView("ICON") + +::method onSmallIcon + expose list + list~setView("SMALLICON") + +::method onColClick unguarded + expose itemColumns + use arg id, colIndex, listView + + -- Adjust for 0-based indexes + i = colIndex + 1 + + d = .directory~new + d~column = colIndex + d~caseless = .false + + if itemColumns[i] == -1 then do + d~ascending = .true + itemColumns[i] = 0 + end + else if itemColumns[i] == 0 then do + d~ascending = .false + itemColumns[i] = 1 + end + else do + d~ascending = .true + itemColumns[i] = 0 + end + + listView~sortItems('InternalListViewSort', d) + return 0 + + +::method connectEvents private + + self~connectButtonEvent(IDC_RB_REPORT, "CLICKED", onReport, .true) + self~connectButtonEvent(IDC_RB_LIST, "CLICKED", onList, sync) + self~connectButtonEvent(IDC_RB_ICON, "CLICKED", onIcon) + self~connectButtonEvent(IDC_RB_SMALL_ICON, "CLICKED", onSmallIcon, .false) + self~connectListViewEvent(IDC_LV_VIEWS, "COLUMNCLICK", onColClick, .true) + self~connectListViewEvent(IDC_LV_VIEWS, "BEGINDRAG", defListDragHandler) + + +::method setImageLists private + expose list + + resourceImage = .ResourceImage~new(self) + smIcons = resourceImage~getImage(IDB_SMALL_ICONS) + normalIcons = resourceImage~getImage(IDB_NORMAL_ICONS) + + flags = .Image~toId(ILC_COLOR24) + imageList = .ImageList~create(.Size~new(16), flags, 28, 0) + imageList~add(smIcons) + + list~setImageList(imageList, SMALL) + + imageList = .ImageList~create(.Size~new(32), flags, 9, 0) + imageList~add(normalIcons) + + list~setImageList(imageList, NORMAL) + + +::method populateList private + use strict arg list + + list~InsertColumnPx(0, "Title", 150) + list~InsertColumnPx(1, "Name", 75) + list~InsertColumnPx(2, "Last", 100) + list~InsertColumnPx(3, "e-mail", 150) + + style = "FULLROWSELECT UNDERLINEHOT ONECLICKACTIVATE SUBITEMIMAGES HEADERDRAGDROP" + list~addExtendedStyle(style) + + lvItem = .LvItem~new(0, "Business manager", 6) + lvSub1 = .LvSubItem~new(0, 1, "Tom", 14) + lvSub2 = .LvSubItem~new(0, 2, "Sawyer", 26) + lvSub3 = .LvSubItem~new(0, 3, "ts@google.com", 11) + lvFullRow = .LvFullRow~new(lvItem, lvSub1, lvSub2, lvSub3, .true) + list~addFullRow(lvFullRow) + + lvItem = .LvItem~new(1, "Software Developer", 1) + lvSub1 = .LvSubItem~new(1, 1, "Sam", 14) + lvSub2 = .LvSubItem~new(1, 2, "Frank", 15) + lvSub3 = .LvSubItem~new(1, 3, "boo@gmail.com", 12) + lvFullRow = .LvFullRow~new(lvItem, lvSub1, lvSub2, lvSub3, .true) + list~addFullRow(lvFullRow) + + lvItem = .LvItem~new(2, "Mechanical Engineer", 0) + lvSub1 = .LvSubItem~new(2, 1, "Tamara", 13) + lvSub2 = .LvSubItem~new(2, 2, "Ecclestone", 16) + lvSub3 = .LvSubItem~new(2, 3, "tameccle@yahoo.com", 9) + lvFullRow = .LvFullRow~new(lvItem, lvSub1, lvSub2, lvSub3, .true) + list~addFullRow(lvFullRow) + + lvItem = .LvItem~new(3, "Lawyer", 5) + lvSub1 = .LvSubItem~new(3, 1, "Mary", 13) + lvSub2 = .LvSubItem~new(3, 2, "Tyler", 17) + lvSub3 = .LvSubItem~new(3, 3, "fkan@qualcom.com", 10) + lvFullRow = .LvFullRow~new(lvItem, lvSub1, lvSub2, lvSub3, .true) + list~addFullRow(lvFullRow) + + lvItem = .LvItem~new(4, "Doctor", 2) + lvSub1 = .LvSubItem~new(4, 1, "Cienna", 13) + lvSub2 = .LvSubItem~new(4, 2, "Acer", 18) + lvSub3 = .LvSubItem~new(4, 3, "ca@sharp.org", 11) + lvFullRow = .LvFullRow~new(lvItem, lvSub1, lvSub2, lvSub3, .true) + list~addFullRow(lvFullRow) + + lvItem = .LvItem~new(5, "Clerk", 3) + lvSub1 = .LvSubItem~new(5, 1, "Harry", 14) + lvSub2 = .LvSubItem~new(5, 2, "Houdini", 19) + lvSub3 = .LvSubItem~new(5, 3, "HH@magic.net", 12) + lvFullRow = .LvFullRow~new(lvItem, lvSub1, lvSub2, lvSub3, .true) + list~addFullRow(lvFullRow) + + lvItem = .LvItem~new(6, "Nurse", 4) + lvSub1 = .LvSubItem~new(6, 1, "Mike", 14) + lvSub2 = .LvSubItem~new(6, 2, "Thompson", 18) + lvSub3 = .LvSubItem~new(6, 3, "mike@microsoft.com", 10) + lvFullRow = .LvFullRow~new(lvItem, lvSub1, lvSub2, lvSub3, .true) + list~addFullRow(lvFullRow) + + lvItem = .LvItem~new(7, "Drywall Finisher", 7) + lvSub1 = .LvSubItem~new(7, 1, "Larry", 14) + lvSub2 = .LvSubItem~new(7, 2, "Goodell", 20) + lvSub3 = .LvSubItem~new(7, 3, "walls49@yahoo.com", 9) + lvFullRow = .LvFullRow~new(lvItem, lvSub1, lvSub2, lvSub3, .true) + list~addFullRow(lvFullRow) + + lvItem = .LvItem~new(8, "Biochemist", 8) + lvSub1 = .LvSubItem~new(8, 1, "Kumar", 14) + lvSub2 = .LvSubItem~new(8, 2, "Patel", 18) + lvSub3 = .LvSubItem~new(8, 3, "kpatel@sequenom.com", 10) + lvFullRow = .LvFullRow~new(lvItem, lvSub1, lvSub2, lvSub3, .true) + list~addFullRow(lvFullRow) + diff --git a/modules/windows/oodialog/controls/ListView/customDrawListview.rex b/modules/windows/oodialog/controls/ListView/customDrawListview.rex new file mode 100755 index 0000000..5ab5b15 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/customDrawListview.rex @@ -0,0 +1,267 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * This example shows how to work with a simple ListView control in report + * view. + * + * The main points of the example are: + * + * 1.) It shows how to use the LvFullRow, LvItem, and LvSubItem objects to add + * items to list-views + * + * 2.) It shows how to use custom draw with a list-view change the text and + * background color of a single list-view item, and / or change the font + * for a single item. + * + * Note that in the .rc file, the resource script file, for this example, the + * dialog is created *not* visible. Thus, while the dialog is being + * initialized, it is not visible on the screen. This eliminates flicker while + * the items are being inserted into the list-view. Some people like the users + * of their applications to see the list-view being filled, some people dislike + * flicker. So, it is mostly a matter of preference how you create the dialog, + * initially visible, or initially invisible. But, it is good to be aware of + * the option. + */ + + -- Determine which directory our source code files are in: + sd = locate() + + -- Set the defaults for this application. Use the global .constDir 'O'nly, + -- Read the 'customDrawListview.h' file for symbolic resource ID + -- definitions. And, turn automatica data detection off (.false.) + .application~setDefaults('O', sd'rc\customDrawListview.h', .false) + + dlg = .CustomDrawDlg~new(sd'rc\customDrawListview.rc', IDD_CUSTOMDRAW) + if dlg~initCode = 0 then do + dlg~execute("SHOWTOP") + end + +return 0 +-- End of entry point. + +::requires "ooDialog.cls" + +/** CustomDrawDlg + * + * Our dialog subclass. To use custom draw, you need to inherit the CustomDraw + * mixin class. + */ +::class 'CustomDrawDlg' subclass RcDialog inherit CustomDraw + +/** init() + * + * To recieve the custom draw event notifications, you need to: 1.) Init the + * custom draw interface, 2.) name the control you want the custom draw + * notifications for. + * + * 1.) You must init the custom draw interface before invoking any of the custom + * draw methods. This is done by invoking the customDraw() method. + * + * 2.) You name the control you want the custom draw notifications for by + * invoking the forControl() method with: the resource ID of the control, the + * string name of the control, and the name of the method to be invoked. + * + * At this time, only ListView controls are supported. Future versions of + * ooDialog may support more dialog controls. + * + * Note that we created the colors and font one time here, rather than create + * them each time the onCustomDraw() method is invoked. + * + * We also create our LvFullRows objects here rather than in initDialog(). This + * helps allow the dialog to open with everything appearing at once. The full + * rows are inserted into the list-view in initDialog(). The rows can only be + * inserted after the underlying Windows dialog exists. + */ +::method init + expose textRed textBlack textBlue rowGreen rowLiteBlue rowYellow rows checkedFont + + forward class (super) continue + + self~customDraw + self~customDrawControl(IDC_LV_CUSTOM, 'ListView', onCustomDraw) + + textBlack = self~RGB( 0, 0, 0) + textRed = self~RGB(247, 7, 59) + textBlue = self~RGB( 17, 5, 250) + rowYellow = self~RGB(245, 245, 127) + rowLiteBlue = self~RGB(115, 245, 186) + rowGreen = self~RGB(188, 237, 102) + + checkedFont = self~createFontEx("Courier New", 10) + + rows = self~createRows + +/** initDialog() + * + * initDialog is the place to do any initialization that requires the underlying + * dialog to exist. Here we add some extended list-view styles and fill the + * list-view with its items. + */ +::method initDialog + expose list rows + + list = self~newListView(IDC_LV_CUSTOM) + + list~addExtendedStyle("FULLROWSELECT GRIDLINES CHECKBOXES HEADERDRAGDROP") + + list~InsertColumn(0, "Line text", 75) + list~InsertColumn(1, "Line number", 55) + list~InsertColumn(2, "Numbers", 50) + list~InsertColumn(3, "Characters", 55) + + list~prepare4nItems(rows~items) + do r over rows + list~addFullRow(r) + end + + +/** onCustomDraw() + * + * This is the event handler that is invoked whenever the list-view needs to + * draw any item in the list. + * + * We are passed a LvCustomDrawSimple object to us. This object's attributes + * contain information concerning which item the list-view needs to draw, and + * other information related to doing custom drawing. Other attributes of the + * object need to be set by us in order to control the drawing. + * + * You must return true or false from this event handler. Failure to do so will + * terminate the dialog and raise a condition. Returning false basically says + * you do not want to do any custom drawing for this item. + * + * You can change the text color, the background color, and the font by setting + * those attributes of the LvCustomDrawSimple object. You also need to set the + * reply attribute. This attribute is the reply sent back to the list-view. + * + * For this example, we return CDRF_NEWFONT to tell the list-view that either + * colors, or fonts, were changed and that we do not want to recieve subitem + * notifications. Other possible replies are not discussed here as they are not + * pertinent to this example. The ooDialog documentation describes the other + * possible replies. + * + * The logic of what we are doing is relatively simple. We color every other + * row with a different color, if the user has not checked the row. All checked + * rows use a differnt color and font than the unchecked rows. + */ +::method onCustomDraw unguarded + expose list textRed textBlack textBlue rowGreen rowLiteBlue rowYellow checkedFont + use arg lvcds + + item = lvcds~item + + if (item // 2) == 0 then do + if list~isChecked(item) then do + lvcds~clrText = textBlue + lvcds~clrTextBk = rowLiteBlue + lvcds~font = checkedFont + end + else do + lvcds~clrText = textRed + lvcds~clrTextBk = rowYellow + end + end + else do + if list~isChecked(item) then do + lvcds~clrText = textBlue + lvcds~clrTextBk = rowLiteBlue + lvcds~font = checkedFont + end + else do + lvcds~clrText = textBlack + lvcds~clrTextBk = rowGreen + end + end + + lvcds~reply = self~CDRF_NEWFONT + return .true + + +/** createRows() + * + * Here we create LvFullRow objects for every list-view item. LvItem objects + * represent the list-view item and LvSubItem objects represent each column in + * the list-view item. + * + * All the full row objects are put into an array. The array is later used to + * insert all the items into the list-view. + */ +::method createRows private + + rows = .array~new(10) + + do i = 1 to 1000 + j = i - 1 + lvi = .LvItem~new(j, 'Line' i, , p) + lvsi1 = .LvSubItem~new(j, 1, i) + lvsi2 = .LvSubItem~new(j, 2, random(1, 200)) + lvsi3 = .LvSubItem~new(j, 3, self~randomChars) + + rows[i] = .LvFullRow~new(lvi, lvsi1, lvsi2, lvsi3, .false) + end + + return rows + + +/** randomChars() + * + * Simple method to generate some random string of characters. + */ +::method randomChars private + + len = random(1, 7) + chars = '' + + do i = 1 to len + chars || = random(97, 122)~d2c + end + + return chars + + +/** leaving() + * + * This method is invoked automatically be the ooDialog framework when the + * dialog is closed. It should be used to do any needed clean up. Here we + * delete the font we created. + * + * Note that the colors we created are just numbers and do not represent any + * system resource. + */ +::method leaving unguarded + expose checkedFont + self~deleteFont(checkedFont) diff --git a/modules/windows/oodialog/controls/ListView/rc/columnIcons.dll b/modules/windows/oodialog/controls/ListView/rc/columnIcons.dll new file mode 100644 index 0000000000000000000000000000000000000000..12c5bf96048798a92753896946943572d9aa787d GIT binary patch literal 94720 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 pDCa1LAS;>7UY36Z +#include +#include +#include "columnIcons.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDB_SMALL_ICONS BITMAP ".\\columnIcons_16.bmp" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDB_NORMAL_ICONS BITMAP ".\\columnIcons_32.bmp" + + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +IDD_DIALOG DIALOGEX 0, 0, 342, 249 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU +CAPTION "Views of the List-view Control" +FONT 8, "Ms Shell Dlg 2", 400, 0, 1 +{ + CONTROL "", IDC_LV_VIEWS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_ICON, 10, 10, 322, 171 + GROUPBOX "View", IDC_ST_VIEW, 10, 186, 153, 53, WS_GROUP + AUTORADIOBUTTON "Report View", IDC_RB_REPORT, 21, 201, 55, 10, WS_TABSTOP + AUTORADIOBUTTON "List View", IDC_RB_LIST, 21, 221, 55, 10 + AUTORADIOBUTTON "Icon View", IDC_RB_ICON, 96, 201, 55, 10 + AUTORADIOBUTTON "Small Icon View", IDC_RB_SMALL_ICON, 96, 221, 65, 10 + DEFPUSHBUTTON "OK", IDOK, 282, 225, 50, 14, WS_GROUP +} diff --git a/modules/windows/oodialog/controls/ListView/rc/columnIcons_16.bmp b/modules/windows/oodialog/controls/ListView/rc/columnIcons_16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fbe1bbf47a1dfa36a41b93ba17cef5262d65472a GIT binary patch literal 30774 zcmeHv2UHbFx9-6NN=|~9(-=k_$1Ex;ii&~)0!omag94HiBRr40)K`1g?qcP8-#;H2*==pzprB9z83;Iq!VN6{o^&jBJmzq06JJe3x01F$ z8?Wj28Oq@*fj>7lx2~>^aQfdMI;-=7RqhA9xevtORG*(;F*U`Aiso+0Pzaa)rs99- z(%9GtI_G0{+=uK~-Sr&vEkhxGYWzQR)BoLO_4W0CD8P;rm)K<9=H%pjfA#j)1Qj4n8&|DLmFc)}$j z?VgY_-Lcq-x`s!2JcfqM8BU7_KtXSRJ`_?w#3@gvh-A91`*tG{ThHmJ(uBGK4 zy#J$9Goh*IXL34BXPCFs?592Q+ufH6&Jh{iBU3+Y917d|MyvzlZt==cA36)|?>l#c z?~PG(9%f=@;fGbq8@gnT-H$Ur-bTF-_)pw?qHO7p?HKwYGZfZ!47_&=x$y8M>7L`j zfA|usxQ;^(rgd)NFFHr6kKtz{GD^7QKOpkc96o#Jg`7iJYS-|;l>cAd_hOw61Brju<{0S{@BmiNxw8}U+(|?%Z5&?ph{8CT6as5Tf`Iv&^QCa)L z(zXXBtPhA;?t5jfB zICKvU_GQPsZB0Bho=rEAO*ffMyPk6xCUbVzM;}d%P#qin@hAj?GmP+Xqvhpgxb?<9 z{=ZBELO~)RED#8uA~FNb=z}GDD))UCfD;gyP?5j@tr6%=#O&;>wRQBNL!$cn9y2pD zo38%w)Gxo3TgNClzwmpNhEx}ebXM?8w(w7OJnh4=@hkA2;t~2?NbtPis|!L8UrDl* z#oQb%y)sa6wkcW0$FZ@oapNtp30V8f_A=XKM1K`E)iy0HEuEkLH}l&BqXa_=L*p&R z^1I~|{Sr5}MxYl~*21a>uUn*(zc3@dA-L_t&8>$nY(L3Da$k;0KH#B8Sw_qF^6H!IJbpM9{4`vZ-7oLp4H0Dh6s_obD!+_njJ*Fs7W z2a?<3+fUzt#nq#t}v)_U~%QoNeD7+YwW(F3#KUXb#^wmW2IzP}$HWu& zB1%z5k~$Z*@_(C&jgoGux(@bsCAjD~i!zN) zWhEsiXXWGoXu>T3AaavTyE9KOl!Esgjz@=n~o_dXP|E>@noxJJl_ovNW z-Ov1@wu!6Dnpm~9wQXVu#g!@#x5=(eDXz^(O!pda2isHH+R@tC(%9ONTN^yF6{;$E zxZHAQuI9>Mp{&1iLqo&H76$qUA|xXmwmLX%b<#!YilM}K8F)2CHOorNHnI`uj@ph? zvDBD@F(C{grX;3*N`COr30DzfVP(~|eCVuaEuA@<>di+=DF;#+M`9^EQYl+XIS-l- zsq{9LSAA+f*Nz|%4B#ak+rG~cOKY4r5>R!( z$3GGbgPM_=0K1THX9^<(azwiDRLl{{PlT;mINmZpQf7Xn^hZ{P5@^re-5p{6`0-<9 zW#!1oNJ&Wv+`;^hCt{dmD$;4LBZS;C!!$#^2?`V$Nb>oZHl9MjG>6L=rsrV#}x&c2*`o}V0;x67N%upB&H-MCMR`vbs@8kriSv$ zxI6Q>`wOLvizT#>zd|tM3g*&E`O#G@^K!jVP7q5+OEuC9s5Ln`Syoc)VPmQ-%B{|I z=N->o1K}s`A5=3EVtaae2zLa2@Pb~seEBxZtvk0_{yv{Nc@i`Y9#n#^2*mXKa&G;& zSzJ4}Q}tcTiib{>Y>pU@g1*VQ<*ttAJWPdAdWm8hPBjJlAszEBt5Q9?N;@5En2vd$ zQS~OPN+F}#H9e!IBG=eZPeVfkz?VkD2Z2t)Ef9iG2;d8Bo2**68Wj}<(+ptt^72Be z0QhcV+t_AXTaT2K@7Aq4D3s~etqQ`z#;vWb8yOH9W*virgZ=&ecs$-THJ{PK4<-L$ zH?L?wTw;5Bd+4Wx{GxJ1Ghw*0w?o}3YqMHwbIMbF1-8Aza)U!kL;VWNUkV_>~KpnM{6S0ZV zcHW;WpGKF_iCpPTJ!0pJap-yaK3h88Uu4Zt;(ix_! zhU6k$HcG)Aa|Zcw2VE+UdpGc_#OkqGo7^^+k_tQPieq%auD5TTCFYmYJ3d|3HTuNA z43Yn!N6l`RHgfgG?NaqS-!#zKv@m)j@|Rq)&G=YYPf+Pk;-?1w84a|xO|v+K5}*2= zo@w9F2T!TrTGAMJLZ*6Sy6eI7ZF>$dv)%{GNJT{jhCYB`07^IlK7!!`srqYzm9^uZ zr_KgnzZ}DUEB)nzBDts4TF)DdU@aKw1-FzNk~u}~Svb_n%E|y+0n-Z$3-j{wU|h}4 z&L)hgus{|Z91P=RZEY>^#K*_O?I7jn=O-s8ySlpi`}@OCxk*3h5R*=K?kT@#Qyy$n z4$SQuXN$#8#!FrFmt)EHen(*D;K8d{k2FpLyRA6yyyhl#Z$54pG3oyu4IbmY3?R8Dsbg zAlONf6NAnLKm_nDLKmfGq$eaNf%Cb$2VDB!TwX<4?tSP-^L0<=O6cZ`X%^NYc=vLr z?sB8ZN(tR+)tR+svDQ?U{IqZLlj-T{vZ4YjO(hNKJKkZ!Y4sWzE!yE3ibfhw45awt z!UDnOC77{lYHCk89tZn-4R$t<_jmpB3^p z{9^k2igQ**UU`AO!8iQwW#Ke?sZ=bixlK|~Z;%8NC3-{jCJ$P4)%EXK4V=BtlpGZmP0EguM%Tja~ z-#YoFBEIYJnhKraex0>d?JWG zL7AXP3`wZpANj?>=#+CNqjnhWYaiX{;;g!!2Xp-FC+B>-}~7m6nx7 z@E3f-FrVOGTfqT9M5bQbsXJUH@hU*ID#tZ z+?2OvG@VlSY#*9Hs8tSU}*(T+9{1_*XmepZ^7o?lRqnw|#W3&+0xeggPHmE0uV zF|5FR-P74(y18N+fZ+LJy2VDprJ9FJ#dIrWdsiFyhl|)!KWPIqG~U$E;9+5CsKFPM zqLI>ImRxU&7tx; zaS>q)3-igT>GIY|$D}SH*BVxfN-%W^n2QkXu2qm9yJ95#vHg<^?QKm#S=pbudNB*L zP0O>`#f6&1xzYuE)%0@J{6hP}eB;b4Zfe#mCojFYTu)ygv3~)72?>#N)A4)!1&{@( zMQWWrdlp_2ppjbN<1egu z58C7#oRBGf^kKp`Yx0oh%vrtVy55fWLH;MCFMUX&(+;DOb9`nWboi=kcco{uvE$aAcuS zftM~{rl+Upv+-ER-`Z8k0KsQe^v~V8d+Ek4M|TgvT!|Q+(&9|509gVn%JJ3~yQlPdejgBF=;@;mA5A)VC}IDB_^a2Fs;eh^dcG7Fj};V* zLD+SA`sB%zv1DWsq@)o$cZTmE4nu0W=GPn#%`+atBc~`WNif$|FtvQ6=M^Msm@V`n2l6Yu998>hGe<*x zH8Fn|d(bd)7X*KYx?0i`W8NsrHQ_2#;-WOv-l!@olo#e?CdVtu%QRG%kM(s(iHiXK zN(aV5@W3;^yER}6<6hSLr6%zZs`I+t~g&2=}mM<*CIgXha^zeB9?0nD6eDB;+aArYaQKi1V!O+kUU@Ju5Bj~wq)8^zrzaRmDz$*|x z#9zWyV1NXtPz&ClP528j#C$LKM6-`i;>nZJcLfg1 z*^}{V91&34FJn$FpiBEMjNBm__4)J1fq}@$$*t|}L>(P2l(NK9G0P?sBUPUHZdqVM^x%Wlo1{K0r7RA4$1%HShOJIluj$edb&y z+k=ee=E?E#FGE9LDk~?hGbisqkhphW0uxgLBV#-jbu?0Ic4?X0H+46*qx)-+35rh+ zGF%FnULdb%xn~(M^W7&8U|zL1U{hRmKI^{leamfX_&zc^3VQvm!P!~DcwSl%+>*;S zThBjTeryI!HCs%z4#5?tmnSloJG7Qc7?!atxX9xrdFz7%C_K{N(^x~{y_r3mQ3a#H z+PAE~c2TcK*&@o!R!bW&cnkkB_`6@R6EwU z?w3aJSL0Iyr#pt-bscayT-VX|=~uwza>sCcV0b(+&%LVoys&)USWf5C^7hf5hL)7X z;_T)@h{o!gTgmR|i>#^7#ZP1p;R7pi6@w!XH`6%3;+<2Jfv(cqfWH92h$;{mMIe<> z0*k+!)_=kC3<+TXW`uwvyo!W!IGvteFg0zUpunL}B`A~`O3Y(dM;G1L7-?lCk*6n0 z(hl`Y0SfgQg_0#DmD1Go1;0&AeZ9D&H?_JsjgZ38=WYl2iWxaFX<0nTe^X~VFM3$V zgIvd+hF4tfgJDf=Ej(5^Isb~ZsQ3w4@GBX)d~otJ$zWt z%iDeKS08B&cm1{sp{~k@okjbTJ){F&w1O&Focj)GV~Agd^J;oXnYr$IBuU1jy7QI5 z7BME2EQ(Z})I8mM1V5seq(`Aafs#RO6Fi68U2(MqcGz4<*P2ban`{qQrIp zURQKhOwCP=O^>15(C5w1Z#M#cF{uHtFc# z)YWlrZV5MUDj&OWoKu06Qvu{5eJl<96vFyD3>;9w!Sz#9g3ZmS%1TsK)!q8~;raQk zp`j%D&g25`cRiAzoJ*DHJ(t?sN@k#{apI2 z1QUH*YmlY|G zD#$Nx`7Nk`@OJ$qern)9s)19dGH%_X=gpbWmtbf9D_I&;$4h-9) zN>;XVmb+-qXHk9q6RWFVAh@`-b^PAFZ~*0B&*YpsoqghD7SrB8qhivUdM|w{c=7eq zMU1n)^qrIP> z5A+>Q`}*4Qq8?9F-NBa~!J{dri>T&mIp*v6=POPvl8V#&Re}J(zY%{!{k`qJIt>6s zKuCackypZb=}E)gZQz$i@Yf}y?S&5(%v(TPZchN*YIcWWc6&6Bd*uu7>X*J)0bi`3 zA6Cc@%j;GVSJ~ZOS09&_litzSI=@)j+Z~6i!A_6XtWMM{EaZ-kMOR?UMy6_JmOXQd zQqff({=i=deg@b@5(o(iXgI=SMG6u81uJ;{+ShVe^Mx;uzMlQ%0Q^vkU;-~MuOuZ+ z-?%Zob!#IEWxGwni=}@^cWsSxZf+L_gVGH~9nVFfipk0SU%regD{I3JjqsP(?Z)-c z6x9(cz27Yu!(zVh#D3v7g%x9P*jf?>PK6;e!^l9eZ zyIMcQUy+bM@fV(gmR8!XUH(**@x)|)+ZCPnx2Nl_j3uqDiO+S?e1<^lfNg?tTSU{3 zO9h4{qcbv^-@K_eHlB5NU*qA)R8tL*i1FiUD3Tp)K56@2#>(hpZTs7*wd+pZ6cQ;s z+P+ejo`8>J{8~E&1-1wOl1Xb&h#FDysqYcc zAbqMxE~K~P#a-0P9VkguMMs6CzvPh*Mu)f~-^S1}t zO*ojGAiQ5K{K2s!n@$SYA z9zCXm1vWOhFJD#}7&ND*W^;04?Cqntxg}0rJtn9Nm<#fdaVf(sC|()v&@e%{xKs=e zOJlL9^mND^@S!vwPvquCqHRa5%XefvD$qFTb2ZZE##@KBIS3Wl(Yo-B^=gGfS>872L3S(h>BvLJ*yNG!=0B_g%GTJ#*T-o<_HkHuV{q9 zC!K)5!0hMe2ctKvuK~nBB48+>FjyjxfB+vUFd+V9q$8r*pZ%gLTtkaZ-P5JsehbPX z^bu(gR+*s$_A~&5g*9bBUT6nk8tk}KBgs&4=8ozTKxBx22ICH_U@(4x8LEtS;hLl0 z&9x=Y_ZQ6KKF;J>OcmHpR0R$<#o{t7Qk(@Mv~IY*JUGy_ZmKZfDi@My5fp9V7itiZ zNFNxOgfOUqLHxh~9*F+_2`=u0TenM@ZTUk|EQd&|_SO5#Yp%G!9B0txG8Q5XL;z3Km3?73JFPFDs z%HoPX=WQ#=!>7q2=SgFi$ik+Nd$$Xjq-e=%+3RaztE)HRZ+MWui?cIKoB(+V38qYv z65@Gj>ky3KZ)`=cWKb=bxBTAN7v9)MP8B!pt5|H%_bjqF?D7S?D_{9zMf`D)g}gCt z>GiGa_?w&9(1mX4%E#7r;Acmc7DiU4C+C;JSI|5%nOafXIEMe2U6fZ;Mesj=AO8#( z3JJgz>|#LY@9`Jbd=Ui$4=g~yn+B(V$Z!gYfWHV&d;9F$x6O2PUR!Ry|1~vFd~xya z>?}z^0g<4^cB;@TS4u-eG05TtykPm`j}50ZGLJve$S$g^ zt!?4wkK3`shla-V@nf@FE>0}Dep3Bd!8QE(^75V9(L02bw@YMg5lZBF9|YkL@Pl%3 zfo0N;w{QEUq&~BmnF-eBJSUYX8s$G?qd+m4qk)Y{&3#)-$x<4?cyp^>ox|MM;p z86u8dL@$Y|+Nx}$ZN(hL3hD~1W2`CoD0YcT)0rjF>Bk&52;ZyhM6Kw&SIV3Dw3RT* zUgL0BoE4_0VZ1QB#f~dYe7oEI{niJigXqmt51Gd4r&g;5XEG?*Q>%ENcL0^Hab zdqTqfxVWN$0aq}Db#=*9>~~w|(CJ5CvPzfMlQfU2slC)Q-9z-V&K-Bb!`;|yXo~GI zPD!IjUaec^bvt|_2$(xGJfo)BqN33}Gz8f6rKWc1+4H)mJoQhW)?K*t7w=-z=+wQ> z1-~z?J9Z(TUs}EykWoMQE$j;E3v|4pv7x4}7F|-Dk(~wji!LsPzO+L`O-oZH4&&tP zpr{}t@bbB{lLH3xEvg4JR#lac!)1(*H!sfjElw3Jj;Afob&ijBW3ffGwGfT+ZA%~U zIi$o!YKY1SJTgeb|w1?QgL4ICdo}S=s zARsS+fF~<2C!3#{g2Z1{w2UZ+H-LEy`LSckExXDa_84aSYG!*Zi%kiuMHZ)BuAp~? z$X68B39rOq>w=OCy~^r8S2j0HEws$9^)0LptgMdDuC~svbk8o=j!eZ>V4aiGlM6~d z=;?#e{r&g92=W5#0xpBi3rE0TAfO!4D!?m*|G}Gv04`DvM`Rrt2uKJg;RrsMoSa%| zX@`T?&0m7O)Z(WO(F-y6`XUwF16`ktMxUvOAKSzTLKKQMo89Jv`%v){Xh(Ik8^*n>2QCNI9Pp`S`Vjr#fq?pz>lWqY?aYKbsA!ct=G|qLGacuOvD!{F9=w_#w8# zl8$@btC)Q1xZ_$LMAU-(d+iFycrCY|RAv`(N0&6Vw)NN5cew{-ow%n*a{mK_YVY-H zxE|3G)Uf%*KpyMQ<4+CzhcwXHxp4h@owM_xpWm>j=g?z$l}nsF$8Cf6CpVrZb1Ec(t(uaO0!PFUh5-ZyC;$rxklr{XN*g4mquYFg zVj#9^Q-Y8xq-%huKxAcQeg6CzMrmX$TACgoEQwo~9IEqGFVbQe>FWeBz&j0MfF%yh zP^G^eyV$UVQOV@W?_0@X0&0lw|KNQr4JXJ;VluRch5uUaC=z-FpEnzX&4T? zHyhG29yGPHzokSs%i{uvH_p^M#sg*CB!2eCcvQD*wkoiYxRWv{xi-;_I5U~ z@C_hHs0&K#=x8o1j2|6sTwEMpULG45XecU5@9F76R&o(eV5_UaIT>opuuJjX4S#eq z=K*sTWcHic0_=$jJlbZjrSeh}0j3dtz+XiXjz?R44nC z`kMG81;p5{$Z@gAKD#CV>^8T85N}x)_ek@jVa$!r9K`_FrlxNn>Vi9>Cc(Mc^74f3 zi7F)u|HnJcq_`lM(D-u=xp)%&3lGnzKb{Z{{$6)(~q{8=boEmKz85KG=Ut_!g@O>u=n@k=!~!{o0Wwq=qwf z;7V*?Ovj8%-4sXK;Iow83r@wy*sSi*$cp^_L7mrL@uB&XqpH7N)<0#E@i4aIe)52F z(I~_KG*2$QEg9#|7!;FsW*?*s3FM62iEN`(4Ip~(o5Bfs0Z*Z>t|QO$GVck_Y4qM?jf~R(~FUYTzH! zKv>x1ix=G)8Ph2#(+LUq=;*14h{@pK34i}_FRw9JY=uz*j$gmQtpp$j;Db;oa0Nqx z7-m?91=|D&a7P0=z&HbAY;0`o#*KO`{EDM8n^N-u=v@eC0)&&3i@r;`wp|KfIwa^a zI7nfC4{$F7UO-dJ)1!@6PZ}-RA$J6;gAoCN(*XUz4Drvv3{`ruDZNEr_>Q8b>4DYd zg~ge{nbF3{-V(syftt`1CxIZ-M)&t)78eHrf;&5_nwn}i zG9WZ~_zN=Atkk6C*@cBz{hnPbiJY4^?3?^$Gm=b6u9X+!nSnd%Bx(Roe{q=0fGT) zAtT_67{71|sJf}w2+o4>3vU{731Y4Y;0x%yiJx!^-SPIGx^Q8Zk#TX?E}V)=E+PPd zfk5QrMgsGP^n$RQF@>TS+~oo+ox?{#*EBJgj#~;z5h>sN`LO?$)^MNZ+N$o_>f4F2 zr091wuAEp89*i4TmHopEXCckDGJ&OW?#1rA<5dcQZZKCwZc!RxohG}xU7K#i{7A3y zp&V&a{U;2uAzmq_7~@8T1S&>UV33!XokGPL8anxGwc+0 zZ2ff&Zk6GZ1uY`b!YT+rZVSfgy=s8Y$eTf_9s@>=uM zvL$Xxp?K_ha@R4#7#h~sdk^y;V&L9?kdKZ<>4?rJ?$my0T(4>}ci`LpY+3#Dx>XY( z&;8F$dz9QruRJH;caDPL7xH7*$vIShbIyO2GXzzvYw)f3^$-QmrfKEU2|4umd7mn> z=kK>&;oNfW=9b@XZ@DQd|Y*P~oA0Sw-a-#)2}>YUXmp8)x91lQ1uS>$&n z!weVpoMfZs)x8#gmC7Fh`JL+UV+*Tr3#*!S`FT^ij~U19e4xDb)Kj8E54N6oLUKp; z(EBj1uk!0wPJq}1mHs4tYTzH!z}nguP0cY$$&s9#c?@Q;tZbpEXdyRuJ~MMJC1oxs zXc`7RU_gKvq=G3u#7e=3z>pvU3dT|}O!5e&J&!0Cx)u3t&TP zEzM6&_SFv5XE*11cjbA^_G4y7>Lz>8{UyF7ZW7o;`>x8Qk@m`knQwOiR8>~(aSWbv z{e*W4#XAH|+4)ad`%GDSPMW(-nmAABn2*UR_IwY%$nE0V25*!!F{2w}n*RI%nIJy^ zAGiWw29lALS%5AoE-3+-0ayVDa&odI#D%Ra&0+l-W)_4h1mY|H7WMa6EG+Z^1b22; zG&OCuuYnnW8|EQJIhlcG?`&SNoATW?e11oVkIhU~E;8gJe9{H?BD4tvoPJ%a|Mv&P z9uF^U*A1#N{aj@iSL=~lAClh^S<;?@>CUX_D`^?3>=_T2fLJewLO25&7AcThfK=dxMyz1O)eNwU;4eIPNE_t`8cGOg z`#teJ|HkU|^|P|F(=;@bckUGB7j2*+pDwzk6q z9iN<@o%;qZA-Gc2p)RGh1(mgB`H9iw2(?DL`}I!jbqB9}zSgjm3U+$d#lL_cfBghDCarfzn0VSR(< z<+U$WW6QeLGtY7-PsWYx_H7`28%+E{Zi3TFstxt206hMqF1nZ^CFBQ>DBRo$Fq$@KZ;iG7hn z6sDOZFZ4(R4Jj;g_D7FC%$|BvG2_rMH~+^L%|Q6K&V!KGQ^yZR4N+Ma>=d;m7SJct zi)RY$W=WrrEx}vW&i2lJm49^&JF)zsdWJg>U6)_pmDZ*5*Z5K1{Hgbt znS`Fjr49R0BOUp9{HcL|Mg#D>jE-L5<(+bJnoCGngy5ZuisetA7R=3OpFf|1OJ9Gu z{{ylBF2e>^uw^kMAU44?;RX<81iMf=J3GVHm+;L|M@I+13g9)Ey|4intU&_+Td_=}vVB(x-^sL+G85>{x8?}Ld z1-@`E*iqKBqSd&x8QD#DVo&6 zxH!4D7d<)II5pMM(NTiI6#j5zhVdM*45GmcvokV21!aW!XC=gdq5zlwRpSKN{@)=0 zHxc_6j^J?Kq*4E%y_{+>>(=7=6aZ`A%%;GRy z6Tyu@;0&oLRT}P+UYnO+TNaz1P*8sUj&1LUr-wgq9@6JHqA1VFSCjo@x%2*f(p1U_;nT>YK^;RkZv2mLwwoNq=*9W9RW{GJC& z0P^DdmLKQO?Tg1#2DB5Kr0>uUCpJ!_3TQu^h?gjvFBx3{BqgNTla5i{NkZv$=HfO@!b9dJWWV1u|@7Wvq1v6S3Q()70o60 zFB8BQxy8cjm(Z@IJ2|s^s8D$se`+ZCgGK;7I5G8e*PxW^zxbxZsAbU z%%1pZ5@!tYyHCXLB1r5?7~=4!(`N0P775^sRG3@&;?%tKd-@Dh9G=vpmiR;Ldi$1n zbP+?pBu{^+S?u`=z6dk?PRqttgiF@trw#1`wsmIxcyiA=DB&oWP3T)*{0Y9_9>vdp z|7#lP>st#8TQMqH*6A#4SaL&!G85oSYx=z|VPFmYdm|0C2Sxo4ejBD$R!KJ^c_+PmM<2Jx90)=39 z!Zf3zqP(uI7KYy+;wjQ5e9o1ZmrzoYR9c!+TAEf|oKjSjiL8VF@TSld017Yw7K70Z zw!n6jw6|=W@J!51`&Q&@r$uU{e$q@1&#%Y9(Zt}kz`%)w8r$7TIZ zf)<*KlXE|sw^pOSpAT%T*fF!}*t&cpX^_;eh)6$)(xI3wZOE^4Wnlit?{me(sv2(j zaA^BB<22xB@WP6f&E<@&0-ArHh8EU7cC9?l8mDxr0Onm*xmRMkZJL+cXMfx{w9q`g zX3?~KDXwp)bv{&~b}Hk{9t-bT8D0Ewm7>vAS*O#?W#d1R=Bs?w zldIabOD7^acbH{D`}FP@LG*O$;L7YDmh#44j4ZB&bgyvaOi;O2BJy93?zU=PZk_qD QFdOUsqG0|#6BmH+?% literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/controls/ListView/rc/columnIcons_32.bmp b/modules/windows/oodialog/controls/ListView/rc/columnIcons_32.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2777909852bb193d436c4671a1fe3d2c0fa5b06f GIT binary patch literal 61494 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/controls/ListView/rc/customDrawListView.h b/modules/windows/oodialog/controls/ListView/rc/customDrawListView.h new file mode 100644 index 0000000..18cda84 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/rc/customDrawListView.h @@ -0,0 +1,43 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_CUSTOMDRAW 101 +#define IDC_LV_CUSTOM 1002 diff --git a/modules/windows/oodialog/controls/ListView/rc/customDrawListView.rc b/modules/windows/oodialog/controls/ListView/rc/customDrawListView.rc new file mode 100644 index 0000000..b8857a8 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/rc/customDrawListView.rc @@ -0,0 +1,52 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "customDraw.h" + + +LANGUAGE 0, SUBLANG_NEUTRAL +IDD_CUSTOMDRAW DIALOGEX 0, 0, 350, 200 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU +CAPTION "Custom Draw List View" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + CONTROL "", IDC_LV_CUSTOM, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT, 10, 10, 328, 153 + DEFPUSHBUTTON "OK", IDOK, 290, 176, 50, 14 +} diff --git a/modules/windows/oodialog/controls/ListView/rc/res.mak b/modules/windows/oodialog/controls/ListView/rc/res.mak new file mode 100644 index 0000000..bdb044c --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/rc/res.mak @@ -0,0 +1,50 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ +# NMAKE-compatible MAKE file for ooDialog resource DLLs + +rcflags_common = /DWIN32 /v + +all: columnIcons.dll + +columnIcons.dll: columnIcons.res + link /NOLOGO $(@B).res /NOENTRY /DLL /MACHINE:$(MACHINE) -out:$(@B).dll + + +# Create .res from .rc +columnIcons.res: columnIcons.rc + rc $(rcflags_common) -r -fo$(@B).res columnIcons.rc + diff --git a/modules/windows/oodialog/controls/ListView/subitem.editing/ReadMe.txt b/modules/windows/oodialog/controls/ListView/subitem.editing/ReadMe.txt new file mode 100644 index 0000000..bc47926 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/subitem.editing/ReadMe.txt @@ -0,0 +1,77 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + ReadMe + + 1. ooDialog - List-view Example Programs + ----------------------------------------------- + + This directory contains several, similar, example programs that + demonstrate how to embedd a dialog control within the the list-view. + The embedded controls allow the user to do in-place editing of the + subitems in the list-view when in report mode. + + For these first 3 examples, to activate subitem editing, the user first + selects a row by clicking on it with the mouse. If the user then clicks + one more time, the embedded control becomes active. The user enters the + value desired. At that point, hitting enter makes the change. If the + user hits the escape key, or clicks somewhere else on the list-view, the + change is abandoned. + + - dropDownComboBox.rex + + Embeds a drop down combo box in the list-view. + + - dropDownListComboBox.rex + + Embeds a drop down list combo box in the list-view. + + - editControl.rex + + Embeds an edit control in the list-view. + + The importList.rex example use a slightly different UI. The first + column of the list view has an embedded combo box. To activate the + control the user single clicks on the first column of an item. The + third column has an embedded edit control. To activate the edit + control, the user double clicks on the third column of an item. For + both controls if the user clicks anywhere else in the application, or + hits the enter or tab key, the current text in the control is saved. + The Esc key cancels any change. The example also shows how to use the + ResizingAdmin class and the BrowseForFolder class. + + - importList.rex diff --git a/modules/windows/oodialog/controls/ListView/subitem.editing/dropDownComboBox.rex b/modules/windows/oodialog/controls/ListView/subitem.editing/dropDownComboBox.rex new file mode 100755 index 0000000..86eaf31 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/subitem.editing/dropDownComboBox.rex @@ -0,0 +1,271 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * This example shows how to embedd a drop down combo box in a list-view, to + * allow the user to edit the subitems in the list-view. + * + * To activate the editing, the user clicks once on a subitem, then clicks one + * more time to activate the editing. A drop down combo box takes the place of + * the subitem in the list-view. With a drop down combo box the user can + * either enter text directly in the edit part of the combo box, or select an + * item from the list. + * + * When the user is in the editing mode, hitting enter, escape, or clicking the + * mouse any where else on the scren, ends the editing. If enter is hit, the + * changes are accepted, otherwise, the changes are abandoned. + * + * The key to how this works is creating an invisible combo box, which is then + * made a child of the list-view. When editing mode is entered, the combo box + * positioned over the subitem, sized to the size of the subitem, and made + * visible. When editing is over, the combo box is made invisible again. + * + * The Rexx combo box, after it is made a child of the list-view, can be used + * as normal, with one caveat: Since it is a child of the list-view, the combo + * box no longer sends its event nofications to the dialog. They are sent to + * the list-view. This means that connecting the combo box events will have no + * effect. + */ + + -- Set the defaults for this application. Use the global .constDir 'O'nly, + -- turn automatic data detection off (.false.) Then we add a few symbols + -- to the global .constDir: + .application~setDefaults('O', , .false) + .constDir[IDC_LISTVIEW] = 200 + .constDir[IDC_CB] = 201 + + dlg = .SimpleLV~new + if dlg~initCode = 0 then do + dlg~create(30, 30, 325, 200, "In-place Editing List View", "VISIBLE") + dlg~execute("SHOWTOP") + end + +return 0 +-- End of entry point. + +::requires "ooDialog.cls" + +::class 'SimpleLV' subclass UserDialog + +/** defineDialog() + * + * Standard defineDialog. We create a combo box, list-view, and ok button in + * the dialog template. Note the combo box is created invisible. + * + * We add a flag to keep track of whether the combo box is visisble or not. We + * also connect the events we need to monitor. + */ +::method defineDialog + expose cbVisible + + cbVisible = .false + + self~createComboBox(IDC_CB, 10, 20, 40, 12, 'PARTIAL HIDDEN') + self~createListView(IDC_LISTVIEW, 10, 20, 305, 145, "REPORT SHOWSELALWAYS") + self~createPushButton(IDOK, 280, 175, 35, 15, "DEFAULT", "Close") + + self~connectListViewEvent(IDC_LISTVIEW, "CLICK", onClick, .true) + self~connectListViewEvent(IDC_LISTVIEW, "BEGINSCROLL", onBeginScroll, sync) + self~connectListViewEvent(IDC_LISTVIEW, "ENDSCROLL", onBeginScroll, .false) + + +/** initDialog() + * + * Here we do 2 normal things, populate the list-view and populate the combo + * box. + * + * The rest is what makes this work. Drop down combo boxes create a child edit + * control. When the combo box gets the focus, the focus is actually set to + * the edit control. + * + * We get a Rexx edit object that represents the underlying edit control of the + * combo box. The isGrandchild() method sets up a connection to some of the + * event notifications sent by the grandchild control, to a Rexx method in this + * dialog. We need that event connection to monitor the Esc, Enter key events, + * and the lost focus event. + * + * The other key thing we do is set the parent of the combo box to be the list + * view. This parent / child relation is what keeps the combo box drawn + * correctly, it ensures that the combo box is drawn over the top of the list + * view. + */ +::method initDialog + expose list cb edit + + list = self~newListView(IDC_LISTVIEW) + cb = self~newComboBox(IDC_CB) + + cb~add('One') + cb~add('Two') + cb~add('Three') + + edit = cb~getEditControl + edit~isGrandchild + + cb~setParent(list) + + self~setUpListView(list) + + +/** onClick() + * + * This is the event handler for a click on the list-view. We track the clicks + * and when we see that the user has clicked twice in a row on the same subitem + * we enter editing mode. + * + * When we enter editing mode, we get the rectangle of the subitem we are going + * to edit, size the combo box to that size, position the combo box over the + * subitem, and make the combo box visible. + * + * We set our flag so that we know the combo box is now visible, and assign the + * focus to the combo box. And that's it. + * + * Notice that we set the height of the combo box to 4 times the height of the + * subitem. This allows space for the drop down. + */ +::method onClick unguarded + expose cb cbVisible lastIdx lastCol + use arg id, itemIndex, columnIndex, keyState, , lv + + if lastIdx == itemIndex & lastCol == columnIndex then do + if columnIndex > 0 then do + r = lv~getSubitemRect(itemIndex, columnIndex, 'LABEL') + ret = cb~setWindowPos(lv~hwnd, r~left, r~top, r~right - r~left, 4 * (r~bottom - r~top), "SHOWWINDOW NOZORDERCHANGE") + cbVisible = .true + cb~assignFocus + end + else do + r = lv~getItemRect(itemIndex, 'LABEL') + ret = cb~setWindowPos(lv~hwnd, r~left, r~top, r~right - r~left, 4 * (r~bottom - r~top), "SHOWWINDOW NOZORDERCHANGE") + cbVisible = .true + cb~assignFocus + end + end + + lastIdx = itemIndex; lastCol = columnIndex + + return 0 + + +/** onBeginScroll() + * + * This is the event handler for the begin and end scroll events. When the + * user is in the editing mode and then moves a way from the combo box, we + * interpret that as canceling the edit. + * + * This works fine if the user tabs out of the combo box, used the mouse to + * click outside the combo box, brings somer other application to the fore- + * ground. But, for some reason, clicking on the scroll bars fro the list-view + * does not trigger the onEditGrandChildEvent() handler. This seriously messes + * up the logic. + * + * The begin and / or end scroll event is sent as soon as the user clicks on + * the scroll bars. So, we connect that event and use the event handler to + * hide the combo box if it is visible. + */ +::method onBeginScroll unguarded + expose cbVisible edit + use arg ctrlID, dx, dy, lv, isBegin + + if cbVisible then self~hideComboBox(edit) + return 0 + + +/** onEditGrandChildEvent() + * + * This is the event handler for events that happen in a grandchild control. + * There are 4 events that get forwarded on to the grandfathe dialog. The Esc, + * Tab, and Enter key events, and the lost focus event. Which event is + * specified by the 2nd argument, which uses a keyword to denote the event. + * + * The isGrandChild() method automatically sets up the connection to the 4 + * events. Since we did request the tab key event be connected, we won't get + * that notification. The other 3 notifications, all signal the end of the + * editing mode. On enter, we need to update the subitem text with the new + * text. + */ +::method onEditGrandChildEvent unguarded + expose list lastIdx lastCol + use arg id, key, editCtrl + + if key == 'enter' then do + text = editCtrl~getText~strip + if text \== '' then list~setItemText(lastIdx, lastCol, text) + self~hideComboBox(editCtrl) + end + else if key == 'escape' then self~hideComboBox(editCtrl) + else if key == 'killfocus' then self~hideComboBox(editCtrl, .false) + + return 0 + + +/** hideComboBox() + * + * Makes the combo box invisible, removes its state, and assign the focus back + * to the list-view. This is done each time the editing mode is ended. + */ +::method hideComboBox private unguarded + expose cb cbVisible list + use strict arg editCtrl, assignFocus = .true + + cb~hide + cbVisible = .false + cb~selectIndex + editCtrl~setText("") + + if assignFocus then list~assignFocus + + +/** setUpListView() + * + * Sets up the list view by adding the columns and populating the list with + * rows. + */ +::method setUpListView private + use strict arg list + + list~addExtendedStyle("FULLROWSELECT GRIDLINES CHECKBOXES HEADERDRAGDROP") + + list~insertColumn(0, "Row (List-view item)", 75) + list~insertColumn(1, "Column 2 (subitem 1)", 70) + list~insertColumn(2, "Column 3 (subitem 2)", 70) + + do i = 1 to 200 + list~addRow(i, , "Row" i, "Row / Col ("i", 2)", "Row / Col ("i", 3)") + end + + diff --git a/modules/windows/oodialog/controls/ListView/subitem.editing/dropDownListComboBox.rex b/modules/windows/oodialog/controls/ListView/subitem.editing/dropDownListComboBox.rex new file mode 100755 index 0000000..dbd0d43 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/subitem.editing/dropDownListComboBox.rex @@ -0,0 +1,262 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * This example shows how to embedd a drop down list combo box in a list-view, + * to allow the user to edit the subitems in the list-view. + * + * To activate the editing, the user clicks once on a subitem, then clicks one + * more time to activate the editing. A drop down list combo box takes the + * place of the subitem in the list-view. With a drop down list combo box the + * user can only select an item from the list. + * + * When the user is in the editing mode, hitting enter, escape, or clicking the + * mouse any where else on the scren, ends the editing. If enter is hit, the + * changes are accepted, otherwise, the changes are abandoned. + * + * The key to how this works is creating an invisible combo box, which is then + * made a child of the list-view. When editing mode is entered, the combo box + * positioned over the subitem, sized to the size of the subitem, and made + * visible. When editing is over, the combo box is made invisible again. + * + * The Rexx combo box, after it is made a child of the list-view, can be used + * as normal, with one caveat: Since it is a child of the list-view, the combo + * box no longer sends its event nofications to the dialog. They are sent to + * the list-view. This means that connecting the combo box events will have no + * effect. + */ + + -- Set the defaults for this application. Use the global .constDir 'O'nly, + -- turn automatic data detection off (.false.) Then we add a few symbols + -- to the global .constDir: + .application~setDefaults('O', , .false) + .constDir[IDC_LISTVIEW] = 200 + .constDir[IDC_CB] = 201 + + dlg = .SimpleLV~new + if dlg~initCode = 0 then do + dlg~create(30, 30, 325, 200, "In-place Editing List View", "VISIBLE") + dlg~execute("SHOWTOP") + end + +return 0 +-- End of entry point. + +::requires "ooDialog.cls" + +::class 'SimpleLV' subclass UserDialog + +/** defineDialog() + * + * Standard defineDialog. We create a combo box, list-view, and ok button in + * the dialog template. Note the combo box is created invisible. + * + * We add a flag to keep track of whether the combo box is visisble or not. We + * also connect the events we need to monitor. + */ +::method defineDialog + expose cbVisible + + cbVisible = .false + + self~createComboBox(IDC_CB, 10, 20, 40, 12, 'PARTIAL HIDDEN LIST') + self~createListView(IDC_LISTVIEW, 10, 20, 305, 145, "REPORT SHOWSELALWAYS") + self~createPushButton(IDOK, 280, 175, 35, 15, "DEFAULT", "Close") + + self~connectListViewEvent(IDC_LISTVIEW, "CLICK", onClick) + self~connectListViewEvent(IDC_LISTVIEW, "BEGINSCROLL", onBeginScroll) + self~connectListViewEvent(IDC_LISTVIEW, "ENDSCROLL", onBeginScroll) + + +/** initDialog() + * + * Here we do 2 normal things, populate the list-view and populate the combo + * box. + * + * The rest is what makes this work. The isGrandchild() method sets up a + * connection to some of the event notifications sent by the grandchild + * control, to a Rexx method in this dialog. We need that event connection to + * monitor the Esc, Enter key events, and the lost focus event. + * + * The other key thing we do is set the parent of the combo box to be the list + * view. This parent / child relation is what keeps the combo box drawn + * correctly, it ensures that the combo box is drawn over the top of the list + * view. + */ +::method initDialog + expose list cb edit + + list = self~newListView(IDC_LISTVIEW) + cb = self~newComboBox(IDC_CB) + + cb~add('One') + cb~add('Two') + cb~add('Three') + + cb~setParent(list) + cb~isGrandChild + + self~setUpListView(list) + + +/** onClick() + * + * This is the event handler for a click on the list-view. We track the clicks + * and when we see that the user has clicked twice in a row on the same subitem + * we enter editing mode. + * + * When we enter editing mode, we get the rectangle of the subitem we are going + * to edit, size the combo box to that size, position the combo box over the + * subitem, and make the combo box visible. + * + * We set our flag so that we know the combo box is now visible, and assign the + * focus to the combo box. And that's it. + * + * Notice that we set the height of the combo box to 4 times the height of the + * subitem. This allows space for the drop down. + */ +::method onClick unguarded + expose cb cbVisible lastIdx lastCol + use arg id, itemIndex, columnIndex, keyState, , lv + + if lastIdx == itemIndex & lastCol == columnIndex then do + if columnIndex > 0 then do + r = lv~getSubitemRect(itemIndex, columnIndex, 'LABEL') + ret = cb~setWindowPos(lv~hwnd, r~left, r~top - 2, r~right - r~left, 4 * (r~bottom - r~top), "SHOWWINDOW NOZORDERCHANGE") + cbVisible = .true + cb~assignFocus + end + else do + r = lv~getItemRect(itemIndex, 'LABEL') + ret = cb~setWindowPos(lv~hwnd, r~left, r~top, r~right - r~left, 4 * (r~bottom - r~top), "SHOWWINDOW NOZORDERCHANGE") + cbVisible = .true + cb~assignFocus + end + end + + lastIdx = itemIndex; lastCol = columnIndex + + return 0 + + +/** onBeginScroll() + * + * This is the event handler for the begin and end scroll events. When the + * user is in the editing mode and then moves a way from the combo box, we + * interpret that as canceling the edit. + * + * This works fine if the user tabs out of the combo box, used the mouse to + * click outside the combo box, brings somer other application to the fore- + * ground. But, for some reason, clicking on the scroll bars fro the list-view + * does not trigger the onEditGrandChildEvent() handler. This seriously messes + * up the logic. + * + * The begin and / or end scroll event is sent as soon as the user clicks on + * the scroll bars. So, we connect that event and use the event handler to + * hide the combo box if it is visible. + */ +::method onBeginScroll unguarded + expose cbVisible + use arg ctrlID, dx, dy, lv, isBegin + + if cbVisible then self~hideComboBox + return 0 + + +/** onEditGrandChildEvent() + * + * This is the event handler for events that happen in a grandchild control. + * There are 4 events that get forwarded on to the grandfathe dialog. The Esc, + * Tab, and Enter key events, and the lost focus event. Which event is + * specified by the 2nd argument, which uses a keyword to denote the event. + * + * The isGrandChild() method automatically sets up the connection to the 4 + * events. Since we did not request the tab key event be connected, we won't + * get that notification. The other 3 notifications, all signal the end of the + * editing mode. On enter, we need to update the subitem text with the new + * text. + */ +::method onComboBoxGrandChildEvent unguarded + expose list lastIdx lastCol + use arg id, key, cbCtrl + + if key == 'enter' then do + text = cbCtrl~selected~strip + if text \== '' then list~setItemText(lastIdx, lastCol, text) + self~hideComboBox + end + else if key == 'escape' then self~hideComboBox + else if key == 'killfocus' then self~hideComboBox(.false) + + return 0 + + +/** hideComboBox() + * + * Makes the combo box invisible, removes its state, and assign the focus back + * to the list-view. This is done each time the editing mode is ended. + */ +::method hideComboBox private unguarded + expose cb cbVisible list + use strict arg assignFocus = .true + + cb~hide + cbVisible = .false + cb~selectIndex + + if assignFocus then list~assignFocus + + +/** setUpListView() + * + * Sets up the list view by adding the columns and populating the list with + * rows. + */ +::method setUpListView private + use strict arg list + + list~addExtendedStyle("FULLROWSELECT GRIDLINES CHECKBOXES HEADERDRAGDROP") + + list~insertColumn(0, "Row (List-view item)", 75) + list~insertColumn(1, "Column 2 (subitem 1)", 70) + list~insertColumn(2, "Column 3 (subitem 2)", 70) + + do i = 1 to 200 + list~addRow(i, , "Row" i, "Row / Col ("i", 2)", "Row / Col ("i", 3)") + end + + diff --git a/modules/windows/oodialog/controls/ListView/subitem.editing/editControl.rex b/modules/windows/oodialog/controls/ListView/subitem.editing/editControl.rex new file mode 100755 index 0000000..df09d31 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/subitem.editing/editControl.rex @@ -0,0 +1,254 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * This example shows how to embedd an edit control in a list-view, to allow + * the user to edit the subitems in the list-view. + * + * To activate the editing, the user clicks once on a subitem, then clicks one + * more time to activate the editing. An edit control takes the place of the + * subitem in the list-view. + * + * When the user is in the editing mode, hitting enter, escape, or clicking the + * mouse any where else on the scren, ends the editing. If enter is hit, the + * changes are accepted, otherwise, the changes are abandoned. + * + * The key to how this works is creating an invisible edit control, which is + * then made a child of the list-view. When editing mode is entered, the edit + * control is positioned over the subitem, sized to the size of the subitem, + * and made visible. When editing is over, the edit control is made invisible + * again. + * + * The Rexx edit control, after it is made a child of the list-view, can be + * used as normal, with one caveat: Since it is a child of the list-view, the + * edit control no longer sends its event nofications to the dialog. They are + * sent to the list-view. This means that connecting the edit control events + * will have no effect. + */ + + -- Set the defaults for this application. Use the global .constDir 'O'nly, + -- turn automatic data detection off (.false.) Then we add a few symbols + -- to the global .constDir: + .application~setDefaults('O', , .false) + .constDir[IDC_LISTVIEW] = 200 + .constDir[IDC_EDIT] = 201 + + dlg = .SimpleLV~new + if dlg~initCode = 0 then do + dlg~create(30, 30, 325, 200, "In-place Editing List View", "VISIBLE") + dlg~execute("SHOWTOP") + end + +return 0 +-- End of entry point. + +::requires "ooDialog.cls" + +::class 'SimpleLV' subclass UserDialog + +/** defineDialog() + * + * Standard defineDialog. We create an edit control, list-view, and ok button in + * the dialog template. Note the edit control is created invisible. + * + * We add a flag to keep track of whether the edit control is visisble or not. + * We also connect the events we need to monitor. + */ +::method defineDialog + expose editVisible + + editVisible = .false + + self~createListView(IDC_LISTVIEW, 10, 20, 305, 145, "REPORT SHOWSELALWAYS") + self~createEdit(IDC_EDIT, 10, 10, 40, 11, 'AUTHSCROLLH NOTAB HIDDEN') + self~createPushButton(IDOK, 280, 175, 35, 15, "DEFAULT", "Close") + + self~connectListViewEvent(IDC_LISTVIEW, "CLICK", onClick, sync) + self~connectListViewEvent(IDC_LISTVIEW, "BEGINSCROLL", onBeginScroll, .true) + self~connectListViewEvent(IDC_LISTVIEW, "ENDSCROLL", onBeginScroll) + + +/** initDialog() + * + * Here we do 1 normal thing, populate the list-view. + * + * The rest is what makes this work. The isGrandchild() method sets up a + * connection to some of the event notifications sent by the grandchild + * control, to a Rexx method in this dialog. We need that event connection to + * monitor the Esc, Enter key events, and the lost focus event. + * + * The other key thing we do is set the parent of the edit control to be the + * list view. This parent / child relation is what keeps the edit control + * drawn correctly, it ensures that the edit control is drawn over the top of + * the list view. + */ +::method initDialog + expose list edit + + list = self~newListView(IDC_LISTVIEW) + + edit = self~newEdit(IDC_EDIT) + edit~setParent(list) + edit~isGrandChild + + self~setUpListView(list) + + +/** onClick() + * + * This is the event handler for a click on the list-view. We track the clicks + * and when we see that the user has clicked twice in a row on the same subitem + * we enter editing mode. + * + * When we enter editing mode, we get the rectangle of the subitem we are going + * to edit, size the edit control to that size, position the edit control over + * the subitem, and make the edit control visible. + * + * We set our flag so that we know the edit control is now visible, and assign + * the focus to the edti control. And that's it. + */ +::method onClick unguarded + expose edit editVisible lastIdx lastCol + use arg id, itemIndex, columnIndex, keyState, , lv + + if lastIdx == itemIndex & lastCol == columnIndex then do + if columnIndex > 0 then do + r = lv~getSubitemRect(itemIndex, columnIndex, 'LABEL') + + r~right -= r~left + r~bottom -= r~top + flags = "SHOWWINDOW NOZORDERCHANGE" + + edit~setWindowPos(lv~hwnd, r, flags) + + editVisible = .true + edit~assignFocus + end + end + + lastIdx = itemIndex; lastCol = columnIndex + + return 0 + + +/** onBeginScroll() + * + * This is the event handler for the begin and end scroll events. When the + * user is in the editing mode and then moves away from the edit control, we + * interpret that as canceling the edit. + * + * This works fine if the user tabs out of the edit control, used the mouse to + * click outside the edit control, brings some other application to the fore- + * ground. But, for some reason, clicking on the scroll bars for the list-view + * does not trigger the onEditGrandChildEvent() handler. This seriously messes + * up the logic. + * + * The begin and / or end scroll event is sent as soon as the user clicks on + * the scroll bars. So, we connect that event and use the event handler to + * hide the edit control if it is visible. + */ +::method onBeginScroll unguarded + expose editVisible edit + use arg ctrlID, dx, dy, lv, isBegin + + if editVisible then self~hideEdit(edit) + return 0 + + +/** onEditGrandChildEvent() + * + * This is the event handler for events that happen in a grandchild control. + * There are 4 events that get forwarded on to the grandfathe dialog. The Esc, + * Tab, and Enter key events, and the lost focus event. Which event, is + * specified by the 2nd argument, which uses a keyword to denote the event. + * + * The isGrandChild() method automatically sets up the connection to the 4 + * events. Since we did not request the tab key event be connected, we won't + * get that notification. The other 3 notifications, all signal the end of the + * editing mode. On enter, we need to update the subitem text with the new + * text. + */ +::method onEditGrandChildEvent unguarded + expose list lastIdx lastCol + use arg id, key, editCtrl + + if key == 'enter' then do + text = editCtrl~getText~strip + if text \== '' then list~setItemText(lastIdx, lastCol, text) + self~hideEdit(editCtrl) + end + else if key == 'escape' then self~hideEdit(editCtrl) + else if key == 'killfocus' then self~hideEdit(editCtrl, .false) + + return 0 + + +/** hideEdit() + * + * Makes the edit control invisible, removes its text, and, maybe, assigns the + * focus back to the list-view. This is done each time the editing mode is + * ended. + */ +::method hideEdit private unguarded + expose editVisible list + use strict arg editCtrl, assignFocus = .true + + if assignFocus then list~assignFocus + + editCtrl~setText("") + editCtrl~hide + editVisible = .false + + +/** setUpListView() + * + * Sets up the list view by adding the columns and populating the list with + * rows. + */ +::method setUpListView private + use strict arg list + + list~addExtendedStyle("FULLROWSELECT GRIDLINES CHECKBOXES HEADERDRAGDROP") + + list~insertColumn(0, "Row (List-view item)", 75) + list~insertColumn(1, "Column 2 (subitem 1)", 70) + list~insertColumn(2, "Column 3 (subitem 2)", 70) + + do i = 1 to 200 + list~addRow(i, , "Row" i, "Row / Col ("i", 2)", "Row / Col ("i", 3)") + end + diff --git a/modules/windows/oodialog/controls/ListView/subitem.editing/importList.h b/modules/windows/oodialog/controls/ListView/subitem.editing/importList.h new file mode 100644 index 0000000..4509d67 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/subitem.editing/importList.h @@ -0,0 +1,56 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_IMPORTER 401 +#define IDM_MENUBAR 403 +#define IDD_RESULTS 405 +#define IDC_HEADER 1000 +#define IDC_CB 1001 +#define IDC_LV_RESULTS 1001 +#define IDC_EDIT 1002 +#define IDC_LV 1003 +#define IDC_ST_DIRECTORY 1004 +#define IDC_PB_IMPORT 1005 +#define IDC_PB_PROCESS 1006 +#define IDC_ST_DIR_LABEL 1007 +#define IDM_RESET_DIRECTORY 40000 +#define IDM_IMPORT_DIRECTORY 40001 +#define IDM_PROCESS_VIEW 40002 diff --git a/modules/windows/oodialog/controls/ListView/subitem.editing/importList.rc b/modules/windows/oodialog/controls/ListView/subitem.editing/importList.rc new file mode 100644 index 0000000..48c81b5 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/subitem.editing/importList.rc @@ -0,0 +1,82 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include "importList.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDM_MENUBAR MENUEX +{ + POPUP "File", 0, 0, 0 + { + MENUITEM "Reset Directory", IDM_RESET_DIRECTORY, 0, 0 + MENUITEM "Process Current View", IDM_PROCESS_VIEW, 0, 0 + MENUITEM "Import Current Directory", IDM_IMPORT_DIRECTORY, 0, 0 + MENUITEM "Exit", IDOK, 0, 0 + } +} + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_IMPORTER DIALOG 40, 60, 412, 330 +STYLE DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_GROUP | WS_MAXIMIZEBOX | WS_POPUP | WS_SYSMENU +CAPTION "Import File Manager - Preview Verison 1.00.04" +FONT 9, "Tahoma" +{ + CONTROL "Review Import File Options, change if necessary, then click Import to import and continue working, Ok to import and quit, Cancel to abort.", IDC_HEADER, WC_STATIC, NOT WS_GROUP | SS_LEFT, 10, 10, 392, 29 + CONTROL "", IDC_LV, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_SHOWSELALWAYS | LVS_REPORT, 10, 44, 392, 250 + CONTROL "", IDC_CB, WC_COMBOBOX, NOT WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST, 10, 265, 40, 12 + CONTROL "", IDC_EDIT, WC_EDIT, NOT WS_VISIBLE | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL, 55, 265, 40, 12 + CONTROL "Import Directory:", IDC_ST_DIR_LABEL, WC_STATIC, NOT WS_GROUP | SS_RIGHT | SS_CENTERIMAGE, 11, 306, 59, 14 + CONTROL "C:\Rexx\ooRexx", IDC_ST_DIRECTORY, WC_STATIC, NOT WS_GROUP | SS_LEFT | SS_CENTERIMAGE | SS_NOTIFY | SS_PATHELLIPSIS, 75, 306, 110, 14 + CONTROL "Process", IDC_PB_PROCESS, WC_BUTTON, WS_TABSTOP | BS_DEFPUSHBUTTON | BS_CENTER | BS_VCENTER, 245, 306, 50, 14 + CONTROL "Import", IDC_PB_IMPORT, WC_BUTTON, WS_TABSTOP | BS_DEFPUSHBUTTON | BS_CENTER | BS_VCENTER, 191, 306, 50, 14 + CONTROL "OK", IDOK, WC_BUTTON, WS_TABSTOP | BS_DEFPUSHBUTTON | BS_CENTER | BS_VCENTER, 300, 306, 50, 14 + CONTROL "Cancel", IDCANCEL, WC_BUTTON, WS_TABSTOP | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER, 352, 306, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_RESULTS DIALOGEX 0, 0, 412, 335 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Processing Results" +FONT 9, "Tahoma", 400, 0, 0 +{ + CONTROL "", IDC_LV_RESULTS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_REPORT, 11, 10, 391, 291 + CONTROL "Close", IDOK, WC_BUTTON, WS_TABSTOP | BS_DEFPUSHBUTTON, 352, 311, 50, 14 +} diff --git a/modules/windows/oodialog/controls/ListView/subitem.editing/importList.rex b/modules/windows/oodialog/controls/ListView/subitem.editing/importList.rex new file mode 100755 index 0000000..0382141 --- /dev/null +++ b/modules/windows/oodialog/controls/ListView/subitem.editing/importList.rex @@ -0,0 +1,615 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** importList.rex + * + */ + + sd = locate() + .application~setDefaults("O", sd"importList.h", .false) + + files = getInitialFiles() + if files == .nil then return 99 + + if files~items == 0 then initDir = 'C:\' + else initDir = filespec("location", files[1]) + + dlg = .ImporterList~new(sd"importList.rc", IDD_IMPORTER) + if dlg~initCode = 0 then do + dlg~fileList = files + dlg~fileListDirectory = initDir + dlg~Execute("SHOWTOP") + end + +return 0 + +::requires "ooDialog.cls" + +::class 'ImporterList' subclass RcDialog inherit ResizingAdmin + +::constant NORMAL_HTEXT 'Review the import file Options, change if necessary, then click the "Process" button or use the "Process Current View" menu item to process the import files and continue working, click the "Ok" button to process the files and quit, or click the "Cancel" button to quit without processing.' +::constant EMPTY_LIST_HTEXT 'Click the "Import" button to poplulate the list view with the import files.' +::constant EMPTY_ONIMPORT_HTEXT 'The import file list is empty. Reset the import directory and retry the import operation.' +::constant POST_PROCESS_HTEXT 'Double-click on the Import Directory text or use the Reset Dirctory menu item to set up a new import.' + +::attribute fileList +::attribute fileListDirectory + +::method defineSizing + + self~defaultLeft('STATIONARY', 'LEFT') + self~defaultRight('STATIONARY', 'RIGHT') + self~defaultTop('STATIONARY', 'TOP') + self~defaultBottom('STATIONARY', 'BOTTOM') + + self~controlBottom(IDC_HEADER, 'MYTOP', 'TOP') + + self~controlLeft(IDCANCEL, 'STATIONARY', 'RIGHT') + self~controlTop(IDCANCEL, 'STATIONARY', 'BOTTOM') + self~controlRight(IDCANCEL, 'MYLEFT', 'LEFT') + self~controlBottom(IDCANCEL, 'MYTOP', 'TOP') + + self~controlLeft(IDOK, 'STATIONARY', 'LEFT', IDCANCEL) + self~controlTop(IDOK, 'STATIONARY', 'BOTTOM') + self~controlRight(IDOK, 'MYLEFT', 'LEFT') + self~controlBottom(IDOK, 'MYTOP', 'TOP') + + self~controlLeft(IDC_PB_IMPORT, 'STATIONARY', 'LEFT', IDOK) + self~controlTop(IDC_PB_IMPORT, 'STATIONARY', 'BOTTOM') + self~controlRight(IDC_PB_IMPORT, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_PB_IMPORT, 'MYTOP', 'TOP') + + self~controlLeft(IDC_PB_PROCESS, 'STATIONARY', 'LEFT', IDC_PB_IMPORT) + self~controlTop(IDC_PB_PROCESS, 'STATIONARY', 'BOTTOM') + self~controlRight(IDC_PB_PROCESS, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_PB_PROCESS, 'MYTOP', 'TOP') + + --self~controlLeft(IDC_ST_DIR_LABEL, 'STATIONARY', 'LEFT', IDC_PB_IMPORT) + self~controlTop(IDC_ST_DIR_LABEL, 'STATIONARY', 'BOTTOM') + self~controlRight(IDC_ST_DIR_LABEL, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_DIR_LABEL, 'MYTOP', 'TOP') + + self~controlLeft(IDC_ST_DIRECTORY, 'STATIONARY', 'RIGHT', IDC_ST_DIR_LABEL) + self~controlTop(IDC_ST_DIRECTORY, 'STATIONARY', 'BOTTOM') + self~controlRight(IDC_ST_DIRECTORY, 'STATIONARY', 'LEFT', IDC_PB_PROCESS) + self~controlBottom(IDC_ST_DIRECTORY, 'MYTOP', 'TOP') + + + return 0 + +::method initDialog + expose hText edit comboBox listView mouse pbProcess pbImport textDir fileListDirectory menuBar + + menuBar = .ScriptMenuBar~new(.application~srcDir"importList.rc", IDM_MENUBAR) + menuBar~attachTo(self) + + hText = self~newStatic(IDC_HEADER) + comboBox = self~newComboBox(IDC_CB) + listView = self~newListView(IDC_LV) + edit = self~newEdit(IDC_EDIT) + + pbProcess = self~newPushButton(IDC_PB_PROCESS) + pbImport = self~newPushButton(IDC_PB_IMPORT) + textDir = self~newStatic(IDC_ST_DIRECTORY) + + self~connectListViewEvent(IDC_LV, "DBLCLK", onLVDClick, .true) + self~connectListViewEvent(IDC_LV, "CLICK", onLVSClick, .true) + self~connectListViewEvent(IDC_LV, "BEGINSCROLL", onLVScroll) + self~connectListViewEvent(IDC_LV, "ENDSCROLL", onLVScroll) + + self~connectButtonEvent(IDC_PB_PROCESS, 'CLICKED', onProcess) + self~connectButtonEvent(IDC_PB_IMPORT, 'CLICKED', onImport) + ret = self~connectStaticEvent(IDC_ST_DIRECTORY, 'DBLCLK', onDirectory) + + menuBar~connectCommandEvent(IDM_PROCESS_VIEW, onProcess) + menuBar~connectCommandEvent(IDM_IMPORT_DIRECTORY, onImport) + menuBar~connectCommandEvent(IDM_RESET_DIRECTORY, onDirectory) + + comboBox~setParent(listView) + comboBox~isGrandchild(onEditGrandChildEvent) + + edit~setParent(listView) + edit~isGrandchild(onEditGrandChildEvent) + + --comboBox~hide + --edit~hide + + textDir~setText(fileListDirectory) + + mouse = .Mouse~new(listView) + + self~initListView + self~onImport + + +::method onDirectory unguarded + expose fileListDirectory fileList pbProcess pbImport textDir listView hText menuBar + + newDir = getNewDirectory(fileListDirectory, self) + if newDir == .nil | newDir == '' then return 0 + + fileListDirectory = newDir + fileList = .nil + textDir~setText(fileListDirectory) + listView~deleteAll + + pbProcess~disable + menuBar~disable(IDM_PROCESS_VIEW) + pbImport~enable + menuBar~enable(IDM_IMPORT_DIRECTORY) + + hText~setText(self~EMPTY_LIST_HTEXT) + +::method onImport unguarded + expose hText listView pbProcess pbImport fileList fileListDirectory menuBar + + if fileList == .nil then do + fileList = getFileList(fileListDirectory) + if fileList == .nil then fileList = onErrorGetFiles(fileListDirectory) + if fileList == .nil then return self~cancel:super + end + + listView~deleteAll + call mssleep(500) -- delay to allow ListView to display before content added + + do i = 1 to fileList~items + buName = 'Z:' || filespec('PATH', fileList[i]) || filespec('NAME', fileList[i]) + listView~addRow(i, , 'Import', buName, fileList[i]) + end + + if fileList~items == 0 then do + hText~setText(self~EMPTY_ONIMPORT_HTEXT) + pbProcess~disable + menuBar~disable(IDM_PROCESS_VIEW) + end + else do + hText~setText(self~getNormalHText) + + pbImport~disable + menuBar~disable(IDM_IMPORT_DIRECTORY) + pbProcess~enable + menuBar~enable(IDM_PROCESS_VIEW) + end + + +::method onProcess unguarded + expose listView pbProcess pbImport hText menuBar + + buNamesImport = .array~new + buNamesReplace = .array~new + importNames = .array~new + replaceNames = .array~new + count = listView~items + skipCount = 0 + + do i = 0 to count - 1 + verb = listView~itemText(i, 0) + select + when verb == 'Skip' then do + skipCount += 1 + end + when verb == 'Import' then do + buNamesImport~append(listView~itemText(i, 1)) + importNames~append(listView~itemText(i, 2)) + end + when verb == 'Replace' then do + buNamesReplace~append(listView~itemText(i, 1)) + replaceNames~append(listView~itemText(i, 2)) + end + end + -- End select + end + + title = 'Import Manager' + msg = 'Projected Import Processing Statistics:' || .endOfLine~copies(2) + msg ||= 'Skipping files:' || '09'x || skipCount || .endOfLine + msg ||= 'Importing files:' || '09'x || importNames~items || .endOfLine + msg ||= 'Replacing files:' || '09'x || replaceNames~items || .endOfLine~copies(2) + msg ||= 'Process files?' + + if messageDialog(msg, self~hwnd, title, 'YESNO', 'INFORMATION') == self~IDNO then return 0 + + col1width = 0 + col4width = 0 + do i = 1 to buNamesImport~items + s = listView~getTextSizePx(buNamesImport[i]) + if s~width > col1width then col1width = s~width + + s = listView~getTextSizePx(importNames[i]) + if s~width > col4width then col4width = s~width + end + + do i = 1 to buNamesReplace~items + s = listView~getTextSizePx(buNamesReplace[i]) + if s~width > col1width then col1width = s~width + + s = listView~getTextSizePx(replaceNames[i]) + if s~width > col4width then col4width = s~width + end + + dlg = .ResultList~new("importList.rc", IDD_RESULTS) + if dlg~initCode = 0 then do + dlg~buNamesImport = buNamesImport + dlg~buNamesReplace = buNamesReplace + dlg~importNames = importNames + dlg~replaceNames = replaceNames + dlg~col1width = col1width + dlg~col4width = col4width + dlg~execute("SHOWTOP") + end + + listView~deleteAll + + pbImport~disable + pbProcess~disable + menuBar~disable(IDM_IMPORT_DIRECTORY) + menuBar~disable(IDM_PROCESS_VIEW) + + hText~setText(self~POST_PROCESS_HTEXT) + + return 0 + + +::method initListView private + expose hText listView comboBox cbVisible editVisible + + baksize = 25 + impsize = 25 + optsize = 10 * 8 + impsize = (impsize + 3) * 8 + baksize = (baksize + 3) * 8 + + listView~addExtendedStyle("FULLROWSELECT GRIDLINES HEADERDRAGDROP") + listView~insertColumnPX(0, "Option", optsize, "LEFT") + listView~insertColumnPX(1, "Backup Filename to Import", impsize, "LEFT") + listView~insertColumnPX(2, "Import To:", baksize, "LEFT") + + comboBox~add("Import") + comboBox~add("Replace") + comboBox~add("Skip") + comboBox~selectIndex(1) + cbVisible = .false + editVisible = .false + + +::method ok unguarded + expose pbProcess + + if pbProcess~isEnabled then self~onProcess + return self~ok:super + +-- Used to process double click, and modify the list view if the double click +-- was on column 2 +::method onLVDClick unguarded + expose currentIndex currentColumn comboBox edit cbVisible editVisible + use arg id, itemIndex, columnIndex, keyState, , lv + + currentIndex = itemIndex + currentColumn = columnIndex + + if columnIndex == 2 then do + text = lv~itemText(itemIndex, columnIndex) + + r = lv~getSubitemRect(itemIndex, columnIndex, "BOUNDS") + edit~setWindowPos(lv~hwnd, r~left, r~top, r~right - r~left, - + r~bottom - r~top, "SHOWWINDOW NOZORDERCHANGE") + + edit~setText(text) + edit~assignFocus + edit~show + editVisible = .true + end + + return 0 + +-- Used to process single click, and modify the list view if the single click +-- was on column 0 +::method onLVSClick unguarded + expose currentIndex currentColumn comboBox edit cbVisible editVisible + use arg id, itemIndex, columnIndex, keyState, , lv + + currentIndex = itemIndex + currentColumn = columnIndex + + if editVisible, columnIndex <> 2 then do + -- This is not needed, lost focus event happens first. + editVisible = .false + edit~hide + end + + if self~goodColumn0(itemIndex, columnIndex, lv) then do + -- Set the combo box selection to match the current text of the list view + -- item before it is shown. + curText = lv~itemText(itemIndex) + comboBox~select(curText) + + r = lv~getSubitemRect(itemIndex, columnIndex, "LABEL") + comboBox~setWindowPos(lv~hwnd, r~left, r~top - 3, r~right - r~left, - + 4 * (r~bottom - r~top), "SHOWWINDOW NOZORDERCHANGE") + + cbVisible = .true + comboBox~assignFocus + comboBox~show + end + return 0 + + +-- Used to detect when focus is on/off scroll +::method onLVScroll unguarded + expose comboBox edit cbVisible editVisible + use arg ctrlID, dx, dy, listView, isBeginScroll + + return self~acceptUserInput('none') + +-- The event handler for both the grandchild edit and comob box controls. +-- Invoked when the grandchild receives an enter, esc, or lost focus event. +::method onEditGrandChildEvent unguarded + expose comboBox edit listView cbVisible editVisible currentIndex currentColumn + use arg id, keyEvent, p3, p4, p5 + + return self~acceptUserInput(keyEvent) + +::method acceptUserInput private unguarded + expose comboBox edit listView cbVisible editVisible currentIndex currentColumn + use arg keyEvent + + if cbVisible then do + text = comboBox~selected + cbVisible = .false + comboBox~hide + if keyEvent <> 'escape' then listView~modify(currentIndex, currentColumn, text) + if keyEvent == 'none' then do + listView~redrawItems(currentIndex - 1, currentIndex + 1) + listView~updateWindow + end + end + else if editVisible = .true then do + text = edit~getText~strip + editVisible = .false + edit~hide + if keyEvent <> 'escape' then listView~modify(currentIndex, currentColumn, text) + end + + return 0 + + +-- Determines if a reported single click is a valid click for opening the combo +-- box. Clicks that are below the last item in the view can have column == 0, +-- but the item index will be -1. In addition, if the list view has more items +-- than fit on a single page, click to the right of the last column can return +-- 0 for the column index. The only way to detect this situation is to check +-- the mouse postion and use hitTestInfo() to have the list view tell us whern +-- the mouse is. +::method goodColumn0 unguarded private + expose mouse + use strict arg index, colIndex, listView + + if colIndex == 0, index <> -1 then do + pos = mouse~getCursorPos + listView~screen2client(pos) + info = .directory~new + listView~hitTestInfo(pos, info) + if info~info == 'OnLabel' then return .true + end + + return .false + +::method getNormalHText private + + return 'Review the import file Options, change if necessary, then click ' || - + 'the "Process" button or use the "Process Current View" menu item ' || - + 'to process the import files and continue working, click the "Ok" ' || - + 'button to process the files and quit, or click the "Cancel" button ' || - + 'to quit without processing. The "Exit" menu item also quits without' || - + 'processing.' + + +::class 'ResultList' subclass RcDialog inherit ResizingAdmin + +::attribute buNamesImport +::attribute buNamesReplace +::attribute importNames +::attribute replaceNames +::attribute col1width +::attribute col4width + +::method defineSizing + + self~defaultLeft('STATIONARY', 'LEFT') + self~defaultRight('STATIONARY', 'RIGHT') + self~defaultTop('STATIONARY', 'TOP') + self~defaultBottom('STATIONARY', 'BOTTOM') + + self~controlLeft(IDOK, 'STATIONARY', 'RIGHT') + self~controlTop(IDOK, 'STATIONARY', 'BOTTOM') + self~controlRight(IDOK, 'MYLEFT', 'LEFT') + self~controlBottom(IDOK, 'MYTOP', 'TOP') + + return 0 + +::method initDialog + + listView = self~newListView(IDC_LV_RESULTS) + + s = listView~getTextSizePx("Importing") + col0width = s~width + + s = listView~getTextSizePx("Replacing") + if s~width > col0width then col0widt = s~width + + s = listView~getTextSizePx("-->") + col2width = s~width + + -- Need some margins + col0width += 12 + col2width += 12 + self~col1width += 12 + self~col4width += 12 + + listView~addExtendedStyle("FULLROWSELECT GRIDLINES HEADERDRAGDROP") + + listView~insertColumnPX(0, "Action", col0width, "LEFT") + listView~insertColumnPX(1, "Source File", self~col1width, "LEFT") + listView~insertColumnPX(2, "To", col2width, "CENTER") + listView~insertColumnPX(3, "Destination File", self~col4width, "LEFT") + + + do i = 1 to self~buNamesImport~items + listView~addRow(i, , 'Importing', self~buNamesImport[i], '-->', self~importNames[i]) + end + + k = i + do i = 1 to self~buNamesReplace~items + k += 1 + listView~addRow(k, , 'Replacing', self~buNamesReplace[i], '-->', self~replaceNames[i]) + end + + + +-- Try to get a list of the files in the ooRexx installation to use for the list +::routine getInitialFiles + + initDir = value('REXX_HOME', , 'ENVIRONMENT') + if initDir == '' then do + title = 'Importer File Location Error' + msg = 'Could not locate the default importer file list' || .endOfLine || - + 'directory.' || .endOfLine~copies(2) || - + 'Do you wish to pick an alternative directory?' || .endOfLine~copies(2) || - + 'Yes to select an alternative directory for the initial' || .endOfLine || - + 'file list. No to open the importer with an empty' || .endOfLine || - + 'file list. Cancel to end the importer application.' + + ret = MessageDialog(msg, 0, title, 'YESNOCANCEL', 'WARNING') + select + when ret == .PlainBaseDialog~IDNO then return .array~new + when ret == .PlainBaseDialog~IDCANCEL then return .nil + otherwise nop + end + -- End select + + banner = 'Normally the importer opens with the default importer files, ' || - + 'but the default files can not be located. Select the folder ' || - + 'to use for the initial import file list.' + hint = 'If this dialog is canceled, the importer will open with an empty file list.' + + bff = .BrowseForFolder~new('Locate Importer Files', banner, hint, 'C:\') + bff~root = 'CSIDL_DRIVES' + bff~options = bff~options 'NONEWFOLDERBUTTON' + + initDir = bff~getFolder + if initDir == .nil then return .array~new + end + + files = getFileList(initDir) + if files == .nil then files = onErrorGetFiles() + + return files + +::routine getFileList + use strict arg directory + + fileSpec = directory'\*' + ret = SysFileTree(fileSpec, f., 'FO') + if ret <> 0 then do + title = 'Operating System Error' + msg = 'Operating system error searching for files' || .endOfLine~copies(2) || - + 'Directory:' || '09'x~copies(2) || directory || .endOfLine || - + 'Error code:' || '09'x || ret || .endOfLine || - + 'Error text:' || '09'x~copies(2) || SysGetErrorText(ret) + + ret = MessageDialog(msg, 0, title, 'OK', 'WARNING') + return .nil + end + + files = .array~new(f.0) + do i = 1 to f.0 + files[i] = f.i + end + + return files + +::routine onErrorGetFiles + use strict arg initialDir = 'C:\' + + title = 'Importer File Location Error' + msg = 'An operating system error occurred trying to get' || .endOfLine || - + 'the file list.' || .endOfLine~copies(2) || - + 'Do you wish to try again?' || .endOfLine~copies(2) || - + 'Abort closes the importer application.' + + ret = MessageDialog(msg, 0, title, 'ABORTRETRYIGNORE', 'ERROR') + select + when ret == .PlainBaseDialog~IDIGNORE then return .array~new + when ret == .PlainBaseDialog~IDABORT then return .nil + otherwise nop + end + -- End select + + banner = 'Select the directory containing the importer files.' + hint = 'If this dialog is canceled, the importer will use an empty file list.' + + bff = .BrowseForFolder~new('Locate Importer Files', banner, hint, initialDir) + bff~root = 'CSIDL_DRIVES' + bff~options = bff~options 'NONEWFOLDERBUTTON' + + initDir = bff~getFolder + if initDir == .nil then return .array~new + + files = getFileList(initDir) + if files == .nil then files = onErrorGetFiles() + + return files + + +-- Use the BrowseForFolder class to prompted the user for a directory. +::routine getNewDirectory + use strict arg initialDir = 'C:\', owner = .nil + + banner = 'Select a new import file directory. The Import File Manager ' || - + 'will display the import files, allowing the import operation ' || - + 'to be configured and then processed.' + hint = 'If this dialog is canceled, the import file list will remain unchanged.' + + bff = .BrowseForFolder~new('Locate Importer Files', banner, hint, initialDir) + bff~root = 'CSIDL_DRIVES' + bff~options = bff~options 'NONEWFOLDERBUTTON' + bff~owner = owner + + return bff~getFolder + + + diff --git a/modules/windows/oodialog/controls/PaidHolidays.rex b/modules/windows/oodialog/controls/PaidHolidays.rex new file mode 100755 index 0000000..409c02e --- /dev/null +++ b/modules/windows/oodialog/controls/PaidHolidays.rex @@ -0,0 +1,251 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2010-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Simple example of using the month calendar control. + * + * Although this example is relatively simple, it shows how to use a number of + * features of the month calendar: + * + * * How to size a month calendar to its optimal size. + * * How to restrict the range of months the calendar displays. + * * How to determine which month(s) are currently displayed in the control. + * * How to customize the calendar and display certain dates in bold. + * * How to connect and respond to the GETDAYSTATE event. + * + * The application is for a hypothetical company, used to show the paid holidays + * for the current year. The dialog displays a month calendar for the current + * year and as the user pages through the months, the paid holidays are high- + * lighted in the calendar by bolding the dates. + * + * Note that to keep this simple, the "current" year is rather hard-coded. + * However, it would not be too hard to enhance the program to calculate the + * paid holidays dynamically. + * + * To fully understand this program, please read the ooDialog doc. + */ + + sd = locate() + .application~useGlobalConstDir("O", sd"paidHolidays.h") + + dlg = .HolidayCalendarDlg~new(sd"paidHolidays.rc", IDD_HOLIDAY_DLG) + + if dlg~initCode == 0 then do + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + end + else do + say + say "Error creating dialog, aborting." + return 99 + end + +return 0 + +::requires "ooDialog.cls" + +::class 'HolidayCalendarDlg' subclass RcDialog + +::method initDialog + expose calendar + + -- Connect the GETDAYSTATE event. + self~connectMonthCalendarEvent(IDC_MC_HOLIDAYS, "GETDAYSTATE", onGetDayState) + + calendar = self~newMonthCalendar(IDC_MC_HOLIDAYS) + + -- Size the calendar to its optimal size + self~sizeCalendar(calendar) + + -- Restrict the calendar so that it only displays the year 2011. + start = .DateTime~fromStandardDate("20110101") + end = .DateTime~fromStandardDate("20111231") + + calendar~setRange(.array~of(start, end)) + + -- Determine which months are currently displayed in the calendar. The first + -- and last months showing are returned in the passed in array as .DateTime + -- objects. The return from getMonthRange() is the number of months + -- displayed. The 'P' argument means to include Partially shown months. + monthsShowing = .array~new + count = calendar~getMonthRange(monthsShowing, 'P') + + -- Bold the appropriate days in the month(s) currently showing. To do that, + -- we need an array of .DayState objects. + dayStates = self~getDayStateArray(monthsShowing[1], count) + calendar~setDayState(dayStates) + + +-- This is the GETDAYSTATE event handler. The underlying month calendar sends +-- this notification whenever it needs to refresh the calendar display for a +-- new month. The arguments are a .DateTime object that specifies the first +-- month to get the day state for and the second argument is the count of months +-- needed. To reply to this notification we need to return a buffer containing +-- the required day states. Creating the buffer correctly needs to be done +-- through the .DayStates class, where a class method is provided to create the +-- buffer. +::method onGetDayState unguarded + expose calendar + use arg startDate, count + + dayStates = self~getDayStateArray(startDate, count) + + buffer = .DayStates~makeDayStateBuffer(dayStates) + return buffer + + +-- This function resizes the calendar to its optimal size. The getMinRect() +-- method of the MonthCalendar returns the minimum required size to completely +-- display a full month. The method fills in the .Rect object with the correct +-- size. The top and left attributes in the returned .Rect are always set to 0, +-- so the right and bottom attributes are the width and height, in pixels, +-- needed for the calendar. We then use the return to adjust the size of the +-- calendar, while leaving the postion of the top, left corner of the calendar +-- at the same spot. +-- +-- The dialog was originally designed on XP using a resource editor, and looked +-- great. But, on Vista and Windows 7, the calendar takes up more room and +-- overlaps the static text and Ok button controls. So, if it is Vista or +-- later, we adjust the size of the dialog and the position of those controls. +-- The adjustment is really just a matter of getting some data, (sizes and +-- current positions,) and doing the math. +-- +-- The same relative positioning of the controls is done. I.e., in the original +-- dialog template the top of the Ok button is placed at the bottom edge of the +-- month calendar control. The static text control is placed 1/2 the margin to +-- the right of calendar, etc.. +::method sizeCalendar private + use strict arg calendar + + r = .Rect~new + if \ calendar~getMinRect(r) then return 0 + + calendar~resizeTo(.Size~new(r~right, r~bottom)) + + if .OS~isAtLeastVista then do + static = self~newStatic(IDC_ST_MSG) + button = self~newPushButton(IDOK) + + -- Get the current window rectangles of the controls and mapped them to the + -- client area of the dialog. + mcRect = calendar~windowRect + self~screen2client(mcRect) + + stRect = static~windowRect + self~screen2client(stRect) + + okRect = button~windowRect + self~screen2client(okRect) + + -- The position of the top left corner of the month calendar control defines + -- the margins + marginLeft = mcRect~left + marginTop = mcRect~top + + -- Calculate what the new size of the dialog will need to be to contain the + -- moved controls and resize the dialog to that. + newWidth = (marginLeft * 2) + (marginLeft % 2) + (mcRect~right - mcRect~left) + (stRect~right - stRect~left) + newHeight = (marginTop * 2) + (mcRect~bottom - mcRect~top) + (okRect~bottom - okRect~top) + + -- The new size of the dialog has to take into account the size of the + -- window frame and the caption bar. + newWidth += .SM~cxFixedFrame * 2 + newHeight += (.SM~cyFixedFrame * 2) + .SM~cyCaption + self~resizeTo(newWidth, newHeight) + + -- Move the static control to the right of the month calendar with a space + -- 1/2 the width of the marging between them + newX = mcRect~right + (marginLeft % 2) + static~moveTo(newX, stRect~top) + + -- Move the Ok button so that the top edge of the button aligns with the + -- bottom edge of the month calendar and the right edge of the button is + -- even with the margin on the right. (Left and right margins are equal.) + clRect = self~clientRect + newX = clRect~right - marginLeft - (okRect~right - okRect~left) + button~moveTo(newX, mcRect~bottom) + end + + +-- This function returns an array of .DayState objects for the specified months. +-- A day state object specifies which days in a month should be bolded. +::method getDayStateArray private unguarded + use strict arg startMonth, count + + -- Create the array to hold the .DayState objects. + d = .array~new(count) + + -- We know that the month calendar always asks for any partially displayed + -- months. We also know that our calendar only displays 1 month completely, + -- and displays the partial month preceding and the partial month following. + -- Therefore, if the complete month is January 2011, the preceding month will + -- be December 2010. Likewise we know that the range set for the calendar is + -- January 2011 through December 2011, January 2012 can never be shown, so + -- December 2011 can never be a preceding month. Therefore, if the start + -- month is 12, it must be December 2010. We give that month a 0 number so + -- that getDayState() will return an empty .DayState object. + month = startMonth~month + if month == 12 then month = 0 + + do i = 1 to count + d[i] = self~getDayState(month + i - 1) + end + + return d + +-- This function initalizes a .DayState object to the proper value depending on +-- the month specified. +::method getDayState private unguarded + use strict arg month + + select + when month == 1 then ds = .DayState~new(17) + when month == 2 then ds = .DayState~new(21) + when month == 3 then ds = .DayState~new + when month == 4 then ds = .DayState~new + when month == 5 then ds = .DayState~new(30) + when month == 6 then ds = .DayState~new + when month == 7 then ds = .DayState~new(4) + when month == 8 then ds = .DayState~new + when month == 9 then ds = .DayState~new(5) + when month == 10 then ds = .DayState~new + when month == 11 then ds = .DayState~new(24, 25) + when month == 12 then ds = .DayState~new(23, 30) + otherwise ds = .DayState~new() + end + -- End select + + return ds diff --git a/modules/windows/oodialog/controls/ReadMe.txt b/modules/windows/oodialog/controls/ReadMe.txt new file mode 100644 index 0000000..c5698a1 --- /dev/null +++ b/modules/windows/oodialog/controls/ReadMe.txt @@ -0,0 +1,83 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2009-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + ReadMe + + 1. ooDialog - Dialog Control Example Programs + ----------------------------------------------- + + This directory and subdirectory contain example programs that demonstrate + how to use the various dialog control objects in ooDialog. It is intended + that, eventually there will be an example of all the control objects. The + programs are intended to show several of the methods of the control + objects. This will probably cause them to be medium complex. + + Many of the example programs are in dialog control subdirectories to make + it easy to find examples of a specific control. List-view examples in the + ListView subdirectory, ToolTip examples in the ToolTip subdirectory, etc.. + + - fiscalReports.rex + + Demonstrates how to use the DateTimePicker control. This example + focuses on how to use call back fields in the format string for the + DateTimePicker control and how to respond to the FORMATQUERY, FORMAT, + and KEYDOWN notifications. + + - paidHolidays.rex + + Shows how to use a MonthCalendar control, including responding to the + GETDAYSTATE event. Also shows how to: restrict the time span shown in + the calendar, resize the calendar to the optimal size, and determine + which months are currently displayed. + + - upDown.rex + + Demonstrates how to use the UpDown class. An up down control is a pair + of arrow buttons that the user can click to increment or decrement a + value, such as a scroll position or a number displayed in a companion + control. + + - userStringDTP.rex + + Demonstrates how to use the DateTimePicker control. This example + focuses on the USERSTRING notification. The USERSTRING notification is + sent when the user finishes editing in the DTP control. Only DTP + controls with the CANPARSE style send this notification. It allows the + program to provide the user with the capability of typing within the DTP + control. The program can then provide a custom response when the user + has finished typing. + diff --git a/modules/windows/oodialog/controls/ToolBar/customizeToolBar.rex b/modules/windows/oodialog/controls/ToolBar/customizeToolBar.rex new file mode 100755 index 0000000..dcab798 --- /dev/null +++ b/modules/windows/oodialog/controls/ToolBar/customizeToolBar.rex @@ -0,0 +1,312 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** customizeToolBar.rex + * + * The main purpose of this example is to show how to make the built-in + * customization features of the toolbar available to the users of your + * application. It also shows how to connect many of the event notifications of + * the toolbar. + * + * + * + */ + + sd = locate() + .application~useGlobalConstDir('O') + + dlg = .CustomizableToolBar~new(sd'rc\customizeToolBar.dll', IDD_TBAR, , sd'rc\customizeToolBar.h') + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +return 0 +-- End of entry point. + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" + +::class 'CustomizableToolBar' subclass ResDialog + +::method init + expose buttons + forward class (super) continue + + self~connectButtonEvent(IDB_ARROW_LEFT, 'CLICKED', onArrowLeft) + self~connectButtonEvent(IDB_ARROW_RIGHT, 'CLICKED', onArrowRight) + self~connectButtonEvent(IDB_COPY_CLIPBOARD, 'CLICKED', onCopyClipBoard) + self~connectButtonEvent(IDB_COPY_TO_FOLDER , 'CLICKED', onCopyToFolder) + self~connectButtonEvent(IDB_CUT_CLIPBOARD, 'CLICKED', onCutClipBoard) + self~connectButtonEvent(IDB_DELETE , 'CLICKED', onDelete) + self~connectButtonEvent(IDB_FAVORITES , 'CLICKED', onFavorites) + self~connectButtonEvent(IDB_FOLDER_CLOSED , 'CLICKED', onFolderClosed) + self~connectButtonEvent(IDB_MOVE_TO_FOLDER , 'CLICKED', onMoveToFolder) + self~connectButtonEvent(IDB_PASTE_CLIPBOARD, 'CLICKED', onPasteClipboard) + self~connectButtonEvent(IDB_SEARCH , 'CLICKED', onSearch) + + self~connectToolBarEvent(IDC_TOOLBAR, 'BEGINADJUST') + self~connectToolBarEvent(IDC_TOOLBAR, 'ENDADJUST') + self~connectToolBarEvent(IDC_TOOLBAR, 'CUSTHELP') + self~connectToolBarEvent(IDC_TOOLBAR, 'DELETINGBUTTON') + self~connectToolBarEvent(IDC_TOOLBAR, 'GETBUTTONINFO') + self~connectToolBarEvent(IDC_TOOLBAR, 'INITCUSTOMIZE') + self~connectToolBarEvent(IDC_TOOLBAR, 'QUERYDELETE') + self~connectToolBarEvent(IDC_TOOLBAR, 'QUERYINSERT') + self~connectToolBarEvent(IDC_TOOLBAR, 'RELEASEDCAPTURE') + self~connectToolBarEvent(IDC_TOOLBAR, 'TOOLBARCHANGE') + + tbb1 = .TbButton~new(IDB_ARROW_LEFT , "Previous" , "BUTTON", "ENABLED", , 1) + tbb2 = .TbButton~new(IDB_ARROW_RIGHT , "Next" , "BUTTON", "ENABLED", , 2) + tbb3 = .TbButton~new(IDB_COPY_CLIPBOARD , "Copy to clipboard" , "BUTTON", "ENABLED", , 3) + tbb5 = .TbButton~new(IDB_COPY_TO_FOLDER , "Copy to folder" , "BUTTON", "ENABLED", , 4) + tbb4 = .TbButton~new(IDB_CUT_CLIPBOARD , "Cut to clipboard" , "BUTTON", "ENABLED", , 5) + tbb6 = .TbButton~new(IDB_DELETE , "Delete" , "BUTTON", "ENABLED", , 6) + tbb7 = .TbButton~new(IDB_FAVORITES , "Favorites" , "BUTTON", "ENABLED", , 7) + tbb8 = .TbButton~new(IDB_FOLDER_CLOSED , "Close folder" , "BUTTON", "ENABLED", , 8) + tbb9 = .TbButton~new(IDB_MOVE_TO_FOLDER , "Move to folder" , "BUTTON", "ENABLED", , 9) + tbb10 = .TbButton~new(IDB_PASTE_CLIPBOARD, "Paste from clipboard" , "BUTTON", "ENABLED", , 10) + tbb11 = .TbButton~new(IDB_SEARCH , "Search, for something", "BUTTON", "ENABLED", , 11) + + self~storeButtonText + buttons = .array~of(tbb1, tbb2, tbb3, tbb4, tbb5, tbb6, tbb7, tbb8, tbb9, tbb10, tbb11) + + +::method initDialog + expose tb buttons listBox + + tb = self~newToolBar(IDC_TOOLBAR) + + ret = tb~setExtendedStyle('DOUBLEBUFFER MIXEDBUTTONS') + ret = tb~setBitmapSize(.Size~new(24, 24)) + + self~loadImageList(tb) + self~setupListBox + + -- We only add the first 3 buttons here. + btns = .array~of(buttons[1], buttons[2], buttons[3]) + ret = tb~addButtons(btns) + + ret = tb~setButtonText("Previous", IDB_ARROW_LEFT) + ret = tb~setButtonText("Next", IDB_ARROW_RIGHT) + ret = tb~setButtonText("Copy to clipboard", IDB_COPY_CLIPBOARD) + + -- Now that the tool bar has its buttons, tell it to recalculate its size. + tb~autoSize + + -- And show the tool bar. + tb~show + tb~assignFocus + + +::method onArrowLeft unguarded + expose tb listBox + self~add('Current text:' tb~getButtonTextEx(IDB_ARROW_LEFT)) + +::method onArrowRight unguarded + expose tb listBox + self~add('Current text:' tb~getButtonTextEx(IDB_ARROW_RIGHT)) + +::method onCopyClipboard unguarded + expose tb listBox + self~add('Current text:' tb~getButtonTextEx(IDB_COPY_CLIPBOARD)) + +::method onCopyToFolder unguarded + expose tb listBox + self~add('Current text:' tb~getButtonTextEx(IDB_COPY_TO_FOLDER)) + + +::method onGetButtonInfo unguarded + expose buttons listBox + use arg id, index, textLen, tbb, toobar + + self~add('TBN_GETBUTTONINFO buttonindex:' index) + if index > buttons~items then return .false + + self~mergeButtons(tbb, buttons[index]) + return .true + +::method onQueryDelete unguarded + expose listBox + use arg id, index, tbb, toolbar + + self~add('TBN_QUERYDELETE buttonindex:' index 'cmdID:' tbb~cmdID) + return .true + +::method onQueryInsert unguarded + expose listBox + use arg id, index, tbb, toolbar + + self~add('TBN_QUERYINSERT buttonindex:' index 'cmdID:' tbb~cmdID) + return .true + + +::method onReleasedCapture unguarded + expose listBox + use arg id, toolBar + self~add('NM_RELEASEDCAPTURE') + + return 0 + +::method onBeginAdjust unguarded + expose listBox + + self~add('TBN_BEGINADJUST') + return .true + +::method onCustHelp unguarded + expose listBox + + self~add('TBN_CUSTHELP') + return .true + +::method onDeletingButton unguarded + expose listBox + use arg id, cmdID, toolbar + + self~add('TNB_DELETINGBUTTON cmdID:' cmdID) + return 0 + +::method onInitCustomize unguarded + expose listBox + + self~add('TBN_INITCUSTOMIZE') + return .true + +::method onEndAdjust unguarded + expose listBox + use arg id, tb + self~add('TBN_ENDADJUST') + + count = tb~buttonCount + do i = 1 to count + cmdID = tb~indexToCommand(i) + if cmdID <> 0, cmdID <> .nil then self~resetText(cmdID) + end + return 0 + +::method onToolBarChange unguarded + expose buttonTextSet listBox + use arg id, tb + self~add('TBN_TOOLBARCHANGE') + + return 0 + +::method leaving + expose font imageList + imageList~release + self~deleteFont(font) + +::method mergeButtons unguarded private + use strict arg button1, button2 + + button1~bitmapID = button2~bitmapID + button1~cmdID = button2~cmdID + button1~itemData = button2~itemData + button1~state = button2~state + button1~style = button2~style + button1~text = button2~text + +::method printTbb unguarded private + use arg tbb + + say 'bitmapID:' tbb~bitmapID + say 'cmdID: ' tbb~cmdID + say 'itemData:' tbb~itemData + say 'state: ' tbb~state + say 'style: ' tbb~style + say 'text: ' tbb~text + say + +::method loadImageList private + expose imageList + use strict arg tb + + flags = 'COLOR32 MASK' + cRef = .Image~colorRef(255, 0, 255) + + ri = .ResourceImage~new(self) + imageBMP = ri~getImage(IDB_BUTTONS_IL) + + imageList = .ImageList~create(.Size~new(24, 24), flags, 20, 0) + + index = imageList~addMasked(imageBMP, cRef) + old = tb~setImageList(imageList) + + imageBMP~release + +::method setupListBox private + expose listBox font maxItems + + font = self~createFontEx('Courier New') + size = self~getTextSizePX('A'~copies(50)) + + listBox = self~newListBox(IDC_LB_EVENTS) + listBox~setFont(font) + listBox~setWidthPX(size~width) + + maxItems = listBox~clientRect~bottom % listBox~itemHeightPX + +::method add unguarded private + expose listBox maxItems + use strict arg text + + index = listBox~add(text) + if index + listBox~getFirstVisible >= maxItems then listBox~makeFirstVisible(index - maxItems + 1) + +::method storeButtonText private + expose buttonTextTable + + table = .table~new + table[.constDir[IDB_ARROW_LEFT]] = "Previous" + table[.constDir[IDB_ARROW_RIGHT]] = "Next" + table[.constDir[IDB_COPY_CLIPBOARD]] = "Copy to clipboard" + table[.constDir[IDB_COPY_TO_FOLDER]] = "Copy to folder" + table[.constDir[IDB_CUT_CLIPBOARD]] = "Cut to clipboard" + table[.constDir[IDB_DELETE]] = "Delete" + table[.constDir[IDB_FAVORITES]] = "Favorites" + table[.constDir[IDB_FOLDER_CLOSED]] = "Close folder" + table[.constDir[IDB_MOVE_TO_FOLDER]] = "Move to folder" + table[.constDir[IDB_PASTE_CLIPBOARD]] = "Paste from clipboard" + table[.constDir[IDB_SEARCH]] = "Search, for something" + + buttonTextTable = table + +::method resetText unguarded private + expose tb buttonTextTable + use arg cmdID + + ret = tb~setButtonText(buttonTextTable[cmdID], cmdID) diff --git a/modules/windows/oodialog/controls/ToolBar/rc/ToolBar11IL.bmp b/modules/windows/oodialog/controls/ToolBar/rc/ToolBar11IL.bmp new file mode 100644 index 0000000000000000000000000000000000000000..723d3c4c1c60310ba9a4ed3d1c62cd7643e38a37 GIT binary patch literal 19062 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 Xjh-wNbTUG8{+l=h4aHae-aq{xTa%qa literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/controls/ToolBar/rc/customizeToolBar.dll b/modules/windows/oodialog/controls/ToolBar/rc/customizeToolBar.dll new file mode 100644 index 0000000000000000000000000000000000000000..b20baa718e6917bf0141ae64e72196777c811a9a GIT binary patch literal 21504 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 +#include +#include "customizeToolBar.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDB_BUTTONS_IL BITMAP ".\\ToolBar11IL.bmp" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TBAR DIALOGEX 0, 0, 256, 166 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Customizable ToolBar Example" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + CONTROL "", IDC_TOOLBAR, "ToolbarWindow32", WS_TABSTOP | WS_BORDER | TBSTYLE_TOOLTIPS | TBSTYLE_LIST | TBSTYLE_FLAT | TBSTYLE_ALTDRAG | CCS_ADJUSTABLE, 1, 1, 238, 20 + CONTROL "Event Notifications:", IDC_STATIC, WC_STATIC, NOT WS_GROUP | SS_LEFT, 11, 25, 69, 10 + CONTROL "", IDC_LB_EVENTS, WC_LISTBOX, WS_TABSTOP | WS_BORDER | WS_HSCROLL | WS_VSCROLL | LBS_NOINTEGRALHEIGHT | LBS_NOTIFY, 11, 37, 235, 100 + CONTROL "OK", IDOK, WC_BUTTON, WS_TABSTOP | BS_DEFPUSHBUTTON, 144, 142, 50, 14 + CONTROL "Cancel", IDCANCEL, WC_BUTTON, WS_TABSTOP | BS_PUSHBUTTON, 196, 142, 50, 14 +} diff --git a/modules/windows/oodialog/controls/ToolBar/rc/res.mak b/modules/windows/oodialog/controls/ToolBar/rc/res.mak new file mode 100644 index 0000000..3ca8c99 --- /dev/null +++ b/modules/windows/oodialog/controls/ToolBar/rc/res.mak @@ -0,0 +1,55 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ +# NMAKE-compatible MAKE file for ooDialog resource DLLs + +rcflags_common = /DWIN32 /v + +all: toolBar.dll customizeToolBar.dll + +toolBar.dll: toolBar.res + link /NOLOGO $(@B).res /NOENTRY /DLL /MACHINE:$(MACHINE) -out:$(@B).dll + +customizeToolBar.dll: customizeToolBar.res + link /NOLOGO $(@B).res /NOENTRY /DLL /MACHINE:$(MACHINE) -out:$(@B).dll + + +# Create .res from .rc +toolBar.res: toolBar.rc + rc $(rcflags_common) -r -fo$(@B).res toolBar.rc + +customizeToolBar.res: customizeToolBar.rc + rc $(rcflags_common) -r -fo$(@B).res customizeToolBar.rc diff --git a/modules/windows/oodialog/controls/ToolBar/rc/toolBar.dll b/modules/windows/oodialog/controls/ToolBar/rc/toolBar.dll new file mode 100644 index 0000000000000000000000000000000000000000..d982c4802c54bf26875801bea8b3bb16bed860d1 GIT binary patch literal 2048 zcmeHI&r2IY6#gcy#VQHyp&%%90y&4MR}V{75L8?=&{8jMeqe&hMm9=IdeOT=?*0wZ zOAk_dD4sm%-(Zi59(wM@e(z<+kYIc9(xPv7-j8qIym>SGc4qN?8&3c{WxKfnjwppZ z<$q`2*`0d*HH9zF&(cR`;Vhl6RGW4)YOF^=-4=r|Y;4&=*+$!;t%i1HX~otXrE)fz z9LmI@4}VRaUmh&)xi)%yxOYK&^w{4Qxm+z)r0-9e__M%*N#MHqZPoewKq5VCQXNwk z=I8|#X~IP&fM;rUC2|DfF$s7BIzY#esk{~O$XHmwH@#4g#j#^O!2OJDR0_5NU{k_K zUR;aITOc8iZ#HU1Me3THr6PWA(Nu*zeN}yA4{!(Ezmw$J^K4^MtM0#v>(8%mVKeXT4=|;{vS_``N`N1bd`^c?S%5;9&&V>CMuhOdxj$E`D=t@~yAM z=p&=IN(Ve0JZZ~a16*N4WgZPaHM~K9h$S?OkJRcs)oME9Ale3I5l!~3phB$1$6|(D zt4^aRd%5cYhLK<4ij%m=1&#a`RfH&Ut`C?*e<5-T{}ba+AjJrB5AI+I^WE608UJ(a UBS)zCOfz +#include +#include "toolBar.h" + + +LANGUAGE 0, SUBLANG_NEUTRAL +IDD_TBAR DIALOGEX 0, 0, 235, 107 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "ToolBar Example" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + CONTROL "", IDC_TOOLBAR, TOOLBARCLASSNAME, WS_TABSTOP | WS_BORDER | TBSTYLE_TOOLTIPS | TBSTYLE_LIST | NOT WS_VISIBLE, 0, 1, 235, 21 + CONTROL "OK", IDOK, WC_BUTTON, WS_TABSTOP | BS_DEFPUSHBUTTON, 123, 83, 50, 14 + CONTROL "Cancel", IDCANCEL, WC_BUTTON, WS_TABSTOP | BS_PUSHBUTTON, 175, 83, 50, 14 +} diff --git a/modules/windows/oodialog/controls/ToolBar/toolBar.rex b/modules/windows/oodialog/controls/ToolBar/toolBar.rex new file mode 100755 index 0000000..d2643cc --- /dev/null +++ b/modules/windows/oodialog/controls/ToolBar/toolBar.rex @@ -0,0 +1,126 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** toolBar.rex + * + * Very simple ToolBar example. Just does the very minimum to show a tool bar. + * + * Note that most dialog editors do not have an option to add a tool bar. This + * can be overcome by editing the .rc file and manually adding the tool bar + * control. Which was done for this example. + * + * MSDN says that with some of the tool bar functionality there can be problems + * painting the tool bar. The suggestion is to create the tool bar not visible + * and then show the tool bar after it has been set up. That is what is done in + * this example. + */ + + sd = locate() + .application~setDefaults('O', sd'rc\toolBar.h', .false) + + dlg = .ToolBarDlg~new(sd"rc\toolBar.dll", IDD_TBAR) + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +return 0 +-- End of entry point. + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" + +::class 'ToolBarDlg' subclass ResDialog + +::method initDialog + expose tb + + -- The buttons in a tool bar are just that, buttons. We can connect the + -- clicked event just as we would for a regular button. Or we could use the + -- connectToolBarEvent() method. + self~connectButtonEvent(IDB_PRESS, 'CLICKED', onPress) + self~connectButtonEvent(IDB_WHERE, 'CLICKED', onWhere) + self~connectButtonEvent(IDB_PUSH, 'CLICKED', onPush) + + tb = self~newToolBar(IDC_TOOLBAR) + + tbb1 = .TbButton~new(IDB_PRESS, "Press Me Please", "BUTTON", "ENABLED") + tbb2 = .TbButton~new(IDB_WHERE, "Where Am I?", "BUTTON", "ENABLED") + tbb3 = .TbButton~new(IDB_PUSH, "Please Push Me", "BUTTON", "ENABLED") + + -- addButtons() takes an array of TbButton objects: + buttons = .array~of(tbb1, tbb2) + ret = tb~addButtons(buttons) -- Returns true on success, othewise false + + -- indsertButton() takes a single TbButton object and inserts the button to + -- the left of the button index specified in argument 2. In this case the + -- button with the index of 2: + ret = tb~insertButton(tbb3, 2) -- Returns true on success, othewise false + + -- Now that the tool bar has its buttons, tell it to recalculate its size. + tb~autoSize + + -- And show the tool bar. + tb~show + tb~assignFocus + + +::method onPress unguarded + title = 'ToolBar Example "Press Button"' + msg = 'Thanks for pressing me ' + + r = MessageDialog(msg, self~hwnd, title, 'OK', 'INFORMATION') + return 0 + + +::method onPush unguarded + title = 'ToolBar Example "Push Button"' + msg = 'Glad you pushed me. ' + + r = MessageDialog(msg, self~hwnd, title, 'OK', 'INFORMATION') + return 0 + + +::method onWhere unguarded + expose tb + + count = tb~buttonCount + title = 'ToolBar Example "Where Button"' + msg = 'I am here, the button on the far right.' || .endOfLine~copies(2) || - + 'There are' count 'buttons. I am button 3.' + + r = MessageDialog(msg, self~hwnd, title, 'OK', 'INFORMATION') + return 0 diff --git a/modules/windows/oodialog/controls/ToolTip/ReadMe.txt b/modules/windows/oodialog/controls/ToolTip/ReadMe.txt new file mode 100644 index 0000000..db5d287 --- /dev/null +++ b/modules/windows/oodialog/controls/ToolTip/ReadMe.txt @@ -0,0 +1,80 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + ReadMe + + 1. ooDialog - ToolTip Example Programs + --------------------------------------- + + This directory contains example programs that demonstrate how to use the + ToolTip control in ooDialog. It is intended that the examples range from + simple programs to medium complex programs, and cover most of the + important methods of the ToolTip class. + + + - toolTip.rex + + Shows how to use a ToolTip control, including responding to the SHOW + event to position the ToolTip where desired. Also shows how to: + enumerate the tools contained in the ToolTip, add a tool simply to the + ToolTip, add a tool as a rectangular area, create a multiline ToolTip, + and create a balloon ToolTip + + - comboBoxToolTip.rex + + Shows how to add tool tips to a combo box. When the list items in a + combo box are longer than the combo box is wide, it is difficult for + the user to know what they say. The tool tip control is an elegant + solution to this problem. But, adding tool tips and getting them to + work is a little more difficult than one might think. This example + shows how to do it. + + + - customPositionToolTip.rex + + Demonstrates how to do custom positioning of the info tip in a + tree-view control. If the program is just displayed, it appears to be + exactly the same as the manageControlTool.rex example. The source + code for both examples needs to be examined to see the differences. + + - manageControlTool.rex + + Demonstrates how create a completely custom ToolTip for a dialog + control. If the program is just displayed, it appears to be exactly + the same as the manageControlTool.rex example. The source code for + both examples needs to be examined to see the differences. + diff --git a/modules/windows/oodialog/controls/ToolTip/comboBoxToolTip.h b/modules/windows/oodialog/controls/ToolTip/comboBoxToolTip.h new file mode 100644 index 0000000..b23ad83 --- /dev/null +++ b/modules/windows/oodialog/controls/ToolTip/comboBoxToolTip.h @@ -0,0 +1,54 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_MAJOR_CITIES 101 +#define IDC_COMBOBOX 1003 +#define IDC_RB_DEFAULT 1005 +#define IDC_RB_CUSTOM 1007 + +#define IDC_TT_CB_MAIN 500 +#define IDC_TT_CB_EDIT 502 +#define IDC_TT_CB_LISTBOX 503 +#define IDC_TT_EDIT_TRACK 504 +#define IDC_TT_BUTTON_TRACK 505 +#define IDC_TI_EDITRECT 506 +#define IDC_TI_BUTTONRECT 507 +#define IDC_TI_LISTBOX 508 diff --git a/modules/windows/oodialog/controls/ToolTip/comboBoxToolTip.rc b/modules/windows/oodialog/controls/ToolTip/comboBoxToolTip.rc new file mode 100644 index 0000000..0319e2e --- /dev/null +++ b/modules/windows/oodialog/controls/ToolTip/comboBoxToolTip.rc @@ -0,0 +1,55 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "comboBoxToolTip.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_MAJOR_CITIES DIALOGEX 0, 0, 241, 128 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Major Cities of the World" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + COMBOBOX IDC_COMBOBOX, 10, 10, 80, 70, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + GROUPBOX "Tool Tip - Tip Positioning", IDC_STATIC, 111, 10, 120, 74, WS_GROUP + AUTORADIOBUTTON "Tool Tip positions the tips", IDC_RB_DEFAULT, 122, 32, 104, 9, WS_TABSTOP + AUTORADIOBUTTON "Application positions the tips", IDC_RB_CUSTOM, 122, 58, 104, 9 + PUSHBUTTON "Done", IDCANCEL, 181, 104, 50, 14 +} diff --git a/modules/windows/oodialog/controls/ToolTip/comboBoxToolTip.rex b/modules/windows/oodialog/controls/ToolTip/comboBoxToolTip.rex new file mode 100755 index 0000000..e28c15c --- /dev/null +++ b/modules/windows/oodialog/controls/ToolTip/comboBoxToolTip.rex @@ -0,0 +1,663 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * This example shows how to add tool tips to a combo box. + * + * When the items in a combo box are longer than the width of the combo box, + * they can be difficult for the user to read. Tool tips are a good solution + * to this, but combo boxes do not have built in support for tool tips like + * list-views or tree-views. + * + * Adding the support to a combo box is doable, but it takes a little work. + * This example shows how it is done. The example also shows how to custom + * position the tool tips. To see the difference in where the tool tip + * positions the tips by default and where this program positions them, the + * dialog has 2 radio buttons that allow switching between the default + * positioning and the custom positioning. + * + * One approach to adding tool tips to a combo box would be to just have the + * tool tips display for the items in the drop down list. This example goes + * beyond that to also show tool tips for the selection field and the drop down + * button. + * + * When the drop down is closed, adding tool tips to the selection field and + * the button is relatively easy. But, when the drop down is open, it is hard + * because the list box has the mouse captured. This prevents tool tips from + * activating when the mouse goes over the selection field or the button. What + * we do here is create tracking tool tips for the selection field and the + * button to use when the drop down is open. Tracking tool tips need to be + * shown and hidden manually, which is what is done in this program. + */ + + sd = locate() + .application~setDefaults('O', sd'comboBoxToolTip.h', .false) + + dlg = .CitiesOfTheWorldDlg~new(sd'comboBoxToolTip.rc', IDD_MAJOR_CITIES) + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + + return 0 + +::requires "ooDialog.cls" + +::class 'CitiesOfTheWorldDlg' subclass RcDialog + +/** init() + * + * Normally for RcDialog dialogs there is no need for an init() method. Here, + * we use the init() method to set up our state varialbes and to connect a + * combo box event. + * + * There is no real need to do it here, it could just as well been done in the + * initDialog() method. + */ +::method init + expose currentItem currentText currentOnClient ttEditActive ttButtonActive doCustomPositioning + + forward class (super) continue + + -- These variables are used to help track which tool needs to be shown. + currentItem = 0 + currentText = '' + currentOnClient = .false + ttEditActive = .false + ttButtonActive = .false + + doCustomPositioning = .true + + self~connectComboBoxEvent(IDC_COMBOBOX, 'CLOSEUP', onCloseUP) + + self~connectButtonEvent(IDC_RB_DEFAULT, 'CLICKED', doDefault) + self~connectButtonEvent(IDC_RB_CUSTOM, 'CLICKED', doCustom) + + +/** initDialog() + * + * This is a busy initDialog(). We need to set up and configure the combo box + * and create and configure the tool tips. + */ +::method initDialog + expose comboBox cbEdit cbListBox lbRect editRect buttonRect ttEditTrack ttButtonTrack itemHeight + + comboBox = self~newComboBox(IDC_COMBOBOX) + + -- The tool tips are slightly higher than the default height of the combo box + -- items. So, when we position the tool tip over an item, it does not quite + -- fit. Making the item height slightly bigger makes things look a lot + -- better. + -- + -- If the item height is to be changed, be sure to do it before the items + -- are inserted. Otherwise when we get the client rect for the list box, its + -- vertical height will be incorrect. + itemHeight = comboBox~getItemHeight + itemHeight += 2 + comboBox~setItemHeight(itemHeight) + + entries = self~getComboItems + do e over entries + comboBox~add(e) + end + + comboBox~setCue("Select a city") + comboBox~setMinVisible(10) + + d = comboBox~getComboBoxInfo + cbEdit = d~textObj + cbListBox = d~listBoxObj + + self~calcRects(d) + + self~newRadioButton(IDC_RB_CUSTOM)~check + + -- Create a tracking tool tip for the selection field of the combo box. For a + -- drop-down list combo box this is actually the combo box itself. We still + -- use cbEdit, even though we know cbEdit and comboBox are the same. + -- + -- 1.) This tool tip is used for the selection field when the dropdown is open + ttEditTrack = self~createToolTip(IDC_TT_EDIT_TRACK) + + toolInfo = .ToolInfo~new(self, cbEdit, '', 'ABSOLUTE TRACK IDISHWND', .Rect~new) + ttEditTrack~addToolEx(toolInfo) + + self~connectToolTipEvent(IDC_TT_EDIT_TRACK, 'NEEDTEXT', onEditTrackNeedText) + self~connectToolTipEvent(IDC_TT_EDIT_TRACK, 'SHOW', onEditTrackShow) + + -- Create a tracking tool tip for the button portion of the combo box. + -- + -- 2.) This tool tip is used for the button when the dropdown is open. + ttButtonTrack = self~createToolTip(IDC_TT_BUTTON_TRACK) + + text = 'Press the button to close the drop down' + toolInfo = .ToolInfo~new(self, comboBox, text, 'ABSOLUTE TRACK IDISHWND', .Rect~new) + ttButtonTrack~addToolEx(toolInfo) + + self~connectToolTipEvent(IDC_TT_BUTTON_TRACK, 'SHOW', onButtonTrackShow) + + -- Create a tool tip for the combo box itself. + -- + -- 3.) This tool tip is used for the selection and button components when the + -- dropdown is closed. + ttComboBox = self~createToolTip(IDC_TT_CB_MAIN) + + toolInfo = .ToolInfo~new(comboBox, IDC_TI_EDITRECT, '', 'TRANSPARENT', editRect, IDC_TI_EDITRECT) + ret = ttComboBox~addToolEx(toolInfo) + + text = 'Press the button to open the drop down' + toolInfo = .ToolInfo~new(comboBox, IDC_TI_BUTTONRECT, text, 'TRANSPARENT', buttonRect, IDC_TI_BUTTONRECT) + ttComboBox~addToolEx(toolInfo) + + ttComboBox~manageAtypicalTool(comboBox, .array~of('NEEDTEXT', 'SHOW'), .array~of('ONCBNEEDTEXT', 'ONCBSHOW')) + + -- Create tool tip for the items of the combo box. + -- + -- 4.) This tool tip is for the individual items when the dropdown is open. + ttList = self~createToolTip(IDC_TT_CB_LISTBOX) + + toolInfo = .ToolInfo~new(cbListBox, IDC_TI_LISTBOX, '', 'TRANSPARENT', lbRect) + ttList~addToolEx(toolInfo) + + -- Now start the monitoring process for the list box tool. + ttList~manageAtypicalTool(cbListBox, .array~of('RELAY', 'NEEDTEXT', 'SHOW')) + + +/** onRelay() + * + * The onRelay() event handler is invoked by the monitor that the + * manageAtypicalTool() method sets up. It is invoked for every mouse message + * that is sent to the list box control. + * + * The monitor first informs us of the mouse message. This gives us a chance to + * examine the message *before* the tool tip sees it. + * + * This event handler here is the key to how this whole program works. + * + * All the rest of the code in the program is simply busy work, keeping track of + * what state we are in. In this method we determine where the mouse is and + * then determine how we have to configure all the tool tips we are using. + * + * We need to know, or to take into account, some facts about the combo box. 1 + * fact is that when the list box is dropped down, it captures the mouse. All + * mouse messages are then sent to the list box until it releases the capture + * when it closes up. This means that the pos argument can be anywhere on the + * screen. + * + * Fact number 2 is that the combo box will always tell us the index of the item + * that is *closest* to the mouse position. So, even if the mouse is on the + * other side of the screen, the combo box will still return a valid item index. + * It will be what ever item is closest to that mouse position, even if it is + * 500 pixels away. + * + * We need to track what item the mouse is over, and whether the mouse is over + * the client area of the combo box. Every time the location changes from over + * the clien to not over the client, and every time the item the mouse is over + * changes, the tool tips need to be updated. + * + * To handle the selection field and the button, we treat them a pseudo list box + * item. When the mouse is over either of them, it will not be over the list + * box client area. We *pretend* that it is by changing the value in the + * directory object returned by the hit test info method. We do a similar thing + * for the item index. We *pretend* that the selection field has an item index + * of 0 and that the button has an item index of -1. + * + * If we are, newly, over the selection field or button, we need to manually + * activate the tracking tool tip and send it the mouse position. In screen + * coordinates, not client coordinates. Other code in this program is + * responsible for hiding the tracking tool tips at the proper time. + * + * The monitor will pass all mouse messages on to the tool tip after we return + * from this method. This allows the tool tip to 'do its thing.' + */ +::method onRelay unguarded + expose currentItem currentText currentOnClient editOffsetRect buttonOffsetRect - + ttEditTrack ttEditActive cbEdit ttButtonTrack ttButtonActive comboBox + use arg toolTip, pos, mouseMsg, listBox + + -- Determine which, if any, item the mouse is over. + d = .directory~new + ret = listBox~hitTestInfo(pos, d) + + -- Treat the edit and button rects as though they are in the client area of + -- the list box and assign them a, fake, item index. + if pos~inRect(editOffsetRect) then do + d~inClientArea = .true + d~itemIndex = 0 + end + else if pos~inRect(buttonOffsetRect) then do + d~inClientArea = .true + d~itemIndex = -1 + end + + -- Save the old item and location and sent the current item and location to + -- where the mouse is at this moment. + oldItem = currentItem + oldOnClient = currentOnClient + currentItem = d~itemIndex + currentOnClient = d~inClientArea + + -- If mouse is over a new item or location, hide the ToolTip. Set our + -- current text to the text for the item we are now over. If we are not + -- on the client area, set the current text to the empty string. + if oldItem \== currentItem | oldOnClient \== currentOnClient then do + if currentOnClient then do + if d~itemIndex == -1 then do + p = pos~copy + listBox~client2Screen(p) + ttButtonTrack~trackActivate(self, comboBox, .true) + ttButtonActive = .true + turnTTEditActiveOff = .true + turnTTButtonActiveOff = .false + ttEditTrack~trackPosition(p) + end + else if d~itemIndex == 0 then do + p = pos~copy + listBox~client2Screen(p) + ttEditTrack~trackActivate(self, cbEdit, .true) + ttEditActive = .true + turnTTEditActiveOff = .false + turnTTButtonActiveOff = .true + ttEditTrack~trackPosition(p) + end + else do + turnTTButtonActiveOff = .true + turnTTEditActiveOff = .true + currentText = listBox~getText(d~itemIndex) + end + end + else do + turnTTButtonActiveOff = .true + turnTTEditActiveOff = .true + currentText = '' + end + + -- Each time we have a change, we close the current tool tip. The tool + -- tips are now configured for the *new* item the mouse is over. Which + -- may be not over an item at all, of course. When we return from this + -- handler, the mouse message will be relayed on to the tool tip, and it + -- will do its tool tip thing. + toolTip~pop + + if turnTTEditActiveOff, ttEditActive then do + ttEditTrack~trackActivate(self, cbEdit, .false) + ttEditActive = .false + end + + if turnTTButtonActiveOff, ttButtonActive then do + ttButtonTrack~trackActivate(self, comboBox, .false) + ttButtonActive = .false + end + end + + return 0 + + +/** onNeedText() + * + * The event handler for the NEEDTEXT event. This method is invoked by the + * monitor for the list box tool when that tool is requesting the text it should + * display. + * + * We set the text to the text of the current item the mouse is over. + */ +::method onNeedText unguarded + expose currentItem currentText + use arg toolTip, listBox, info + + info~text = currentText + + -- Return false so that the ToolTip does not store the text. We want it to + -- always ask us for the text because the mouse could be over any item. + return .false + + +/** onShow() + * + * The event handler for the SHOW event. This method is invoked by the monitor + * for the list box tool when that tool is notifiying the list box that it is + * about to show the tip. This gives us the chance to do a custom positioning + * of the tip. + * + * If we are not doing custom positioning we just return false. False tells the + * tool tip that it should position the tip itself. + * + * If we are doing the positioning, we set the postion we want and return true. + * True tells the tool tip that we already positioned the tip and it should not + * change its postion. + * + * To get the position we determine which item the mouse is over, in list box + * client coordinates and convert the client coordinates to screen coordinates. + * The position we want is the top left corner of the list box item. But, the + * tool tip tips are slightly taller than a list box item, so we shift the + * position up 3 pixels, which gives us a position that does not obscure either + * the item above or the item below. + */ +::method onShow unguarded + expose currentItem comboBox lbRect itemHeight doCustomPositioning + use arg toolTip, listBox, toolID + + if \ doCustomPositioning then return .false + + if currentItem > 0 then do + topIndex = comboBox~getFirstVisible + r = lbRect~copy + r~top = (currentItem - topIndex) * itemHeight + r~top -= 3 + listBox~client2screen(r) + + toolTip~setWindowPos(0, r~left, r~top, 0, 0, "NOACTIVATE NOSIZE") + return .true + end + + return .false + + +/** onCBNeetText() + * + * The event handler for the NEEDTEXT event. This method is invoked when the + * combo box tool tip is requesting the text for the tip. + * + * The combo box tool tip is a normal tool tip, there is no manageAtypicalTool + * monitor for this tool tip. Recall, that we set this tool tip up with 2 + * tools. One for the rectangle of the selection field and one for the + * rectangle of the button. We use the tool ID to detemine which tool we are + * invoked for. If it is the selection field, we return the selected item text. + * If it is the button, we return the button tip. + * + * We can only be invoked when the drop down is closed. + */ +::method onCBNeedText unguarded + use arg toolTip, comboBox, info + + if info~toolID == .constDir[IDC_TI_EDITRECT] then do + info~text = comboBox~selected + end + else if info~toolID == .constDir[IDC_TI_BUTTONRECT] then do + info~text = 'Press the button to open the drop down' + end + else do + -- Can not happen + info~text = '' + return .true + end + + return .false + + +/** onCBShow() + * + * The event handler for the SHOW event. This method is invoked when the + * combo box tool tip is about to show the tip. This gives us a chance to do + * custom positiong. If we are not doing custom positioning, we simple return + * false, telling the tool tip to position the tip itself. + * + * The combo box tool tip is a normal tool tip, there is no manageAtypicalTool + * monitor for this tool tip. Recall, that we set this tool tip up with 2 + * tools. One for the rectangle of the selection field and one for the + * rectangle of the button. We use the tool ID to detemine which tool we are + * invoked for. If it is the selection field, we use the postion of the + * selection field rectangle, convert it to screen coordinates and position the + * tip at the top left corner. + * + * If it is the button, we do the same thing, but position the tip immediately + * to right of the button. + * + * We can only be invoked when the drop down is closed. + */ +::method onCBShow unguarded + expose editRect buttonRect doCustomPositioning + use arg toolTip, comboBox, toolID + + if \ doCustomPositioning then return .false + + if toolID == .constDir[IDC_TI_EDITRECT] then do + r = editRect~copy + + comboBox~client2screen(r) + toolTip~setWindowPos(0, r~left, r~top, 0, 0, "NOACTIVATE NOSIZE NOZORDER") + return .true + end + else if toolID == .constDir[IDC_TI_BUTTONRECT] then do + r = buttonRect~copy + + comboBox~client2screen(r) + toolTip~setWindowPos(0, r~right, r~top, 0, 0, "NOACTIVATE NOSIZE NOZORDER") + return .true + end + + return .false + + +/** onEditTrackNeedText() + * + * This is the event handler for the NEEDTEXT event. It is invoked when the + * edit tracking tool tip needs the text to display for the selection field. + * + * We simply send it the text of the currently selected item. + */ +::method onEditTrackNeedText unguarded + use arg comboBox, toolTip, info + + info~text = comboBox~selected + return .false + + +/** onEditTrackShow + * + * This is the event handler for the SHOW event. It is invoked when the edit + * tracking tool tip is about to show the tip. It gives us the chance to do + * custom positioning of the tip. If we are not doing custom positioning of the + * tip we simply return false to tell the tool tip to position the tip itself. + * + * If we are positioing the tip, we place it directly over the selection field. + */ +::method onEditTrackShow unguarded + expose editRect doCustomPositioning + use arg comboBox, toolTip + + if \ doCustomPositioning then return .false + + r = editRect~copy + + comboBox~client2screen(r) + toolTip~setWindowPos(0, r~left, r~top, 0, 0, "NOACTIVATE NOSIZE NOZORDER") + return .true + + + +/** onButtonTrackShow + * + * This is the event handler for the SHOW event. It is invoked when the button + * tracking tool tip is about to show the tip. It gives us the chance to do + * custom positioning of the tip. If we are not doing custom positioning of the + * tip we simply return false to tell the tool tip to position the tip itself. + * + * If we are positioing the tip, we place it directly to the right of the + * button. + */ +::method onButtonTrackShow unguarded + expose buttonRect doCustomPositioning + use arg comboBox, toolTip + + if \ doCustomPositioning then return .false + + r = buttonRect~copy + + comboBox~client2screen(r) + toolTip~setWindowPos(0, r~right, r~top, 0, 0, "NOACTIVATE NOSIZE NOZORDER") + return .true + + +/** onCloseUp() + * + * Event handler for the CLOSEUP event. This method is invoked when the drop + * down list is closed. + * + * We have 2 tracking tool tips in this program. They must be manually shown + * and hidden. If one or the other is visble and the drop down is closed, it + * will remain on the screen. So, here we hide the tool tip if it is currently + * visible. + */ +::method onCloseup unguarded + expose ttEditTrack ttEditActive cbEdit ttButtonTrack ttButtonActive comboBox + + if ttEditActive then do + ttEditTrack~trackActivate(self, cbEdit, .false) + ttEditActive = .false + end + + if ttButtonActive then do + ttButtonTrack~trackActivate(self, comboBox, .false) + ttButtonActive = .false + end + + return 0 + + +/** doDefault() + * + * The event handler for the 'Tool Tip positions the tool tips' radio button + * click event. We just need to flip our flag. + */ +::method doDefault unguarded + expose doCustomPositioning + doCustomPositioning = .false + return 0 + + +/** doCustom() + * + * The event handler for the 'Application positions the tool tips' radio button + * click event. We just need to flip our flag. + */ +::method doCustom unguarded + expose doCustomPositioning + doCustomPositioning = .true + return 0 + + +/** getComboItems() + * + * Simple convenience method, returns an array of the items we will add to the + * combo box. + */ +::method getComboItems private + + entries = .array~of("New York, United States of America, North America", - + "Johannesburg, South Africa, Africa", - + "Cape Town, South Africa, Africa", - + "Saint Petersburg, Russia, Europe", - + "Mexico City, Mexico, North America", - + "Los Angles, United States of America, North America", - + "Casablanca, Morocco, Africa", - + "Pyongyang, North Korea, Asia", - + "New Taipei, Republic of China (Taiwan), Asia", - + "Addis Ababa, Ethiopia, Africa", - + "Moscow, Russia, Europe", - + "Yokohama, Japan, Asia", - + "Chongqing, China, Asia", - + "Berlin, Germany, Europe", - + "Rio de Janeiro, Brazil, South America", - + "Guangzhou, China, Asia", - + "São Paulo, Brazil, South America", - + "Karachi, Pakistan, Asia", - + "Istanbul, Turkey, Europe / Asia", - + ) + + return entries + + +/** calcRects() + * + * To properly set the tool info for our tool tips, and to properly position + * the tool tips when we do custom positioning, we need to calculate and save + * a number of rectangles. + * + * We start off with the client rectangles of the combo box, the drop down list + * box, the selection field, and the button. The client rects within the combo + * box do not include the borders of the controls. We want to adjust those + * rects so that they do include the borders. + * + * The other problem is that when the list box is dropped down, the list box + * has the mouse captured, so all mouse messages go to the list box and all + * mouse positions are relative to the client area of the list box. So, we + * need to calculate a rectangle for the selection field and the button that is + * in client coordinates of the list box. + * + * The 'd' argument passed in here is the .Directory object returned from + * getComboBoxInfo(). This directory object contains both the selection field + * client rect and the button client rect. + */ +::method calcRects private + expose comboBox cbEdit cbListBox lbRect editRect buttonRect editOffsetRect buttonOffsetRect + use arg d + + -- The button rect, edit rect, and lb rect do not include borders. We + -- basically want to adjust them to the combo box width and height. + cbRect = comboBox~clientRect + + lbRect = cbListBox~clientRect + editRect = d~textRect + buttonRect = d~buttonRect + + lbRect~left = cbRect~left + lbRect~right = cbRect~right + + -- The top and bottom coordinates of both the text and button rects have to + -- be in relationship to the client rect of the list box. I.e. the + -- bottoms are at the 0 coordinate of the list box client area and the tops + -- are at 0 - the height of the combo box. + height = cbRect~bottom - cbRect~top + + editRect~left = cbRect~left + editRect~top = cbRect~top + editRect~right = buttonRect~left + editRect~bottom = cbRect~bottom + + -- Button rect left stays the same. + buttonRect~top = cbRect~top + buttonRect~right = cbRect~right + buttonRect~bottom = cbRect~bottom + + editOffsetRect = editRect~copy + editOffsetRect~top -= height + editOffSetRect~bottom -= height + + buttonOffsetRect = buttonRect~copy + buttonOffsetRect~top -= height + buttonOffsetRect~bottom -= height + + + diff --git a/modules/windows/oodialog/controls/ToolTip/customPositionToolTip.h b/modules/windows/oodialog/controls/ToolTip/customPositionToolTip.h new file mode 100644 index 0000000..3b1f729 --- /dev/null +++ b/modules/windows/oodialog/controls/ToolTip/customPositionToolTip.h @@ -0,0 +1,44 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_TREEVIEW 100 +#define IDC_TREE 1003 +#define IDC_TT 1000 diff --git a/modules/windows/oodialog/controls/ToolTip/customPositionToolTip.rc b/modules/windows/oodialog/controls/ToolTip/customPositionToolTip.rc new file mode 100644 index 0000000..aba97fa --- /dev/null +++ b/modules/windows/oodialog/controls/ToolTip/customPositionToolTip.rc @@ -0,0 +1,53 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "customPositionToolTip.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TREEVIEW DIALOGEX 30, 30, 176, 234 +STYLE DS_3DLOOK | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Tree View Dialog" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + DEFPUSHBUTTON "OK", IDOK, 61, 210, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 116, 210, 50, 14 + CONTROL "", IDC_TREE, WC_TREEVIEW, WS_TABSTOP | WS_BORDER | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | TVS_INFOTIP, 10, 10, 156, 192 +} diff --git a/modules/windows/oodialog/controls/ToolTip/customPositionToolTip.rex b/modules/windows/oodialog/controls/ToolTip/customPositionToolTip.rex new file mode 100755 index 0000000..d112c5f --- /dev/null +++ b/modules/windows/oodialog/controls/ToolTip/customPositionToolTip.rex @@ -0,0 +1,202 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * ToolTip control example. + * + * This example demonstrates use info tips with a tree-view and do custom + * positiong of the tool tip. + * + * The appearance and functionality of the dialog in this example is exactly the + * same as that produced by the manageControlTool.rex example. It simple shows + * an easier way to achieve the same effect as that example. + * + * Here we use a simple application of the manageAtypicalTool() method. The + * manageControlTool.rex example is provided to better help the ooDialog + * programmer understand the manageAtypicalTool() method. The programmer should + * really examine both example programs. + * + * To customize the positioning of the info tip, we need to write an event + * handler for the ToolTips SHOW event. However, the ToolTip for the tree-views + * info tips is owned by the tree-view. Event notifications are sent to the + * tree-view and our dialog has no knowledge of them. + * + * To fix that, we use the getToolTips() method to get the tree-views ToolTip. + * We then use the manageAtypicalTool() method to monitor the event + * notifications sent to the tree-view and send the SHOW notification to our + * dialog instead of to the tree-view. All other events, including the mouse + * relay event, are left to go to the tree-view. This gives us the same + * functionality as the custom ToolTip that is set up in the manageControlToo + * example, with less work. + */ + + sd = locate() + .application~setDefaults('O', sd'customPositionToolTip.h', .false) + + dlg = .TreeViewDialog~new(sd'customPositionToolTip.rc', IDD_TREEVIEW) + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + + +::requires "ooDialog.cls" + +::class 'TreeViewDialog' subclass RcDialog + +::method initDialog + expose currentItem + + tv = self~newTreeView(IDC_TREE) + tv~setItemHeight(20) + + self~connectTreeViewEvent(IDC_TREE, 'GETINFOTIP') + self~populateTree(tv) + + -- Get the ToolTip the tree-view has created and is using. + toolTip = tv~getToolTips + + -- Set up the monitoring of the ToolTip notifications sent to the tree-view. + -- We only want to intercept the SHOW notification. Also, we do not want the + -- automatic monitoring and relaying of the mouse messages. In this way we + -- achieve what we want with minimal interference with the tree-view's + -- ToolTip. + -- + -- We have to use the NORELAY keyword to turn off the automatic + -- relaying of the mouse messages. NORELAY does not connect an event handler, + -- it simply turns relaying off. + + toolTip~manageAtypicalTool(tv, .array~of('NORELAY', 'SHOW')) + + +/** onGetInfoTip() + * + * This is the event handler for the tree-view's GETINFOTIP notification. It is + * invoked when the tree-view wants the text to display for a ToolTip. + * + * Note that we are sent the handle of the tree-view item that the ToolTip is + * for and the user data (item data) for that item. We set the item data for + * each item to the text to display for the ToolTip for that item. Which makes + * this very easy. We just return the userData sent to us. + * + * Note this also. Our onShow() event handler is invoked by our monitoring of + * the ToolTip notifications. That monitor has no knowledge of which item the + * ToolTip is going to be displayed for. So, we use the exposed currentItem + * variable to pass on our knowledge here of which item the ToolTip is going to + * display for. + */ +::method onGetInfoTip unguarded + expose currentItem + use arg id, hItem, text, maxLen, userData + + currentItem = hItem + return userData + + +/** onShow() + * + * This is our event handler for the tree-view's ToolTip SHOW event + * notification. The method is invoked when our process monitoring the + * notifications sent to the tree-view, intercepts the SHOW notification. + * + * Normally the ToolTip window is placed below the item. This often over-laps + * and obscures the other items. What we want is to place the ToolTip window to + * the right and centered with the item. This way nothing is obscured. + * + * The custom positioning of the ToolTip window is straight-forward. We get the + * bounding rectangle of the tree-view item's label, convert the point to client + * coordinates, and then reposition the ToolTip window to where we want it. + * + * Note that we must return .true then so that the ToolTip is informed not to + * position the window in its default position. + */ +::method onShow unguarded + expose currentItem + use arg toolTip, treeView + + r = .Rect~new + if treeView~getItemRect(currentItem, r) then do + treeView~client2screen(r) + + toolTip~setWindowPos(0, r~right + 5, r~top, 0, 0, "NOACTIVATE NOSIZE NOZORDER") + return .true + end + + return .false + + +/** populateTree() + * + * This is a private method used to populate the tree-view control with our + * items. + * + * Note that each item has an item data object assigned to it. In this case the + * object is a string. The string is the text to display for the tool tip for + * that item. + */ +::method populateTree private + use strict arg tv + + hItem = tv~add("Peter", , ,"BOLD EXPANDED", , 'Data unique to Peter.') + + hItem = tv~add(,"Mike", , ,"EXPANDED", , 'Mike talks a lot.') + + data = 'George was famous once.'.endOfLine'He is unknown to my'.endOfLine'niece.' + hItem = tv~add(, ,"George", , , , , data) + + hItem = tv~add(, ,"Monique", , , , , 'Monique has never been to France.') + + hItem = tv~add(, , ,"John", , , , , 'John owns 4 dogs.') + + hItem = tv~add(, ,"Chris", , , , , 'Chris will never be president.') + + hItem = tv~add( , "Maud", , , , , 'Maud likes to bake.') + + hItem = tv~add( , "Ringo", , , , , 'Ringo has a LOT of money.') + + hItem = tv~add("Paul", , ,"BOLD EXPANDED", , "Two roads lead to Paul's house.") + + hItem = tv~add( , "Dave", , , , , 'No one lives with Dave.') + + hItem = tv~add( , "Sam", , , , , 'Sam loves pizza.') + + hItem = tv~add( , "Jeff", , , , , 'Jeff rides his bike to work.') + + hItem = tv~add("Mary", , ,"BOLD EXPANDED", , 'Mary owes $49.50 to her dentist.') + + hItem = tv~add( , "Helen", , , , , 'A closer look at Helen is warranted.') + + hItem = tv~add( , "Michelle", , , , , 'The Toyota Camray belongs to Michelle.') + + hItem = tv~add( , "Diana", , , , , 'Go go Chargers.') diff --git a/modules/windows/oodialog/controls/ToolTip/manageControlTool.h b/modules/windows/oodialog/controls/ToolTip/manageControlTool.h new file mode 100644 index 0000000..3b1f729 --- /dev/null +++ b/modules/windows/oodialog/controls/ToolTip/manageControlTool.h @@ -0,0 +1,44 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_TREEVIEW 100 +#define IDC_TREE 1003 +#define IDC_TT 1000 diff --git a/modules/windows/oodialog/controls/ToolTip/manageControlTool.rc b/modules/windows/oodialog/controls/ToolTip/manageControlTool.rc new file mode 100644 index 0000000..3a0184a --- /dev/null +++ b/modules/windows/oodialog/controls/ToolTip/manageControlTool.rc @@ -0,0 +1,53 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "manageControlTool.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TREEVIEW DIALOGEX 30, 30, 176, 234 +STYLE DS_3DLOOK | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Tree View Dialog" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + DEFPUSHBUTTON "OK", IDOK, 61, 210, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 116, 210, 50, 14 + CONTROL "", IDC_TREE, WC_TREEVIEW, WS_TABSTOP | WS_BORDER | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | TVS_NOTOOLTIPS, 10, 10, 156, 192 +} diff --git a/modules/windows/oodialog/controls/ToolTip/manageControlTool.rex b/modules/windows/oodialog/controls/ToolTip/manageControlTool.rex new file mode 100755 index 0000000..6926a1b --- /dev/null +++ b/modules/windows/oodialog/controls/ToolTip/manageControlTool.rex @@ -0,0 +1,293 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * ToolTip control example. + * + * This example demonstrates several advanced techniques in using ToolTips. + * + * Typically a single tool is created for a dialog control. This works fine + * for creating tools for, say, buttons. Even if you have 20 buttons, it is + * pretty reasonable to create 20 tools in a ToolTip. + * + * But, what if you want to display a tip for each item in a tree-view? What if + * the tree-view has hundreds, or even thousands, of items. Creating several + * thousand tools is no longer reasonable. One technique is to create one tool + * and dynamically make it appear to be multiple tools. + * + * That technique is demonstrated in this example. We use a tree-view control + * to show the technique. The basic principle is to track where the mouse is, + * and dynamically update the tool each time it moves from one item to another. + * + * Normally you would program this by monitoring the mouse moves and updating + * the tool when the mouse moves require it. To do this, you can not use the + * SUBCLASS flag for the tool, because you need to dynamically update tool + * _before_ the tool sees the mouse move. You would monitor the mouse moves, + * decide whether to update or not the tool, and then forward every mouse move + * on to the tool. For the puposes of discussion, we will refer to the + * forwarding of the mouse moves as 'relaying' the moves. And, actually for the + * ToolTip to work correctly it needs to see all the mouse related messages. + * So, the relaying is really relaying all mouse messages, not just the mouse + * move message. + * + * This presents a problem in ooDialog because mouse messages are sent to the + * window under the mouse, in this case the tree-view. In addition, if we set + * up a tool for the tree-view, but can not use the SUBCLASS flags, the ToolTip + * event notifications are sent to the tree-view, not to our dialog. + * + * In this case, we need a way to monitor the mouse messages sent to the + * tree-view and a way to intercept the ToolTip event notifications that would + * be sent to the tree-view. For ToolTips, ooDialog provides a method, the + * manageAtypicalTool() method, that provides this functionality. + * + * This method monitors all mouse messages and relays the messages to the tool. + * Before it relays the mouse messages to the took, it will invoke a method in + * the Rexx dialog for the relay event. In addition, it intercepts all the + * ToolTip event notifications sent to the dialog control and invokes a method + * in the Rexx dialog for each event. + * + * Of course, the application may not need to have an event handler for all the + * events, or even for the relay event. So, manageAtypicalTool() allows the + * programmer to just connect the events it needs. + * + * Although this example just focuses on a specific use of manageAtypicalTool(), + * the method can be used in any situation where custom ToolTips are needed for + * dialog controls. The same principles that necessitate its use here, will be + * found in many situations. + * + * Note that in this specific case, there is an easier way to produce the same + * results as this example does. The customPositionToolTip.rex example shows + * how to use the easier method. However, this example is very useful in + * showing how the manageAtypicalToo() works. The principles here can be used + * in other situations. + */ + + sd = locate() + .application~setDefaults('O', sd'manageControlTool.h', .false) + + dlg = .TreeViewDialog~new(sd'manageControlTool.rc', IDD_TREEVIEW) + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + + +::requires "ooDialog.cls" + +::class 'TreeViewDialog' subclass RcDialog + +::method initDialog + expose currentItem currentLocation currentText + + -- These variables are used to help track which tool needs to be shown. + currentItem = 0 + currentText = '' + currentLocation = 'NOWHERE' + + tv = self~newTreeView(IDC_TREE) + + -- Set up our ToolTip + tt = self~createToolTip(IDC_TT) + + rect = tv~clientRect + + -- We need to specify very precisely the attributes of the tool we are going + -- to add. We can not do that using the addTool() or addToolRect() + -- convenience methods. So we need a ToolInfo object and to use the + -- addToolEx() method. + + toolInfo = .ToolInfo~new(tv, 10, '', 'TRANSPARENT', rect) + tt~addToolEx(toolInfo) + + tt~setMaxTipWidth(250) + + -- Set up our tree-view and populate it. + tv~setItemHeight(20) + self~populateTree(tv) + + -- Now start the monitoring process. + tt~manageAtypicalTool(tv, .array~of('RELAY', 'NEEDTEXT', 'SHOW')) + + +/** onRelay() + * + * This is the event handler for the mouse message relaying event. It is + * invoked by our monitoring process for every mouse message. The method is + * invoked _before_ the monitor relays the mouse message to the ToolTip. + * + * This method is crucial to how this example works. For every mouse message, + * we calculate if the mouse is still over the label of the same item it was + * over previously. If it is not, we hide the ToolTip window by invoking the + * pop(). + * + * After we return form this method, the mouse message is forwarded on to the + * ToolTip to let it do its ToolTip thing. When the ToolTip decides the mouse + * has hovered long enough in one spot, it displays its window. Since we have + * set the current text to the string for the tree-view item when the mouse + * first moved over the item, the correct "tool" text is displayed. + * + * The text to display is actually passed on to the ToolTip from our onNeedTex() + * method. + */ +::method onRelay unguarded + expose currentItem currentText currentLocation + use arg toolTip, pos, mouseMsg, treeView + + -- Determine which, if any, item the mouse is over. + d = treeView~hitTestInfo(pos) + + -- Save the old item and location and sent the current item and location to + -- where the mouse is at this moment. + oldItem = currentItem + oldLocation = currentLocation + currentItem = d~hItem + currentLocation = d~location + + -- If mouse is over a new item or location, hide the ToolTip. Set our + -- current text to the text for the item we are now over. If we are not + -- over the label of an item, set the current text to the empty string. + if oldItem \== currentItem | oldLocation \== currentLocation then do + if currentItem <> 0, currentLocation~wordPos('ONLABEL') <> 0 then do + currentText = treeView~getItemData(currentItem) + end + else do + currentText = '' + end + toolTip~pop + end + + return 0 + + +/** onNeedText() + * + * This is the event handler for the ToolTip's NEEDTEXT event notification. + * + * The notification was actually sent to the tree-view, but, our monitor process + * has intercepted the notification and sent it to us instead of the tree-view. + * + * The real work was already done in the onRelay() method. All we need to do is + * set the TEXT index in the info .Directory object to what the onRelay() method + * set the current text to. + */ +::method onNeedText unguarded + expose currentItem currentText + use arg toolTip, treeView, info, userData, flags + + info~text = currentText + + -- Return false so that the ToolTip does not store the text. We want it to + -- always ask us for the text because the mouse could be over any item. + return .false + + + +/** onShow() + * + * This is our event handler for the ToolTip's SHOW event notification. + * + * The notification was actually sent to the tree-view, but our monitor process + * has intercepted the notificatio and sent it to us instead of the tree-view. + * + * Normally the ToolTip places its window below the tree-view item. This often + * over-laps and obscures the other items. What we want is to place the ToolTip + * window to the right and centered with the item. This way nothing is + * obscured. + * + * The custom positioning of the ToolTip window is straight-forward. We get the + * bounding rectangle of the tree-view item's label, convert the point to client + * coordinates, and then reposition the ToolTip window to where we want it. + * + * Note that we must return .true then so that the ToolTip is informed not to + * position the window in its default position. + */ +::method onShow unguarded + expose currentItem + use arg toolTip, treeView + + r = .Rect~new + if treeView~getItemRect(currentItem, r) then do + treeView~client2screen(r) + + toolTip~setWindowPos(0, r~right + 5, r~top, 0, 0, "NOACTIVATE NOSIZE NOZORDER") + return .true + end + + return .false + + +/** populateTree() + * + * This is a private method used to populate the tree-view control with our + * items. + * + * Note that each item has an item data object assigned to it. In this case the + * object is a string. The string is the text to display for the tool tip for + * that item. + */ +::method populateTree private + use strict arg tv + + hItem = tv~add("Peter", , ,"BOLD EXPANDED", , 'Data unique to Peter.') + + hItem = tv~add(,"Mike", , ,"EXPANDED", , 'Mike talks a lot.') + + data = 'George was famous once.'.endOfLine'He is unknown to my'.endOfLine'niece.' + hItem = tv~add(, ,"George", , , , , data) + + hItem = tv~add(, ,"Monique", , , , , 'Monique has never been to France.') + + hItem = tv~add(, , ,"John", , , , , 'John owns 4 dogs.') + + hItem = tv~add(, ,"Chris", , , , , 'Chris will never be president.') + + hItem = tv~add( , "Maud", , , , , 'Maud likes to bake.') + + hItem = tv~add( , "Ringo", , , , , 'Ringo has a LOT of money.') + + hItem = tv~add("Paul", , ,"BOLD EXPANDED", , "Two roads lead to Paul's house.") + + hItem = tv~add( , "Dave", , , , , 'No one lives with Dave.') + + hItem = tv~add( , "Sam", , , , , 'Sam loves pizza.') + + hItem = tv~add( , "Jeff", , , , , 'Jeff rides his bike to work.') + + hItem = tv~add("Mary", , ,"BOLD EXPANDED", , 'Mary owes $49.50 to her dentist.') + + hItem = tv~add( , "Helen", , , , , 'A closer look at Helen is warranted.') + + hItem = tv~add( , "Michelle", , , , , 'The Toyota Camray belongs to Michelle.') + + hItem = tv~add( , "Diana", , , , , 'Go go Chargers.') diff --git a/modules/windows/oodialog/controls/ToolTip/musicNote.ico b/modules/windows/oodialog/controls/ToolTip/musicNote.ico new file mode 100644 index 0000000000000000000000000000000000000000..dfc5da31a37a0efff72f6d191c6ef9f716b97a2f GIT binary patch literal 51881 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 +#include +#include +#include "treeViewCustomDraw.h" + + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +IDD_ADD_TREE_ITEM DIALOG 0, 0, 209, 91 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Add New Item" +FONT 10, "MS Shell Dlg" +{ + LTEXT "Name:", IDC_STATIC, 10, 13, 20, 8, SS_LEFT, WS_EX_RIGHT + EDITTEXT IDC_EDIT_NAME, 34, 11, 106, 14, ES_AUTOHSCROLL + GROUPBOX "Add new item as:", IDC_STATIC, 15, 32, 123, 49 + AUTORADIOBUTTON "Sibling", IDC_RB_SIBLING, 23, 46, 32, 10, WS_TABSTOP + AUTORADIOBUTTON "Child", IDC_RB_CHILD, 23, 63, 32, 10, WS_TABSTOP + AUTOCHECKBOX "Folder", IDC_CHK_FOLDER, 85, 46, 41, 10 + DEFPUSHBUTTON "OK", IDOK, 149, 47, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 149, 67, 50, 14 +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TREE_DLG DIALOG 40, 60, 274, 311 +STYLE DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_GROUP | WS_MAXIMIZEBOX | WS_POPUP | WS_SYSMENU +CAPTION "Crazy Sam's Emporium - Inventory" +FONT 10, "MS Shell Dlg" +{ + CONTROL "Tree", IDC_TREE, WC_TREEVIEW, WS_BORDER | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS | TVS_SHOWSELALWAYS | TVS_DISABLEDRAGDROP | TVS_INFOTIP, 10, 10, 254, 231 + PUSHBUTTON "New Item", IDC_PB_NEW, 10, 250, 62, 14, WS_GROUP + PUSHBUTTON "Delete Item", IDC_PB_DELETE, 10, 268, 62, 14 + PUSHBUTTON "Item Information", IDC_PB_INFO, 10, 287, 62, 14 + PUSHBUTTON "Reverse Sort", IDC_PB_SORT, 89, 250, 62, 14, WS_GROUP + PUSHBUTTON "Expand All", IDC_PB_EXP_ALL, 89, 268, 62, 14 + PUSHBUTTON "Collapse All", IDC_PB_COL_ALL, 89, 287, 62, 14 + PUSHBUTTON "Help", IDHELP, 202, 268, 62, 14 + PUSHBUTTON "Close", IDCANCEL, 202, 287, 62, 14 +} diff --git a/modules/windows/oodialog/controls/TreeView/treeViewCustomDraw.inp b/modules/windows/oodialog/controls/TreeView/treeViewCustomDraw.inp new file mode 100644 index 0000000..ebf79ea --- /dev/null +++ b/modules/windows/oodialog/controls/TreeView/treeViewCustomDraw.inp @@ -0,0 +1,105 @@ +"Products",0,1,"EXPANDED", ,"Products" +,"Computers",0,1,,,"Computers" +,,"Motherboards",0,1,,,"Motherboards" +,,,"SCSI Motherboards",0,1,,,"SCSI Motherboards" +,,,,"Motherboard A",2,3,,,"Motherboard A" +,,,,"Motherboard B",2,3,,,"Motherboard B" +,,,,"...",2,3,,,"..." +,,,"IDE Motherboards",0,1,,,"IDE Motherboards" +,,,,"Motherboard A",2,3,,,"Motherboard A" +,,,,"Motherboard B",2,3,,,"Motherboard B" +,,,,"...",2,3,,,"..." +,,"PC Drives",0,1,,,"PC Drives" +,,,"IDE Drives",0,1,,,"IDE Drives" +,,,,"Drive A",2,3,,,"Drive A" +,,,,"Drive B",2,3,,,"Drive B" +,,,,"...",2,3,,,"..." +,,,"SCSI Drives",0,1,,,"SCSI Drives" +,,,,"Drive A",2,3,,,"Drive A" +,,,,"Drive B",2,3,,,"Drive B" +,,,,"...",2,3,,,"..." +,,,"CD ROM Drives",0,1,,,"CD ROM Drives" +,,,,"Internal CD ROM Drives",0,1,,,"Internal CD ROM Drives" +,,,,,"Drive A",2,3,,,"Drive A" +,,,,,"Drive B",2,3,,,"Drive B" +,,,,,"...",2,3,,,"..." +,,,,"External CD ROM Drives",0,1,,,"External CD ROM Drives" +,,,,,"Drive A",2,3,,,"Drive A" +,,,,,"Drive B",2,3,,,"Drive B" +,,,,,"...",2,3,,,"..." +,,,,,"Housings for External CD ROM Drives",0,1,,,"Housings for External CD ROM Drives" +,,,,,,"Housing A",2,3,,,"Housing A" +,,,,,,"Housing B",2,3,,,"Housing B" +,,,,,,"...",2,3,,,"..." +,,,"CD Recorders",0,1,,,"CD Recorders" +,,,,"CD Recorder A",2,3,,,"CD Recorder A" +,,,,"CD Recorder B",2,3,,,"CD Recorder B" +,,,,"...",2,3,,,"..." +,,"Graphic Cards & Monitors",0,1,,,"Graphic Cards & Monitors" +,,,"Graphic Cards",0,1,,,"Graphic Cards" +,,,"Monitors",0,1,,,"Monitors" +,,,,"17 inch Monitors",0,1,,,"17 inch Monitors" +,,,,,"Monitor A",2,3,,,"Monitor A" +,,,,,"Monitor B",2,3,,,"Monitor B" +,,,,,"...",2,3,,,"..." +,,,,"19 inch Monitors",0,1,,, +,,,,,"Monitor A",2,3,,,"Monitor A" +,,,,,"Monitor B",2,3,,,"Monitor B" +,,,,,"...",2,3,,,"..." +,,"Modems & Fax",0,1,,,"Modems & Fax" +,,"Software",0,1,,,"Software" +,,,"Office Software",0,1,,,"Office Software" +,,,"Graphic Software",0,1,,,"Graphic Software" +,,,"Games",0,1,,,"Games" +,,"Printers",0,1,,,"Printers" +,,,"Ink Jet Printers",0,1,,,"Ink Jet Printers" +,,,"Laser Printers",0,1,,,"Laser Printers" +,"Audio Video and Home Entertainment",0,1,,,"Audio Video and Home Entertainment" +,,"Hi-Fi Components",0,1,,,"Hi-Fi Components" +,,"Loudspeakers",0,1,,,"Loudspeakers" +,,"Microphones",0,1,,,"Microphones" +,,"Video and Accessories",0,1,,,"Video and Accessories" +,"Home Electronics",0,1,,,"Home Electronics" +,,"Alarm Systems",0,1,,,"Alarm Systems" +,,,"Alarm Sensors",0,1,,,"Alarm Sensors" +,,,"Security Lights",0,1,,,"Security Lights" +,,"Weather Monitoring",0,1,,,"Weather Monitoring" +,,"Analogue and Digital Clocks",0,1,,,"Analogue and Digital Clocks" +,,"Ventilation Equipment",0,1,,,"Ventilation Equipment" +,,"Halogen Lighting",0,1,,,"Halogen Lighting" +,"Communications",0,1,,,"Communications" +,"Car Audio and Car Products",0,1,,,"Car Audio and Car Products" +,"Books",0,1,,,"Books" +,,"Software",0,1,,,"Software" +,,,"Book A",2,3,,,"Book A" +,,,"Book B",2,3,,,"Book B" +,,,"...",2,3,,,"..." +,,"Hardware",0,1,,,"Hardware" +,,,"Book A",2,3,,,"Book A" +,,,"Book B",2,3,,,"Book B" +,,,"...",2,3,,,"..." +,,"Introduction to Electronic",0,1,,,"Introduction to Electronic" +,,,"Book A",2,3,,,"Book A" +,,,"Book B",2,3,,,"Book B" +,,,"...",2,3,,,"..." +,,"Solar and Alternative Energy",0,1,,,"Solar and Alternative Energy" +,,,"Book A",2,3,,,"Book A" +,,,"Book B",2,3,,,"Book B" +,,,"...",2,3,,,"..." +,,"Batteries/Chargers and Power Supplies",0,1,,,"Batteries/Chargers and Power Supplies" +,,,"Book A",2,3,,,"Book A" +,,,"Book B",2,3,,,"Book B" +,,,"...",2,3,,,"..." +,,"Car Mechanics",0,1,,,"Car Mechanics" +,,,"Book A",2,3,,,"Book A" +,,,"Book B",2,3,,,"Book B" +,,,"...",2,3,,,"..." +,,"Audio / Video & Home Entertainment",0,1,,,"Audio / Video & Home Entertainment" +,,,"Book A",2,3,,,"Book A" +,,,"Book B",2,3,,,"Book B" +,,,"...",2,3,,,"..." +,,"Satellite Technology",0,1,,,"Satellite Technology" +,,,"Book A",2,3,,,"Book A" +,,,"Book B",2,3,,,"Book B" +,,,"...",2,3,,,"..." +,"Special Offers",0,1, ,"1","Special Offers" diff --git a/modules/windows/oodialog/controls/TreeView/treeViewCustomDraw.rex b/modules/windows/oodialog/controls/TreeView/treeViewCustomDraw.rex new file mode 100755 index 0000000..ce3390e --- /dev/null +++ b/modules/windows/oodialog/controls/TreeView/treeViewCustomDraw.rex @@ -0,0 +1,850 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * treeViewCustomDraw.rex + * + * This example demonstrates many of the features of a tree-view control. + * Including, but not limited to: label editing of items, custom draw, using + * image lists to supply the icons for tree-view items, using a custom compare + * function in the Rexx dialog to sort the tree-view items, displaying info + * tips, etc.. + * + * Note: this program uses the public routine, locate(), to get the full path + * name to the directory this source code file is located. In places, the + * variable holding this value has been callously abbreviated to 'sd' which + * stands for source directory. + * + */ + + -- Get our source code file location. + srcDir = locate() + + -- Use the global .constDir for symbolic IDs and turn automatic data + -- detection off. + .application~setDefaults('O', srcDir'rc\treeViewCustomDraw.h', .false) + + dlg = .InventoryDlg~new(srcDir"rc\treeViewCustomDraw.rc", IDD_TREE_DLG) + if dlg~initCode = 0 then do + ret = dlg~execute("SHOWTOP") + end + +return 0 + +::requires "ooDialog.cls" -- Require the ooDialog framework. + + +/*- TreeViewConstants - Class - - - - - - - - - - - - - - - - - - - - - - - - *\ + + This mixin class defines some constant values and is inherited by the two + dialog classes in this example. + +\*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +::class 'TreeViewConstants' mixinclass Object +::attribute BMP_FILE get + sd = locate() + return sd"rc\treeViewCustomDraw.bmp" -- Icons for selected/not-selected items. +::attribute TREE_FILE get + sd = locate() + return sd"treeViewCustomDraw.inp" -- Input file with the items to build the tree. +::attribute ITEM_FILE get + sd = locate() + return sd"treeViewCustomDrawi.inp" -- Input file with dynamically added items. + +::constant APPLICATION_TITLE "Crazy Sam's Emporium - Inventory" + +::constant UNSELECTED_FOLDER 0 -- Index for the icon of an unselected folder item +::constant SELECTED_FOLDER 1 -- Index for the icon of a selected folder item +::constant UNSELECTED_LEAF 2 -- Index for the icon of an unselected leaf item +::constant SELECTED_LEAF 3 -- Index for the icon of a selected leaf item + + +/*- InventoryDlg - Class- - - - - - - - - - - - - - - - - - - - - - - - - - - *\ + + This is the main dialog class for this example. It contains the tree-view + control that the example is all about. + +\*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +::class 'InventoryDlg' subclass RcDialog inherit CustomDraw TreeViewConstants + +/** isLeafItem() [class method] + * + * The isLeafItem() method provides a convenient way to test if any tree-view + * item is a leaf item rather than a folder item. Leaf items and folder items + * in this example use different icon images, so we just test which icon is set + * for the item. + */ +::method isLeafItem class + use strict arg treeView, item + + info. = treeView~itemInfo(item) + +return info.!Image == self~UNSELECTED_LEAF + + +/** init() + * + * Initialization of the Rexx dialog object. We do several things here. + * + * 1.) Initialize the super class. Never invoke any method on a dialog class + * before the super class is initialized. + * + * 2.) So a sanity check to ensure the data files needed can be found. + * + * 3.) Connect the event handlers for the tree-view. + * + * 4.) Create custom colors to draw the individual items in the tree-view. + * + * 5.) Initialize the custom draw interface and register the tree-view control + * to use custom draw. + */ +::method init + expose bkClr oddLevelClr evenLevelClr selectedClr leafClr + use arg rcFile, idDlg + + self~init:super(rcFile, idDlg) + if self~initCode <> 0 then return self~initCode + + if self~checkForRequiredFiles == .false then do + self~initCode = 17 + return self~initCode + end + + -- Connect dialog control events to methods in the Rexx dialog. + self~connectTreeViewEvent(IDC_TREE, "EXPANDING", "onExpanding", .true) + self~connectTreeViewEvent(IDC_TREE, "DEFAULTEDIT") + self~connectTreeViewEvent(IDC_TREE, "KEYDOWN", "onKeyDown") + self~connectTreeViewEvent(IDC_TREE, "GETINFOTIP", "onGetInfoTip") + + self~connectButtonEvent(IDC_PB_NEW, "CLICKED", "onNewItem") + self~connectButtonEvent(IDC_PB_DELETE, "CLICKED", "onDeleteItem") + self~connectButtonEvent(IDC_PB_SORT, "CLICKED", "onSortChildren") + self~connectButtonEvent(IDC_PB_EXP_ALL, "CLICKED", "onExpandAll") + self~connectButtonEvent(IDC_PB_COL_ALL, "CLICKED", "onCollapseAll") + self~connectButtonEvent(IDC_PB_INFO, "CLICKED", "onItemInfo") + + -- Create the custom colors use to draw the tree-view items + bkClr = self~RGB(250, 250, 250) + oddLevelClr = self~RGB( 82, 61, 0) + evenLevelClr = self~RGB( 0, 20, 82) + selectedClr = self~RGB( 82, 0, 20) + leafClr = self~RGB( 0, 82, 20) + + -- Initialize the custom draw interface and register the tree-view control + -- to use custom draw. + self~customDraw + self~customDrawControl(IDC_TREE, 'TreeView') + +return 0 + +/** initDialog() + * + * Just as the init() method is for initializing the Rexx dialog object, the + * initDialog() method is used to initialize the underlying Windows dialog. + * Some things, like inserting the items into a tree-view, can only be done + * after the Windows dialog exists. Those types of things are done here. + */ +::method initDialog + expose tv + + tv = self~newTreeView("IDC_TREE") + + -- Set the image list for the tree-vies + image = .Image~getImage(self~BMP_FILE) + imageList = .ImageList~create(.Size~new(16, 12), 'COLOR8', 5, 2) + if \image~isNull, \imageList~isNull then do + imageList~add(image) + tv~setImageList(imageList, 'NORMAL') + image~release + end + + -- Read the file containing the tree input data and build the tree. + do while lines(self~TREE_FILE) + args = self~makeArgs(linein(self~TREE_FILE)) + tv~sendWith('add', args) + end + + -- Select the item with the text of Computers. + hItem = tv~find('Computers') + if hItem \== 0 then tv~select(hItem) + +return 0 + + +/*- - - - - - - - - - Event handler(s) - - - - - - - - - - - - - - - - - - - -*/ + +/** onCustomDraw() + * + * This is the event handler for the custom draw event. Certain of the dialog + * controls in Windows support custom draw. Those controls send custom draw + * event notifications through out the paint cycle when the control is drawing + * or redrawing itself + * + * Please read the custom draw documentation in the ooDialog reference manual to + * fully understand the details. + * + * We take advantage of custom draw here to paint each individual tree-view item + * a custom color depending on exactly which item is about to be drawn. + * + * Our scheme is relatively simple. Every other level of the tree is painted an + * alternating color. If an item is selected, it is painted a reddish color to + * match the reddish selected icon. If not selected and a leaf node, we paint + * it a greenish color to match the non-folder, non-selected greenish icon. + */ +::method onCustomDraw unguarded + expose tv bkClr oddLevelClr evenLevelClr selectedClr leafClr + use arg tvcds + + if tvcds~drawStage == self~CDDS_ITEMPREPAINT then do + tvcds~reply = self~CDRF_NEWFONT + + selected = tv~selected + isLeaf = .InventoryDlg~isLeafItem(tv, tvcds~item) + + if selected == tvcds~item then do + tvcds~clrText = selectedClr + tvcds~clrTextBk = bkClr + end + else if isLeaf then do + tvcds~clrText = leafClr + tvcds~clrTextBk = bkClr + end + else if tvcds~level // 2 == 1 then do + tvcds~clrText = oddLevelClr + tvcds~clrTextBk = bkClr + end + else do + tvcds~clrText = evenLevelClr + tvcds~clrTextBk = bkClr + end + + return .true + end + + return .false + + +/** onExpanding() + * + * This is the event handler for the EXPANDING event. The method is invoked + * when a tree-view item is about to be expanded or collapsed. The method is + * invoked before the item is expanded or collapsed. + * + * This method demonstrates dynamically adding items to the tree. The node, + * 'Special Offers' is initially added to the tree during initDialog with no + * children. + * + * When the user expands the node, the child items for the node are dynamically + * added here. The items are loaded from a file in the same manner as the + * original items are loaded from a file to build the tree. + * + * Note that the fourth argument to connectTreeViewEvent() was used for the + * EXPANDING event and set to true. This causes the interpreter to wait for the + * reply from this event handler, before it replies to the operating system. If + * the interpreter were to not wait for the reply, the tree-view control would + * immediately expand the item before the children were added. + * + * When the user collapses the node, all its children items are removed. This + * is done through the collapseAndReset method, which collapse the item and also + * tells the tree-view control to deallocate the children. + */ +::method onExpanding unguarded + expose tv + use arg tree, item, what, extra + + itemInfo. = tv~itemInfo(item) + + if itemInfo.!TEXT = "Special Offers" then do + if what == "EXPANDED", tv~child(item) == 0 then do + do while lines(self~ITEM_FILE) + args = self~makeArgs(item, , linein(self~ITEM_FILE)) + newItem = tv~sendWith('insert', args) + end + end + else if what == "COLLAPSED", tv~child(item) \== 0 then do + tv~collapseAndReset(item) + end + end + +return .true + + +/** onKeyDown() + * + * This is the event handler for the key down event. It is invoked each time + * the user presses a key when the tree-view has the focus. + * + * We examime the key pressed to see if it is the insert or delete key. + * + * On the insert key we simulate pushing the 'New Item' push button by invoking + * the event handler for that button. This allows the user to add a new tree- + * view item. + * + * On the delete key, we delete the selected item. + */ +::method onKeyDown unguarded + expose tv + use arg treeId, key + + if key == .VK~DELETE then + tv~delete(tv~Selected) + else if key == .VK~INSERT then + self~onNewItem + +return 0 + +/** onNewItem() + * + * This is the event handler for the 'New Item' push button. It is invoked when + * the user clicks that button. + * + * We put up a dialog that allows the user to fill out the details for a new + * tree-view item and insert it into the tree-view. + */ +::method onNewItem unguarded + expose tv + + sd = locate() + dlg = .NewTreeItemDlg~new(sd"rc\treeViewCustomDraw.rc", IDD_ADD_TREE_ITEM, tv) + dlg~execute + +return 0 + + +/** onDeleteItem() + * + * This is the event handler for the 'Delete Item' push button. This method is + * invoked when the user clicks that button. + * + * We expand the selected item and all its children recursively. + */ +::method onDeleteItem unguarded + expose tv + + selected = tv~selected + if selected == 0 then do + title = self~APPLICATION_TITLE~subword(1, 3) '- Warning' + msg = "There is no tree-view item selected. If you" || .endOfLine ||- + "continue, all items will be deleted." || .endOfLine~copies(2) ||- + "Do you want to continue and delete all items?" + + ret = MessageDialog(msg, self~hwnd, title, 'YESNO', 'WARNING', 'DEFBUTTON2') + if ret == self~IDNO then return 0 + end + + tv~delete(selected) +return 0 + + +/** onGetInfoTip() + * + * This is the event handler for the INFOTIP event. It is invoked when the + * tree-view wants the text to display in the info tip. + * + * If we return the empty string, then no info tip is displayed. Otherwise, the + * text returned is displayed. Here, we only return text when the itemData is + * the string: '...' In that case we return some text. In all other cases we + * return the empty string and no info tip is displayed. + */ +::method onGetInfoTip unguarded + expose tv + use arg id, hItem, text, maxLen, itemData + + if itemData == '...' then return 'There are too many books to list' + else return '' + + +/** onSortChildre() + * + * This is the event handler for the 'Reverse Sort' push button. This method is + * invoked when the user pushes that button. + * + * Note that the tree-view provides a function to sort the children of an item, + * but it only sorts in ascending alphabetical order of the item text. The + * ooDialog TreeView class provides that function in the sortChildren() method. + * + * To sort in any other order requires using the sortChildrenCB() method. With + * this method, the programmer names a 'call back' method in the Rexx dialog. + * This method is then invoked by the tree-view for each item it needs to + * determine the order of. + * + * This is what we do here, we use the sortChildrenCB method and provide on own + * comparsion method, rexxSort(). + * + * We sort the children of the selected item. If no item is selected we sort + * the children of the root item. Note that only the direct children of the + * parent item are sorted. To sort all items, the programmer would need to + * implement a recursive function, similar to the expandAll() or collapseAll() + * functions. + */ +::method onSortChildren unguarded + expose tv + + selectedItem = tv~selected + if selectedItem == 0 then selectedItem = tv~root + + ret = tv~sortChildrenCB(selectedItem, rexxSort) + + +/** rexxSort() + * + * This is our comparison callback function. We are passed the user item data + * for the first tree-view item and the user item data for the second tree-view + * item. The method needs to return a positive number if the first item is + * greater than the second, a negative number if the first item is less than the + * second, and 0 if the two items are equivalent. + * + * In this program, for every tree-view item inserted, we set the item data for + * that item to be the text of the item. Then, in our comparison function here, + * we just do a reverse comparison of that text. This orders the items in + * descending order rather than ascending order. The userParam argument is + * ignored here. + */ +::method rexxSort unguarded + use arg itemData1, itemData2, userParam + + -- Reverse sort: + return itemData2~compareTo(itemData1) + + +/** onExpandAll() + * + * This is the event handler for the 'Expand All' push button. This method is + * invoked when the user clicks that button. + * + * We expand the selected item and all its children recursively. + */ +::method onExpandAll unguarded + expose tv + + if tv~selected == 0 then do + title = self~APPLICATION_TITLE~subword(1, 3) '- Error' + msg = "There is no tree-view item selected. Before" || .endOfLine ||- + "you can expand all items you must first" || .endOfLine ||- + "select an item" + + ret = MessageDialog(msg, self~hwnd, title, 'OK', 'WARNING') + return 0 + end + + if self~isFullyExpanded(tv~selected) then do + title = self~APPLICATION_TITLE~subword(1, 3) '- Information' + msg = "The selected tree-view item is already fully" || .endOfLine ||- + "expanded. Expanding will take place, but it" || .endOfLine ||- + "have no visile effect." + + ret = MessageDialog(msg, self~hwnd, title, 'OK', 'WARNING') + end + + self~expandAll(tv~selected) + +return 0 + +/** onCollapseAll() + * + * This is the event handler for the 'Collapse All' push button. This method is + * invoked when the user clicks that button. + * + * We collapse the selected item and all its children recursively. + */ +::method onCollapseAll unguarded + expose tv + + if tv~selected == 0 then do + title = self~APPLICATION_TITLE~subword(1, 3) '- Error' + msg = "There is no tree-view item selected. Before" || .endOfLine ||- + "you can collapse all items you must first" || .endOfLine ||- + "select an item" + + ret = MessageDialog(msg, self~hwnd, title, 'OK', 'WARNING') + return 0 + end + + itemInfo. = tv~itemInfo(tv~selected) + if itemInfo.!State~wordPos('EXPANDED') == 0 then do + title = self~APPLICATION_TITLE~subword(1, 3) '- Information' + msg = "The selected tree-view item is already collapsed. You" || .endOfLine || - + "may not see anything, but all children of the selected" || .endOfLine || - + "item will be collapsed." + + ret = MessageDialog(msg, self~hwnd, title, 'OK', 'INFORMATION') + end + + self~collapseAll(tv~selected) + +return 0 + +/** onItemInfo + * + * This is the event handler for the 'Item Info' push button. It iw invoked + * when the button is clicked. + * + * We get the selected tree-view item and display information about it. + */ +::method onItemInfo unguarded + expose tv + + selected = tv~selected + + if selected == 0 then do + title = self~APPLICATION_TITLE~subword(1, 3) '- Error' + msg = "There is no tree-view item selected. Before" || .endOfLine ||- + "you can display information on an item you" || .endOfLine ||- + "must first select an item" + + ret = MessageDialog(msg, self~hwnd, title, 'OK', 'WARNING') + return 0 + end + + itemInfo. = tv~itemInfo(selected) + tab1 = '09'x + tab2 = tab1~copies(2) + + hasChildren = self~logicalToString(itemInfo.!Children) + + title = self~APPLICATION_TITLE~changeStr('-', '') '- Item Information' + msg = 'The Selected Item is:' || tab1 || '"'itemInfo.!Text'"' || .endOfLine~copies(2) || - + ' Contains children:' || tab2 || hasChildren || .endOfLine || - + ' Unselected icon index:' || tab1 || itemInfo.!Image || .endOfLine || - + ' Selected icon index:' || tab2 || itemInfo.!SelectedImage || .endOfLine || - + ' Item state:' || tab2 || itemInfo.!State || .endOfLine || - + ' Is leaf node:' || tab2 || self~logicalToString(.InventoryDlg~isLeafItem(tv, selected)) + + ret = MessageDialog(msg, self~hwnd, title 'OK', 'INFORMATION') + +return 0 + +/** help() + * + * The help command event handler is connected automatically by the ooDialog + * framework to the command with ID of 9. The default help event handler + * provided by ooDialog does nothing. + * + * In this example, the Help push button is given the resource ID of 9, and + * therefore the help event handler is invoked when the user clicks on the Help + * button. Rather than do noting when the button is clicked, we over-ride the + * help method here. We still do not do much, just inform the user that there + * is no help. + */ +::method help unguarded + title = self~APPLICATION_TITLE + msg = "There is no help available for this example program." + ret = MessageDialog(msg, self~hwnd, title, "OK", "INFORMATION") +return 0 + + +/*- - - - - - - - - - Helper Methods - - - - - - - - - - - - - - - - - - - - -*/ + + +/** expandAll() + * + * This helper method recursively expands all children nodes of the specified + * tree-view item. + */ +::method expandAll private unguarded + expose tv + use strict arg item + + if item == 0 then return 0 + + tv~expand(item) + + nextItem = tv~child(item) + do while nextItem \== 0 + self~expandAll(nextItem) + nextItem = tv~next(nextItem) + end + +return 0 + +/** collapseAll() + * + * This helper method recursively collapse the specified tree-view item and all + * its children. + */ +::method collapseAll private unguarded + expose tv + use strict arg item + + if item == 0 then return 0 + + nextItem = tv~child(item) + do while nextItem \== 0 + self~collapseAll(nextItem) + nextItem = tv~next(nextItem) + end + + tv~collapse(item) + +return 0 + + +/** isFullyExpanded() + * + * This helper method checks if the specified item is fully expanded by + * recursively descending though the children of the item and checking that each + * item is expanded. + * + * Returns .true if the item is fully expanded, otherwise .false. + */ +::method isFullyExpanded private unguarded + expose tv + use strict arg item + + if item == 0 then return .true + if .InventoryDlg~isLeafItem(tv, item) then return .true + + itemInfo. = tv~itemInfo(item) + if itemInfo.!State~wordPos('EXPANDED') == 0 then return .false + + nextItem = tv~child(item) + do while nextItem \== 0 + if \ self~isFullyExpanded(nextItem) then return .false + nextItem = tv~next(nextItem) + end + +return .true + +/** checkForRequiredFiles() + * + * This helper method is used to check that the bitmap and input files are + * available. It returns .true if they are found and .false if they are not + * found. + */ +::method checkForRequiredFiles private + + haveError = .false + file = '' + + if stream(self~BMP_FILE, "C", "QUERY EXISTS") = "" then do + haveError = .true + file = self~BMP_FILE + end + else if stream(self~TREE_FILE, "C", "QUERY EXISTS") = "" then do + haveError = .true + file = self~TREE_FILE + end + else if stream(self~ITEM_FILE, "C", "QUERY EXISTS") = "" then do + haveError = .true + file = self~ITEM_FILE + end + + if haveError then do + title = self~APPLICATION_TITLE~subword(1, 3) '- File Error' + msg = "The required data file" file || .endOfLine || - + "does not exist. Without that file, this progam" || .endOfLine || - + "will not run." || .endOfLine~copies(2) || - + "The program will abort." + + ret = MessageDialog(msg, 0, title, 'OK', 'ERROR') + end + +return \haveError + + +/** makeArgs() + * + * This helper method turns a line of comma separted values into an argument + * array with empty values turned into empty indexes in the array. + */ +::method makeArgs private unguarded + if arg() == 1 then line = arg(1) + else line = arg(3) + + args = line~makeArray(',') + if arg() == 1 then do + newArgs = .array~new(args~items) + do i = 1 to args~items + if args[i]~strip \== "" then newArgs[i] = args[i]~strip('B', '"') + end + end + else do + newArgs = .array~new(args~items + 2) + newArgs[1] = arg(1) + newArgs[2] = 'LAST' + + j = 2 + do i = 1 to args~items + j += 1 + if args[i]~strip \== "" then newArgs[j] = args[i]~strip('B', '"') + end + end + +return newArgs + +/** logicalToString() + * + * This helper method converts and returns a value to true or false if value is + * a logical, otherwise it returns the empty string. + */ +::method logicalToString private + use strict arg logical + if logical == .true then return 'True' + else if logical == .false then return 'False' + else return '' + +/** print() + * + * This helper function is useful in debugging. It prints the label of the + * specified tree-view item to the screen. + */ +::method print private unguarded + expose tv + use strict arg item, indent + + itemInfo. = tv~itemInfo(item); + say indent || itemInfo.!Text + +return 0 + + +/*- NewTreeItemDlg - Class- - - - - - - - - - - - - - - - - - - - - - - - - - *\ + + This dialog class allows the user to add a new item to the tree-view + +\*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +::class 'NewTreeItemDlg' subclass RcDialog inherit TreeViewConstants + +/** init() + * + * The initialization of the Rexx dialog object. We just use this to grab a + * reference to the tree-view control in the parent dialog. + */ +::method init + expose treeControl + use arg scriptFile, dlgID, treeControl + + -- Initialize the super class. + self~init:super(scriptFile, dlgID) + +/** initDialog() + * + * The initialization of the Windows dialog. We use this to set the state of + * the various controls in the dialog. + */ +::method initDialog + expose treeControl editControl childRB folderChk selected + + -- Save a reference to the current selected item + selected = treeControl~selected + + editControl = self~newEdit(IDC_EDIT_NAME) + childRB = self~newRadioButton(IDC_RB_CHILD) + siblingRB = self~newRadioButton(IDC_RB_SIBLING) + folderChk = self~newCheckBox(IDC_CHK_FOLDER) + + -- If the selected is the root of the tree, a new item has to be inserted as + -- a child. So disable the radio buttons that allow the user to choose to + -- insert as a child or sibling. And, pre-check the add as a folder check + -- box. + if selected == treeControl~root then do + childRB~~check~disable + siblingRB~disable + folderChk~check + end + else if .InventoryDlg~isLeafItem(treeControl, selected) then do + siblingRB~~check~disable + childRB~disable + end + else do + siblingRB~check + end + + -- Set a visual cue for the edit control. This will only show when the edit + -- control has no text in it, and does not have the focus. + editControl~setCue("Enter name of new item") + +return 0 + +/** ok() + * + * The is the event handler for the Ok button. It is invoked when the user + * clicks that button. + * + * The ooDialog framework provides a default implementation for this event. It + * is important to always close a dialog, once the underlying Windows dialog has + * been created, through the Ok or Cancel event handlers. This ensures that the + * dialog is ended correctly and that the needed clean up. + * + * Here we over-ride the superclass ok method so that we can check that the user + * entered the correct data for the new item and then insert it into the tree- + * view. If the user did not enter the data correctly, we giver her a chance to + * correct it. We give her a chance to cancel and if she does, we end the + * dialog cancel instead of ok. + * + * Note that we end the dialog by either calling the superclass ok or cancel + * method. We prevent the dialog from closing by *not* invoking one of those + * methods and simply returning. + */ +::method ok + expose treeControl editControl childRB folderChk selected + + -- Make sure the user has given the item a name. + text = editControl~getText~strip + if text == "" then do + msg = "You must enter the name of the new item" + title = self~APPLICATION_TITLE~changestr('-', '') '- Add Item' + + ret = MessageDialog(msg, self~hwnd, title, 'WARNING', 'OKCANCEL') + if ret == self~IDCANCEL then return self~cancel:super + + editControl~assignFocus + return 0 + end + + -- See if the user wants to add this as a folder item, or a regular item. + -- This will determine the image IDs we use when we insert the item + addAsFolder = folderChk~checked + + -- Now insert the item either as a child or a sibling depending on what the + -- user requested. Note that we set the item data on each insert to the text + -- of the inserted item. + if childRB~checked then do + if addAsFolder then newItem = treeControl~insert(selected, , text, self~UNSELECTED_FOLDER, self~SELECTED_FOLDER, , , text) + else newItem = treeControl~insert(selected, , text, self~UNSELECTED_LEAF, self~SELECTED_LEAF, , , text) + treeControl~expand(treeControl~parent(newItem)) + end + else do + if addAsFolder then treeControl~insert(treeControl~Parent(selected), , text, self~UNSELECTED_FOLDER, self~SELECTED_FOLDER, , , text) + else treeControl~insert(treeControl~Parent(selected), , text, self~UNSELECTED_LEAF, self~SELECTED_LEAF, , , text) + end + + -- Finally, quit by invoking the super class ok() method. +return self~ok:super + + diff --git a/modules/windows/oodialog/controls/TreeView/treeViewCustomDrawI.inp b/modules/windows/oodialog/controls/TreeView/treeViewCustomDrawI.inp new file mode 100644 index 0000000..7f17456 --- /dev/null +++ b/modules/windows/oodialog/controls/TreeView/treeViewCustomDrawI.inp @@ -0,0 +1,10 @@ +"Currency Converter with Pocket Calculator Function",2,3,,,"Currency Converter with Pocket Calculator Function" +"Cordless Bicycle Computer with 9 functions",2,3,,,"Cordless Bicycle Computer with 9 functions" +"Digital Watch",2,3,,,"Digital Watch" +"Accu Charger",2,3,,,"Accu Charger" +"Inkjet Printer",2,3,,,"Inkjet Printer" +"Diskettes",2,3,,,"Diskettes" +"Car Radio",2,3,,,"Car Radio" +"The Software Catalog",2,3,,,"The Software Catalog" +"VHS Video Camera",2,3,,,"VHS Video Camera" +"External CD ROM Drive",2,3,,,"External CD ROM Drive" diff --git a/modules/windows/oodialog/controls/fiscalReports.h b/modules/windows/oodialog/controls/fiscalReports.h new file mode 100644 index 0000000..5a29a40 --- /dev/null +++ b/modules/windows/oodialog/controls/fiscalReports.h @@ -0,0 +1,52 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_FISCAL_REPORTS 101 +#define IDC_PB_PRINT 1002 +#define IDC_GB_REPORTS 1004 +#define IDC_RB_PRE_FIRST 1006 +#define IDC_RB_BAL_SHEET 1007 +#define IDC_RB_PAYROLL 1008 +#define IDC_RB_CASH_FLOW 1009 +#define IDC_RB_INCOME_STMT 1010 +#define IDC_RB_EARNINGS 1011 +#define IDC_RB_ANTE_LAST 1012 +#define IDC_DTP_REPORT 1013 diff --git a/modules/windows/oodialog/controls/fiscalReports.rc b/modules/windows/oodialog/controls/fiscalReports.rc new file mode 100644 index 0000000..d0f5861 --- /dev/null +++ b/modules/windows/oodialog/controls/fiscalReports.rc @@ -0,0 +1,60 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "fiscalReports.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_FISCAL_REPORTS DIALOGEX 0, 0, 333, 122 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Acme Widgets: Fiscal Reports" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + GROUPBOX "Report Type:", IDC_GB_REPORTS, 10, 11, 313, 41 + AUTORADIOBUTTON "Balance Sheet", IDC_RB_BAL_SHEET, 19, 29, 63, 8, WS_TABSTOP + AUTORADIOBUTTON "Payroll", IDC_RB_PAYROLL, 87, 29, 37, 8 + AUTORADIOBUTTON "Cash Flow", IDC_RB_CASH_FLOW, 135, 29, 49, 8 + AUTORADIOBUTTON "Income Statement", IDC_RB_INCOME_STMT, 192, 29, 73, 8 + AUTORADIOBUTTON "Earnings", IDC_RB_EARNINGS, 277, 29, 43, 8 + LTEXT "Period && Start Date:", IDC_STATIC, 10, 61, 94, 8, SS_LEFT + CONTROL "", IDC_DTP_REPORT, DATETIMEPICK_CLASS, WS_TABSTOP | DTS_LONGDATEFORMAT | DTS_RIGHTALIGN, 10, 72, 313, 15 + DEFPUSHBUTTON "Print", IDC_PB_PRINT, 218, 98, 50, 14 + PUSHBUTTON "Done", IDOK, 273, 98, 50, 14 +} diff --git a/modules/windows/oodialog/controls/fiscalReports.rex b/modules/windows/oodialog/controls/fiscalReports.rex new file mode 100755 index 0000000..45441f9 --- /dev/null +++ b/modules/windows/oodialog/controls/fiscalReports.rex @@ -0,0 +1,741 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +/** + * A more advanced example of the date and time picker control. + * + * This is example is intended to show how to use call back fields in the format + * string for the DTP control and how to respond to the FORMAT, FORMATQUERY, and + * KEYDOWN notifications for the call back fields. + * + * What is not explicit in the comments in this program is that there must be + * a custom format string, containing call back fields, set in the DTP control + * in order for the 3 event notifications to occur. + * + * In the program, change the date and time in the DTP control to see how the + * call back fields work. Select a call back field by clicking on it or tabbing + * to it and then use the up or down arrow keys, home, end, page up, or page + * down keys and observe what happens. + */ + + sd = locate() + .application~setDefaults('O', sd'fiscalReports.h', .false) + + dlg = .FiscalReports~new(sd'fiscalReports.rc', IDD_FISCAL_REPORTS) + dlg~execute("SHOWTOP") + +return 0 + +::requires "ooDialog.cls" + +::class 'FiscalReports' subclass RcDialog + +::method init + expose haveSizes + + forward class (super) continue + + self~setUpArrays + haveSizes = .false + + self~connectDateTimePickerEvent(IDC_DTP_REPORT, "FORMAT", onFormat) + self~connectDateTimePickerEvent(IDC_DTP_REPORT, "FORMATQUERY", onFormatQuery) + self~connectDateTimePickerEvent(IDC_DTP_REPORT, "KEYDOWN", onKeyDown) + + do i = .constDir[IDC_RB_PRE_FIRST] + 1 to .constDir[IDC_RB_ANTE_LAST] - 1 + self~connectButtonEvent(i, 'CLICKED', onRbClick, .true) + end + + self~connectButtonEvent(IDC_PB_PRINT, 'CLICKED', onPrint) + +::method initDialog + expose dtp currentType + + dtp = self~newDateTimePicker(IDC_DTP_REPORT); + self~newRadioButton(IDC_RB_BAL_SHEET)~check + + -- Set up the range of the DTP control. We say we can't print a report in the + -- future, so the maximum date is set to the current time. We say the company + -- first opened its doors on 3/2/1998 (which happens to be a Monday) at 8 AM, + -- so a report can not start prior to that date. + now = .DateTime~new + start = .DateTime~fromIsoDate('1998-03-02T08:00:00.000000') + dtp~setRange(.Array~of(start, now)) + + -- This is our format string with 3 call back fields in it. Each call back + -- field is designated by using a capital X. The number of X's allow you to + -- uniquely indentify different call back fields. + -- + -- As you see the format string starts with 3 call back fields. The first is + -- the number field, (First, Second, etc.,) the second is the period field, + -- (quarter, half, etc.,) and the third is the report type, (balance, cash + -- flow, etc..) Within the format string, constant strings like: + -- report starts from: + -- need to be put in single quotes. Punctuation and spaces do not need to be + -- quoted, so for example ', ' does not need the single quotes. + dtp~setFormat("XX XXX XXXX 'report starts from: 'hh':'mm tt dddd MMMM dd', 'yyyy") + + +/** onFormatQuery() + * + * This is the format query notification event handler. The DTP control sends + * the notification to request the size of the largest item to be displayed in + * the specified call back field + * + * @param field The identifier of the call back field. In our case it will be + * XX, or XXX, or XXXX. + * + * @param size A .Size object. The size of the largest item to display is + * returned to the DTP by setting this .Size object. + * + * The id and hwnd arguments are not needed here. + * + * Since the largest size for each field is not going to change, we just + * calculate the size for each field 1 time and save a reference to it. To + * accurately calculate the size in pixels, we need to wait until the underlying + * dialog is actually created. We could have done this in initDialog(), but + * I think it is better to wait until the DTP asks for the size. + */ +::method onFormatQuery unguarded + expose dtp haveSizes xxSize xxxSize xxxxSize + use arg field, size, id, hwnd + + if \ haveSizes then do + xxSize = self~calcSize('XX') + xxxSize = self~calcSize('XXX') + xxxxSize = self~calcSize('XXXX') + haveSizes = .true + end + + -- The equateTo() method sets the cx and cy attributes of the receiver .Size + -- object to the cx and cy attributes of the argument .Size object. + select + when field == 'XX' then size~equateTo(xxSize) + when field == 'XXX' then size~equateTo(xxxSize) + otherwise size~equateTo(xxxxSize) + end + -- End select + + return 0 + +/** onFormat() + * + * This is the format notification event handler. The DTP control sends this + * notification to request the text to display in the call back field at this + * point in time. For this application, we base what should be displayed in the + * numbers field on the currently selected date and time. What the other 2 + * fields should display is tracked through the currentType and currentPeriod + * variables. + * + * @param field The identifier of the call back field. In our case it will be + * XX, or XXX, or XXXX. + * + * @param dt A .DateTime object. This is the currently selected date and + * time in the DTP control. + * + * The id and hwnd arguments are not needed here. + * + * The return from this method is what the DTP control will dislpay in the + * specified call back field. + */ +::method onFormat unguarded + expose periods types currentType currentPeriod + use arg field, dt, id, hwnd + + select + when field == 'XX' then do + ret = self~getPeriodNumber(dt) + end + + when field == 'XXX' then do + ret = periods[currentPeriod] + end + + otherwise do + ret = types[currentType] + end + end + -- End select + + return ret + +/** onKeyDown() + * + * This is the event handler for the KEYDOWN notification event handler. The + * DTP control sends this notification when the user types a key in a call back + * field. This allows the programmer to implement some custom behavior for the + * call back fields. + * + * @param field The identifier of the call back field. In our case it will be + * XX, or XXX, or XXXX. + * + * @param dt A .DateTime object. This is the currently selected date and + * time in the DTP control. + * + * @param vKey This is the virtual key the user pressed. + * + * The id and hwnd arguments are not needed here. + * + * The return is the modified date and time information based on the user's + * keystroke. + * + * Each time the date and time in the DTP control is modified, the DTP control + * sends the FORMAT notification. This is what drives our program. When the + * user presses the up or down arrow, home, end, page up, or page down keys in + * one of the call back fields we send a modified date and time back to the DTP + * control. The DTP control generates a FORMAT event, and in our FORMAT event + * handler we return the updated value for the call back field. + */ +::method onKeyDown + use arg field, dt, vKey, idFrom, hwndFrom + + select + when field == 'XX' then do + newDT = self~updatePeriodNumber(dt, vKey) + end + + when field == 'XXX' then do + newDT = self~updatePeriod(dt, vKey) + end + + otherwise do + newDT = self~updateReport(dt, vKey) + end + end + -- End select + + return newDT + + +/** onRbClick() + * + * This is the event handler for the click event of a radio button. We + * connected the event for every radio button to this one method. Each time the + * user clicks on a radio button, it selects a new report type. In our program, + * when a new report type is selected, the initial date for the report is set to + * the first day of the current period. I.e., if the current period is 'month' + * and the date is 7/10/2008, then the first day of the period is 7/1/2008. + * + * As explained in the comments for the onFormat() method above, when the date + * and time is changed in the DTP control, the control generates a FORMAT event. + * Here we update the index to the type of report, and set the new date and + * time. In the FORMAT event handler, the updated report type index causes the + * event handler to return the text for the new report type. And the display in + * the DTP control is automatically updated to reflect the user's report + * selection. + */ +::method onRbClick unguarded + expose dtp currentType + use arg info, hwnd, id + + dt = self~getFirstDayOfPeriod + + select + when id == .constDir[IDC_RB_BAL_SHEET] then do + currentType = 1 + dtp~setDateTime(dt) + end + + when id == .constDir[IDC_RB_PAYROLL] then do + currentType = 2 + dtp~setDateTime(dt) + end + + when id == .constDir[IDC_RB_CASH_FLOW] then do + currentType = 3 + dtp~setDateTime(dt) + end + + when id == .constDir[IDC_RB_INCOME_STMT] then do + currentType = 4 + dtp~setDateTime(dt) + end + + when id == .constDir[IDC_RB_EARNINGS] then do + currentType = 5 + dtp~setDateTime(dt) + end + + otherwise do + -- Should be impossible to get here. + nop + end + end + -- End select + + return 0 + + +/** updatePeriodNumber() + * + * This method is invoked during the event handler for the key down event when + * the call back field is the number, the period number (First, second, third, + * etc..) The user can use the up / down arrows, home, end, page up, and page + * down keys to cycle through the periods. All other keys are simply ignored. + * + * Note that when the number changes, the period (month, quarter, etc.,) stays + * the same. The date changes to the same relative date in the new period. The + * numbers wrap, i.e., if it is the 12 month and the up arrow key is used, the + * number wraps to 1. To determine when to wrap, we have to check the period. + * If the period is half, then we need to wrap at 3, etc.. + */ +::method updatePeriodNumber unguarded private + expose periods currentPeriod + use strict arg dt, vkey + + mn = dt~month + + parse value dt~isoDate with pre 6 j 8 tail + + select + when vKey == .VK~UP then do + + select + when periods[currentPeriod] == 'month' then do + mn += 1 + if mn == 13 then mn = 1 + end + + when periods[currentPeriod] == 'quarter' then do + if mn <= 9 then mn += 3 + else mn -= 9 + end + + otherwise do + if mn <= 6 then mn += 6 + else mn -= 6 + end + end + -- End select + + mn = mn~right(2, 0) + newDT = .DateTime~fromIsoDate(pre || mn || tail) + end + + when vKey == .VK~Down then do + + select + when periods[currentPeriod] == 'month' then do + mn -= 1 + if mn == 0 then mn = 12 + end + + when periods[currentPeriod] == 'quarter' then do + if mn <= 3 then mn += 9 + else mn -= 3 + end + + otherwise do + if mn <= 6 then mn += 6 + else mn -= 6 + end + end + -- End select + + mn = mn~right(2, 0) + newDT = .DateTime~fromIsoDate(pre || mn || tail) + end + + when vKey == .VK~HOME then do + + select + when periods[currentPeriod] == 'month' then do + mn = 1 + end + + when periods[currentPeriod] == 'quarter' then do + if mn <= 3 then nop + else if mn <= 6 then mn -= 3 + else if mn <= 9 then mn -= 6 + else mn -= 9 + end + + otherwise do + if mn > 6 then mn -= 6 + end + end + -- End select + + mn = mn~right(2, 0) + newDT = .DateTime~fromIsoDate(pre || mn || tail) + end + + when vKey == .VK~END then do + + select + when periods[currentPeriod] == 'month' then do + mn = 12 + end + + when periods[currentPeriod] == 'quarter' then do + if mn <= 3 then mn += 9 + else if mn <= 6 then mn += 6 + else if mn <= 9 then mn += 6 + else nop + end + + otherwise do + if mn <= 6 then mn += 6 + end + end + -- End select + + mn = mn~right(2, 0) + newDT = .DateTime~fromIsoDate(pre || mn || tail) + end + + when vKey == .VK~PRIOR then do + -- We want to go half the year back, so it doesn't make any difference + -- what the period is. + if mn <= 6 then mn = 1 + else mn -= 6 + + mn = mn~right(2, 0) + newDT = .DateTime~fromIsoDate(pre || mn || tail) + end + + when vKey == .VK~NEXT then do + -- We want to go half the year ahead, so it doesn't make any difference + -- what the period is. + if mn <= 6 then mn += 6 + else mn = 12 + + mn = mn~right(2, 0) + newDT = .DateTime~fromIsoDate(pre || mn || tail) + end + + otherwise do + newDT = dt + end + end + -- End select + + return newDT + + +/** onPrint() + * + * The event handler for the CLICK event for the 'Print' push button. A real + * program would of course print the report using the details specified by the + * user through the DTP control. This is just an example program, we simply + * put up a message box. + */ +::method onPrint unguarded + expose types currentType dtp + use arg info, hwndFrom + + select + when currentType == 1 then report = 'Balance Sheet' + when currentType == 2 then report = 'Payroll' + when currentType == 3 then report = 'Cash Flow' + when currentType == 4 then report = 'Income Statement' + when currentType == 5 then report = 'Earnings' + otherwise report = 'Error Report NOT Found' + end + -- End select + + dt = dtp~getDateTime + + if report~word(1) == 'Error' then do + title = report + msg = 'An internal software error has occurred preventing'.endOfLine || - + 'the printing of the report.' || .endOfLine~copies(2) || - + 'Please contact IT at "internalsupport@acmewidgets.com"'.endOfLine || - + 'to resolve this issue.' + + icon = 'ERROR' + end + else do + title = "Printing the" report "Report" + msg = 'The' report 'report is being sent to the default'.endOfLine || - + 'printer' || .endOfLine~copies(3) || - + 'Report Start Time:' || '09'x || dt~civilTime || .endOfLine || - + 'Report Start Date:' || '09'x || dt~languageDate + + icon = 'INFORMATION' + end + + j = MessageDialog(msg, self~hwnd, title, 'OK', icon) + + +/** updatePeriod() + * + * This method is invoked during the event handler for the key down event when + * the call back field is the period (month, quarter, half.) The user can use + * the up / down arrows, home, end, page up, and page down keys to cycle through + * the periods. All other keys are simply ignored. + * + * Note that when the period changes, the date stays the same. But, if we simply + * return the same date, the DTP will not update its display. So, we add 1 + * second to the date, which in turn causes the DTP control to update the + * display. + */ +::method updatePeriod unguarded private + expose periods currentPeriod + use strict arg dt, vkey + + select + when vKey == .VK~UP then do + currentPeriod += 1 + if currentPeriod > periods~items then currentPeriod = 1 + newDT = dt~addSeconds(1) + end + + when vKey == .VK~Down then do + currentPeriod -= 1 + if currentPeriod < 1 then currentPeriod = periods~items + newDT = dt~addseconds(1) + end + + -- Since there are only 3 periods, Page Up and Home will act the same. + when vKey == .VK~PRIOR | vKey == .VK~HOME then do + currentPeriod = 1 + newDT = dt~addSeconds(1) + end + + -- Since there are only 3 periods, Page Down and End will act the same. + when vKey == .VK~NEXT | vKey == .VK~END then do + currentPeriod = periods~items + newDT = dt~addseconds(1) + end + + otherwise do + newDT = dt + end + end + -- End select + + return newDT + + +/** updateReport() + * + * This method is invoked during the event handler for the key down event when + * the call back field is the report type (balance, cash flow, etc...) The user + * can use the up / down arrows, home, end, page up, and page down keys to cycle + * through the periods. All other keys are simply ignored. + * + * Note that when the report type changes, the date gets set to the first day of + * the period, and the selected radio button gets changed. For the user, the + * effect of using one of the arrow keys in the report type call back field is + * exactly the same as selecting a report by using the radio buttons. + */ +::method updateReport unguarded private + expose types currentType + use strict arg dt, vkey + + select + when vKey == .VK~UP then do + currentType += 1 + if currentType > types~items then currentType = 1 + + newDT = self~getFirstDayOfPeriod + + .RadioButton~checkInGroup(self, .constDir[IDC_RB_PRE_FIRST] + 1, - + .constDir[IDC_RB_ANTE_LAST] - 1, - + .constDir[IDC_RB_PRE_FIRST] + currentType) + end + + when vKey == .VK~Down then do + currentType -= 1 + if currentType < 1 then currentType = types~items + + newDT = self~getFirstDayOfPeriod + + .RadioButton~checkInGroup(self, .constDir[IDC_RB_PRE_FIRST] + 1, - + .constDir[IDC_RB_ANTE_LAST] - 1, - + .constDir[IDC_RB_PRE_FIRST] + currentType) + end + + otherwise do + newDT = dt + end + end + -- End select + + return newDT + + +/** getFirstDay() + * + * Returns the first day of the current period. I.e., if the current period is + * second half 2010, the first day is 6/1/2010 + */ +::method getFirstDay private + expose periods currentPeriod + use strict arg dtpSelected + + yr = dtpSelected~year + mn = dtpSelected~month + + select + when periods[currentPeriod] == 'month' then do + mn = mn~right(2, 0) + end + + when periods[currentPeriod] == 'quarter' then do + if mn <= 3 then mn = 01 + else if mn <= 6 then mn = 04 + else if mn <= 9 then mn = 07 + else mn = 10 + end + + otherwise do + if mn <= 6 then mn = 01 + else mn = 06 + end + end + -- End select + + return .DateTime~fromISODate(yr'-'mn'-01T08:00:00.000000') + + +/** getPeriod() + * + * Returns the number word (first, second, etc., for the specified date based on + * the current period. I.e., if the date is 7/4/1999 and current period is + * month then the number word is Seventh. + */ +::method getPeriodNumber unguarded private + expose numbers periods currentPeriod + use strict arg dt + + mn = dt~month + + select + when periods[currentPeriod] == 'month' then do + word = numbers[mn] + end + + when periods[currentPeriod] == 'quarter' then do + if mn <= 3 then word = numbers[1] + else if mn <= 6 then word = numbers[2] + else if mn <= 9 then word = numbers[3] + else word = numbers[4] + end + + otherwise do + if mn <= 6 then word = numbers[1] + else word = numbers[2] + end + end + -- End select + + return word + + +/** getFirstDayOfPeriod() + * + * Returns a .DateTime object that represents the first day of the period. The + * first day of the period is based on the currently selected date in the DTP + * control and the setting of the period. I.e., if the date is 5/13/2003 and + * the period is quarter, then the first day of the period is 4/1/2003. + * + * Note that the .DateTime object returned here is used to update the DTP + * control, where we need the DTP control to generate a FORMAT event. If the + * returned date is exactly the same as the currently selected date, the DTP + * control does nothing. So, we check for that possibility and add 1 second to + * the return. This is enough to force the FORMAT event notification we need. + */ +::method getFirstDayOfPeriod private + expose dtp + use strict arg + + current = dtp~getDateTime + dt = self~getFirstDay(current) + + if dt == current then do + dt = dt~addSeconds(1) + end + + return dt + + +/** calcSize() + * + * Calculates the size needed to fully display the largest string in the + * specified call back field. The DTP control uses this size to ensure that + * the display is formatted correctly. + * + * For the specified call back field, we iterate over the items for the field, + * calculate the size in pixels needed for the item, and save the biggest size. + * We could have just eye-balled the biggest item in the field and calculated + * its size. For instance, 'quarter' looks to be the biggest item in the period + * call back. However, doing it this way ensures we get the correct display + * size and allows the program to be enhanced by adding items to any of the call + * back fields without having to change this method. + */ +::method calcSize unguarded private + expose dtp periods numbers types + use strict arg which + + biggest = .Size~new(0, 0) + size = .Size~new + + select + when which == 'XX' then array = numbers + when which == 'XXX' then array = periods + otherwise array = types + end + -- End select + + do text over array + dtp~textSize(text, size) + if biggest < size then biggest~equateTo(size) + end + + return biggest + +/** setUpArrays() + * + * Simple house keeping, initialize an array of items for each call back field. + */ +::method setUpArrays private + expose periods numbers types currentPeriod currentType + + periods = .Array~of('month', 'quarter', 'half') + + numbers = .Array~of('First', 'Second', 'Third', 'Fourth', 'Fifth', - + 'Sixth', 'Seventh', 'Eighth', 'Ninth', 'Tenth', - + 'Eleventh', 'Twelfth') + + types = .Array~of('balance', 'payroll', 'cash flow', 'income', 'earnings') + + -- Set the starting period, 'quarter', and report, 'balance'. + currentPeriod = 2 + currentType = 1 diff --git a/modules/windows/oodialog/controls/paidHolidays.h b/modules/windows/oodialog/controls/paidHolidays.h new file mode 100644 index 0000000..6c762e5 --- /dev/null +++ b/modules/windows/oodialog/controls/paidHolidays.h @@ -0,0 +1,44 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2010-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_HOLIDAY_DLG 101 +#define IDC_MC_HOLIDAYS 1003 +#define IDC_ST_MSG 1004 diff --git a/modules/windows/oodialog/controls/paidHolidays.rc b/modules/windows/oodialog/controls/paidHolidays.rc new file mode 100644 index 0000000..a93e7a7 --- /dev/null +++ b/modules/windows/oodialog/controls/paidHolidays.rc @@ -0,0 +1,53 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2010-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#include +#include +#include "paidHolidays.h" + + +// Dialog resources + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_HOLIDAY_DLG DIALOG 0, 0, 209, 124 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU +CAPTION "2011 Calendar - US - Paid Holidays" +FONT 8, "Ms Shell Dlg" +{ + CONTROL "", IDC_MC_HOLIDAYS, MONTHCAL_CLASS, WS_TABSTOP | MCS_DAYSTATE, 10, 10, 122, 93 + LTEXT "Holiday calendar for 2011. Paid holidays are in bold.", IDC_ST_MSG, 137, 18, 60, 46, SS_LEFT + DEFPUSHBUTTON "OK", IDOK, 152, 103, 50, 14 +} diff --git a/modules/windows/oodialog/controls/upDown.h b/modules/windows/oodialog/controls/upDown.h new file mode 100644 index 0000000..41aefb9 --- /dev/null +++ b/modules/windows/oodialog/controls/upDown.h @@ -0,0 +1,60 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2009-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_UP_DOWN 101 +#define IDC_EDIT_DECIMAL 1001 +#define IDC_UD_DECIMAL 1002 +#define IDC_EDIT_HEXADECIMAL 1003 +#define IDC_UD_HEXADECIMAL 1004 +#define IDC_PB_ACCEL 1005 +#define IDC_PB_RANGE 1006 +#define IDC_PB_BASE 1007 +#define IDC_PB_POS 1008 +#define IDC_PB_BUDDY 1009 +#define IDC_EDIT_CLIENT 1010 +#define IDC_UD_CLIENT 1011 +#define IDC_EDIT_AGE 1012 +#define IDC_EDIT_GENDER 1013 +#define IDC_EDIT_PAID 1014 +#define IDC_RB_DECIMAL 1015 +#define IDC_RB_HEXADECIMAL 1016 +#define IDC_ST_DECIMAL 1020 +#define IDC_ST_HEXADECIMAL 1021 diff --git a/modules/windows/oodialog/controls/upDown.rc b/modules/windows/oodialog/controls/upDown.rc new file mode 100644 index 0000000..7d6eaaf --- /dev/null +++ b/modules/windows/oodialog/controls/upDown.rc @@ -0,0 +1,76 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2009-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include "upDown.h" +#include +#include + + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +IDD_UP_DOWN DIALOG 0, 0, 296, 159 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU +CAPTION "Up-down Controls" +FONT 8, "Ms Shell Dlg 2" +{ + RTEXT "Decimal:", IDC_ST_DECIMAL, 10, 13, 45, 8, SS_RIGHT + EDITTEXT IDC_EDIT_DECIMAL, 59, 10, 67, 14, ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER, WS_EX_RIGHT + CONTROL "", IDC_UD_DECIMAL, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_WRAP | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 115, 10, 12, 14 + EDITTEXT IDC_EDIT_HEXADECIMAL, 184, 10, 52, 14, ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER + CONTROL "", IDC_UD_HEXADECIMAL, UPDOWN_CLASS, UDS_ALIGNLEFT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_SETBUDDYINT, 184, 10, 12, 14 + LTEXT ":Hexadecimal", IDC_ST_HEXADECIMAL, 242, 13, 44, 8, SS_LEFT + PUSHBUTTON "Change Acceleration", IDC_PB_ACCEL, 55, 30, 71, 14 + PUSHBUTTON "Change Range", IDC_PB_RANGE, 215, 30, 71, 14 + GROUPBOX "Client Records", IDC_STATIC, 10, 52, 126, 96 + RTEXT "Client:", IDC_STATIC, 20, 70, 22, 8, SS_RIGHT + EDITTEXT IDC_EDIT_CLIENT, 45, 66, 81, 14, ES_AUTOHSCROLL | ES_READONLY + CONTROL "", IDC_UD_CLIENT, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY, 115, 66, 12, 14 + RTEXT "Age:", IDC_STATIC, 31, 86, 43, 8, SS_RIGHT + EDITTEXT IDC_EDIT_AGE, 77, 84, 49, 14, ES_AUTOHSCROLL | ES_READONLY + RTEXT "Gender:", IDC_STATIC, 31, 105, 43, 8, SS_RIGHT + EDITTEXT IDC_EDIT_GENDER, 77, 103, 49, 14, ES_AUTOHSCROLL | ES_READONLY + RTEXT "Paid to Date:", IDC_STATIC, 31, 125, 43, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PAID, 77, 122, 49, 14, ES_AUTOHSCROLL | ES_READONLY + GROUPBOX "Miscellaneous Operations", IDC_STATIC, 142, 52, 144, 66 + PUSHBUTTON "Change Base", IDC_PB_BASE, 148, 64, 50, 14 + PUSHBUTTON "Get Position", IDC_PB_POS, 148, 82, 50, 14 + PUSHBUTTON "Get Buddy", IDC_PB_BUDDY, 148, 100, 50, 14 + GROUPBOX "Up-down", IDC_STATIC, 205, 64, 72, 48 + AUTORADIOBUTTON "Decimal", IDC_RB_DECIMAL, 219, 76, 40, 10, WS_TABSTOP + AUTORADIOBUTTON "Hexadecimal", IDC_RB_HEXADECIMAL, 219, 95, 56, 10, WS_TABSTOP + DEFPUSHBUTTON "OK", IDOK, 178, 135, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 236, 135, 50, 14 +} diff --git a/modules/windows/oodialog/controls/upDown.rex b/modules/windows/oodialog/controls/upDown.rex new file mode 100755 index 0000000..09304df --- /dev/null +++ b/modules/windows/oodialog/controls/upDown.rex @@ -0,0 +1,592 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2009-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * UpDown control example. + * + * The dialog produced by this example contains 3 up down controls. Two of the + * up down controls are integer up down controls. These are commonly referred + * to as 'spinners.' + * + * The third up down control is used to simulate paging through database + * records. It demonstrates how the up down control is useful in non-integer + * situations. + * + * The methods within the dialog class show the usage of mose of the methods of + * the UpDown class. + */ + + sd = locate() + .application~setDefaults("O", sd"upDown.h", .false) + + dlg = .AnUpDownDlg~new(sd"upDown.rc", IDD_UP_DOWN) + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +return 0 +-- End of entry point. + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" + +::class 'AnUpDownDlg' subclass RcDialog + +-- initDialog() +-- There are many different approaches that can be taken to doing the set up for +-- a dialog. For myself, it seems simplest to just do all the initialization in +-- the initDialog() method, which is what is done here. +-- +-- The initialization for this example falls naturally into 3 steps: +-- * Initialize the 2 integer up down controls and set up the data related to +-- maintaining the state for those controls. +-- * Initalize the 'client records' up down control and data structures related +-- to that up down. +-- * Connect all our button controls. +::method initDialog + + self~setupNumericUpDowns + self~setupClientUpDown + self~connectPushButtons + + +-- onClientChange() +-- Invoked when the client up down's position is changed. I.e., the user clicks +-- on one of the arrows of the up down or uses the up or down arrow keys when +-- the focus is on the client edit control. +-- +-- Four arguments are sent to the method: the current position of the up down, +-- the amount the position is to be changed (which can be negative depending on +-- the direction of the change,) the control ID, and the window handle of the +-- control. We don't need the ID or window handle, so those args are just +-- ignored. +-- +-- Each position of the up down maps to the index of a record in the client +-- database, so we just update the record fields using the new index. +::method onClientChange unguarded + expose clientUPD clientDB + use arg curPos, increment + self~refreshClientDisplay(curPos + increment) + + -- Return a delta position reply. With no arguments the reply essentially + -- says to allow the change. + return .UpDown~deltaPosReply + + +-- onChangeAcceleration() +-- Invoked when the user clicks on the "Change Acceleration" button. We keep +-- track of the origianl acceleration values and then loop through 3 new values +-- each time the button is clicked. Returning to the original values every 4th +-- click. +-- +-- The acceleration values consist of an array of directory objects. Each +-- directory object has a SECONDS index and an INCREMENT index. This +-- essentially says after x seconds, set the increment to this value. Typically +-- the first record is 0 seconds and an increment of 1. +-- +-- To get the current acceleration of an up down control you use the +-- getAcceleration() method and an array as described above is returned. To set +-- a new / different acceleration you construct an array as described above and +-- use the setAcceleration() method. Note that the records (directory objects) +-- in the array have to be sorted by the seconds field, lowest to highest. +-- +-- See the printAccelValues(), getFirstAccelIncrease(), and doubleAccel() +-- methods to see the acceleration array works. +::method onChangeAcceleration unguarded + expose decUpDown originalAccel index + + currentAccel = decUpDown~getAcceleration + reverting = .false + + if \ originalAccel~isA(.array) then do + originalAccel = currentAccel + index = 1 + end + + select + when index == 1 then do + newAccel = self~getFirstAccelIncrease(currentAccel) + index = 2 + end + when index == 2 then do + newAccel = self~doubleAccel(currentAccel) + index = 3 + end + when index == 3 then do + newAccel = self~doubleAccel(currentAccel) + index = 4 + end + otherwise do + index = 1 + reverting = .true + newAccel = originalAccel + end + end + -- End select + + decUpDown~setAcceleration(newAccel) + + self~printAccelValues(currentAccel, newAccel, reverting) + + return 0 + + +-- onChangeRange() +-- Invoked when the "Change Range" button is clicked. The range of the up down +-- control on the right is changed. This up down starts out as base 16, but the +-- base may have been changed by the user. +-- +-- The example program has a set of ranges and we just cycle though them. We +-- keep a different set of ranges for base 10 and base 16. The up down controls +-- seem to behave rather oddly if the base is 16 and the range includes negative +-- numbers. So the decimal set has some ranges using negative numbers, but the +-- set for base 16 has only ranges with all positive positions. +::method onChangeRange unguarded + expose hexUpDown decRanges hexRanges + + -- Get the index of the next range and keep track of the current position in + -- the up down control. + index = self~getNextRange + currentPos = hexUpDown~getPosition + + -- Get the appropriate new range, and then set it. + if hexUpDown~getBase == 10 then range = decRanges[index] + else range = hexRanges[index] + + hexUpDown~setRange(range) + + -- Check if the current position is within the new range. If not, change the + -- current position. + if currentPos < range~min | currentPos > range~max then hexUpDown~setPosition(range~max) + + -- Display to the user what we did. + msg = 'Set new range for up down control on right to:' || .endOfLine || - + ' minimum:' range~min || .endOfLine || - + ' maximum:' range~max + self~information(msg) + + return 0 + + +-- onChangeBase() +-- Invoked when the user pushes the "Change Base" putton. Changes the base for +-- the integer up down control whose radio button is checked. +-- +-- Integer up down controls can be either base 10 or base 16. This method seems +-- to have a lot in it, but changing the base is actually simple. The rest of +-- the code is to keep the user interface consistent and looking "good." +::method onChangeBase unguarded + expose decUpDown hexUpDown leftUpDownDecimalRange leftUpDownHexadecimalRange + + if self~decimalRBSelected then do + upd = decUpDown + static = self~newStatic(IDC_ST_DECIMAL) + side = 'left' + end + else do + upd = hexUpDown + static = self~newStatic(IDC_ST_HEXADECIMAL) + side = 'right' + end + + oldBase = upd~getBase + if oldBase == 10 then do + newBase = 16 + if side == 'right' then newText = ":Hexadecimal" + else newText = "Hexadecimal:" + end + else do + newBase = 10 + if side == 'right' then newText = ":Decimal" + else newText = "Decimal:" + end + + upd~setBase(newBase) + static~setText(newText) + + -- Setting the position twice, is the only reliable way I've found to force + -- the text in the buddy window (the edit control) to update. + upd~setPosition(1) + + -- Read the comments for the setDecimalUpDown() method to see why we treat + -- the range for the left-side up down, (the one that starts out as decimal,) + -- special. + if side == 'left' then do + if base == 10 then upd~setRange(leftUpDownDecimalRange) + else upd~setRange(leftUpDownHexadecimalRange) + end + + upd~setPosition(0) + + msg = 'Changed the base of the up down control' || .endOfLine || - + 'on the' side 'from base' oldBase ' to' || .endOfLine || - + 'base' newBase'.' + self~information(msg) + + return 0 + + +-- onGetPostion() +-- Invoked when the user clicks the 'Get Position' push button. We simply +-- display the value for the integer up down selected by a checked radio button. +::method onGetPosition + expose decUpDown hexUpDown + + if self~decimalRBSelected then do + pos = decUpDown~getPosition + side = 'left' + end + else do + pos = hexUpDown~getPosition + side = 'right' + end + + msg = "The position of the up down control on the" side "is" pos + self~information(msg) + + return 0 + + +-- onGetBuddy() +-- Invoked when the "Get Buddy" push button is clicked. The getBuddy() method +-- is used to get the 'buddy' control of the up down control. The setBuddy() +-- method can be used to set the buddy control for an up down control, but that +-- method is not demonstrated in this example. Here we just display the window +-- handle value. +-- +-- Note that the getBuddy() method can return .nil if there is no buddy control. +-- We do not check for that here, since we know there is a buddy control. The +-- up-downs were created with the AUTOBUDDY style. +::method onGetBuddy + expose decUpDown hexUpDown + + if self~decimalRBSelected then do + buddy = decUpDown~getBuddy + side = 'left' + end + else do + buddy = hexUpDown~getBuddy + side = 'right' + end + + msg = "The window handle of the up down control on the" side "is" buddy~hwnd + self~information(msg) + + return 0 + + +-- connectPushButtons() +-- Convenience method, connects the clicked event of all the push buttons to +-- our corresponding event handling method. +::method connectPushButtons private + + self~connectButtonEvent(IDC_PB_ACCEL, "CLICKED", onChangeAcceleration) + self~connectButtonEvent(IDC_PB_RANGE, "CLICKED", onChangeRange) + self~connectButtonEvent(IDC_PB_BASE, "CLICKED", onChangeBase) + self~connectButtonEvent(IDC_PB_POS, "CLICKED", onGetPosition) + self~connectButtonEvent(IDC_PB_BUDDY, "CLICKED", onGetBuddy) + + -- At start up have the decimal radio button checked. + self~newRadioButton(IDC_RB_DECIMAL)~check + + +-- decimalRBSelected() +-- Returns true if the decimal radio button is checked, otherwise false. +::method decimalRBSelected private + return self~newRadioButton(IDC_RB_DECIMAL)~checked + + +-- setupNumericUpDowns() +-- Does all the initial set up for the two numeric up down controls. The left +-- up down control starts out with base 10 (decimal) and the right up down +-- control starts out with base 16 (hexadecimal.) However, these bases can be +-- changed after the dialog comes up. +::method setupNumericUpDowns private + expose decUpDown hexUpDown + + decUpDown = self~newUpDown(IDC_UD_DECIMAL) + hexUpDown = self~newUpDown(IDC_UD_HEXADECIMAL) + + -- By default an integer up down uses base 10 (deicmal.) We set the other + -- integer up down to base 16. + hexUpDown~setBase(16) + + -- Set the minimum value in the range to 0 and the maximum range to 1024. The + -- range can also be set using a .directory object, see the setDecimalUpDonw() + -- method. + hexUpDown~setRange(0, 1024) + + -- Set the position at the top of the range. + hexUpDown~setPosition(1024) + + -- Invoke some convenience methods to finish the set up. + self~setDecimalUpDown + self~setupRangeChanges + + +-- setDecimalUpDown() +-- Does the set up for the left-side up down. This up down controls starts out +-- with a decimal base, but the user can change the base after the dialog has +-- come up. +-- +-- The behavior of an up down control, when the base is set to 16, and the range +-- includes negative numbers, seems rather bizarre. So, in this example, only +-- the left-hand side up down control uses ranges that include negative numbers. +-- When the left-hand up down has its base changed to base 16, the range is +-- changed to not include negative numbers. +::method setDecimalUpDown private + expose decUpDown leftUpDownDecimalRange leftUpDownHexadecimalRange + + -- The setRange() method of the UpDown class accepts a Direcory object to set + -- the range. The MIN and MAX indexes of the Directory object set the range. + leftUpDownDecimalRange = .directory~new + leftUpDownDecimalRange~min = -200 + leftUpDownDecimalRange~max = 200 + + leftUpDownHexadecimalRange = .directory~new + leftUpDownHexadecimalRange~min = 0 + leftUpDownHexadecimalRange~max = 65536 + + -- Set the range with the values used when the base is 10. + decUpDown~setRange(leftUpDownDecimalRange) + + -- Set the position to -100. + decUpDown~setPosition(-100) + + +-- setupRangeChanges() +-- Creates two arrays that contain different ranges for the integer up down +-- controls. These ranges are used to change the range when the user clicks the +-- "Change Range" button. The rangeIndex is used to keep track of where we are +-- and to select the new range. +::method setupRangeChanges private + expose decRanges hexRanges rangeIndex + + rangeIndex = 1 + + d1 = .directory~new~~setEntry("MIN", -400)~~setEntry("MAX", 400) + d2 = .directory~new~~setEntry("MIN", -5)~~setEntry("MAX", 5000) + d3 = .directory~new~~setEntry("MIN", 600)~~setEntry("MAX", 700) + decRanges = .array~of(d1, d2, d3) + + d1 = .directory~new~~setEntry("MIN", 1024)~~setEntry("MAX", 2048) + d2 = .directory~new~~setEntry("MIN", 0)~~setEntry("MAX", 15) + d3 = .directory~new~~setEntry("MIN", 0)~~setEntry("MAX", 700) + hexRanges = .array~of(d1, d2, d3) + + +-- getNextRange() +-- Produce the next index to use when changing the range of an up down control +::method getNextRange private + expose rangeIndex + rangeIndex += 1 + if rangeIndex > 3 then rangeIndex = 1 + return rangeIndex + + +-- setupClientUpDown() +-- Sets up the third up down control. This up down is meant to demonstrate how +-- the up down control can be used to scroll through things other than integers. +-- +-- The example is for a set of data base records consisting of several fields. +-- The controlling field is the 'client.' Each time the up down control has a +-- position change, the matching data base record is displayed. +::method setupClientUpDown private + expose clientUPD clientDB nameInfo ageInfo genderInfo paidInfo + + clientUPD = self~newUpDown(IDC_UD_CLIENT) + + -- We will use 20 records. + clientDB = .array~new(20) + self~fillClientDB(clientDB) + + -- 20 records, so use a range of 1 to 20. + clientUPD~setRange(1, 20) + + -- Start at record 1. + clientUPD~setPosition(1) + + -- Connect the position change event to our onClientChange() method + self~connectUpDownEvent(IDC_UD_CLIENT, "DELTAPOS", onClientChange) + + nameInfo = self~newEdit(IDC_EDIT_CLIENT) + ageInfo = self~newEdit(IDC_EDIT_AGE) + genderInfo = self~newEdit(IDC_EDIT_GENDER) + paidInfo = self~newEdit(IDC_EDIT_PAID) + + -- Set the initial values for the record. + self~refreshClientDisplay(1) + + +-- getFirstAccelIncrease() +-- Generates new acceleration values using the default values of the up down +-- control. Observation has shown that, on Windows XP, an up down control +-- starts out with an acceleration array of 3 values, the first being 0 seconds, +-- an increment of 1. That is not documented and could not be a hard fast rule, +-- but works well enough for this example. +::method getFirstAccelIncrease private + use strict arg accel + + newAccel = .array~new(4) + newAccel[1] = accel[1] + newAccel[2] = .directory~new~~setEntry("SECONDS", 1)~~setEntry("INCREMENT", 2) + newAccel[3] = .directory~new~~setEntry("SECONDS", accel[2]~seconds)~~setEntry("INCREMENT", accel[2]~increment + 2) + newAccel[4] = .directory~new~~setEntry("SECONDS", accel[3]~seconds)~~setEntry("INCREMENT", accel[3]~increment + 4) + + return newAccel + + +-- doubleAccel() +-- Generates new acceleration values by doubling the increment of the passed in +-- values. +::method doubleAccel private + use strict arg accel + + newAccel = .array~new(accel~items) + newAccel[1] = accel[1] + + do i = 2 to accel~items + d = .directory~new + d~seconds = accel[i]~seconds + d~increment = accel[i]~increment * 2 + newAccel[i] = d + end + + return newAccel + + +-- printAccelValues() +-- Convenience method to display acceleration values +::method printAccelValues private + use strict arg currentAccel, newAccel, reverting + + tab = '09'x + + msg = "The current acceleration values are:" || .endOfLine || - + tab || "Items: " currentAccel~items || .endOfLine + + do a over currentAccel + msg ||= tab || "Seconds:" a~seconds || tab || "Increment:" a~increment || .endOfLine + end + + msg ||= .endOfLine + + if reverting then msg ||= "Reverting to original values of:" || .endOfLine + else msg ||= "Changing acceleration values to:" || .endOfLine + + msg ||= tab || "Items: " newAccel~items || .endOfLine + + do a over newAccel + msg ||= tab || "Seconds:" a~seconds || tab || "Increment:" a~increment || .endOfLine + end + + self~information(msg) + + +-- refreshClientDisplay() +-- Updates the display to show the fields for the specified record. +::method refreshClientDisplay private + expose nameInfo ageInfo genderInfo paidInfo clientDB + use strict arg index + + -- There are numerous ways to handle reaching the end of the range for an up + -- down control. Here we put up a message box when either end of the range is + -- reached. + if index < 1 then do + self~clientEnd("bottom") + return + end + if index > 20 then do + self~clientEnd("top") + return + end + + nameInfo~setText(clientDB[index][1]) + ageInfo~setText(clientDB[index][2]) + genderInfo~setText(clientDB[index][3]) + paidInfo~setText(clientDB[index][4]) + + +-- clientEnd() +-- Put up a message box informing the user that they hit the end of the range of +-- records. +::method clientEnd private + use strict arg whichEnd + + msg = "At the" whichEnd "of the client list." + self~information(msg) + + +-- information() +-- A convenience method to display informational messages to the user. +::method information private + use strict arg msg + + title = "UpDown Controls" + button = "OK" + icon = "INFORMATION" + miscStyles = "APPLMODAL TOPMOST" + j = messageDialog(msg, self~hwnd, title, button, icon, miscStyles) + + +-- fillClientDB() +-- Convenience method for this example. Fills an array with the 'database' +-- records. +::method fillClientDB private + use strict arg db + + db[1] = .array~of("Cathy Smart", 44, "female", "yes") + db[2] = .array~of("Tom Jones", 34, "male", "no") + db[3] = .array~of("Bill Harris", 23, "male", "yes") + db[4] = .array~of("Larry Bonds", 41, "male", "yes") + db[5] = .array~of("Sue Evans", 55, "female", "no") + db[6] = .array~of("Ashley Wright", 17, "female", "yes") + db[7] = .array~of("Deb Newsome", 22, "female", "yes") + db[8] = .array~of("Frank Getts", 22, "male", "yes") + db[9] = .array~of("Betty Boop", 34, "female", "no") + db[10] = .array~of("Fred Aston", 56, "male", "no") + db[11] = .array~of("Cary Thule", 85, "female", "no") + db[12] = .array~of("Brianna Medford", 24, "female", "yes") + db[13] = .array~of("Sol Price", 26, "male", "no") + db[14] = .array~of("Hugh Dentry", 41, "male", "no") + db[15] = .array~of("Tina McGrath", 49, "female", "yes") + db[16] = .array~of("Tom Denard", 26, "female", "yes") + db[17] = .array~of("Crissy Albright", 21, "female", "yes") + db[18] = .array~of("Phil Logan", 19, "male", "no") + db[19] = .array~of("Walter Perkins", 50, "male", "yes") + db[20] = .array~of("Zoe Sharpe", 28, "female", "no") + diff --git a/modules/windows/oodialog/controls/userStringDTP.h b/modules/windows/oodialog/controls/userStringDTP.h new file mode 100644 index 0000000..642c40a --- /dev/null +++ b/modules/windows/oodialog/controls/userStringDTP.h @@ -0,0 +1,54 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_SYSTEMTIME 100 +#define IDD_HELP 200 +#define IDC_ST_CUR_TIME 1000 +#define IDC_ST_CUR_DATE 1001 +#define IDC_ST_NEW_DATE 1002 +#define IDC_DTP_SYSTIME 1003 +#define IDC_ST_NEW_TIME 1004 +#define IDC_EDIT_CUR_DATE 1006 +#define IDC_ST_INVALID 1007 +#define IDC_EDIT_CUR_TIME 1008 +#define IDC_EDIT_NEW_DATE 1011 +#define IDC_EDIT_NEW_TIME 1012 +#define IDC_HELP_TEXT 1015 diff --git a/modules/windows/oodialog/controls/userStringDTP.hlp b/modules/windows/oodialog/controls/userStringDTP.hlp new file mode 100644 index 0000000..209202a --- /dev/null +++ b/modules/windows/oodialog/controls/userStringDTP.hlp @@ -0,0 +1,77 @@ +'' || .endOfLine || - +'' || .endOfLine || - +' Changing the System Date and Time' || .endOfLine || - +' =================================' || .endOfLine || - +'' || .endOfLine || - +' This program allows you to change the system date and or time by' || .endOfLine || - +' setting the displayed date and time in the date and time picker control' || .endOfLine || - +' in the center of the dialog to the desired new date (and / or new' || .endOfLine || - +' time.)' || .endOfLine || - +'' || .endOfLine || - +' User Interface' || .endOfLine || - +' ==============' || .endOfLine || - +'' || .endOfLine || - +' Two fields on the left of the dialog show the current system date and' || .endOfLine || - +' time.' || .endOfLine || - +'' || .endOfLine || - +' Two fields on the right of the dialog show the date and time the system' || .endOfLine || - +' date and time will be changed to, if the user clicks the okay button at' || .endOfLine || - +' that point. When there is no change to the system date and time, the' || .endOfLine || - +' fields are empty and colored greenish as a visual clue that nothing' || .endOfLine || - +' will change. When there will be a change to the system date and time' || .endOfLine || - +' the fields are colored reddish.' || .endOfLine || - +'' || .endOfLine || - +' The new system date and time are specified by changing the date and /' || .endOfLine || - +' or time in the date and time picker control in the center of the' || .endOfLine || - +' dialog. This is done through the standard date and time picker user' || .endOfLine || - +' interface.' || .endOfLine || - +'' || .endOfLine || - +' This program allows directly entering what are termed 'shortcut'' || .endOfLine || - +' strings.' || .endOfLine || - +'' || .endOfLine || - +' When the program starts, the DTP control is set to the current system' || .endOfLine || - +' date and time. Of course as the dialog executes the system time is' || .endOfLine || - +' advancing. If the DTP is changed to a new date and / or time, but then' || .endOfLine || - +' those changes need to be undone, it would be difficult to manually set' || .endOfLine || - +' the DTP control to the current system date and time. So that operation' || .endOfLine || - +' is one set of shortcuts.' || .endOfLine || - +'' || .endOfLine || - +' The other set of shortcuts allows directly changing the DTP display to' || .endOfLine || - +' some time or date by just typing it in. For instance, to change the' || .endOfLine || - +' date to May 12, 2050, rather than page through the DTP control to get' || .endOfLine || - +' there, 5/12/2050 can be typed directly in the DTP control.' || .endOfLine || - +'' || .endOfLine || - +' To directly type in the DTP control, use either the F2 key, or mouse' || .endOfLine || - +' click on the DTP control's display area when the DTP currently has the' || .endOfLine || - +' focus. This is a (little known?) feature of the DTP control itself.' || .endOfLine || - +'' || .endOfLine || - +' The valid shortcuts are these:' || .endOfLine || - +'' || .endOfLine || - +' Reset shortcut:' || .endOfLine || - +'' || .endOfLine || - +' This shortcut resets any changes to the date and or time to none. It' || .endOfLine || - +' also resets the date and time picker control to the current system' || .endOfLine || - +' date and time.' || .endOfLine || - +'' || .endOfLine || - +' Type 'reset', 'cancel' 'r', or 'c' Case is not significant.' || .endOfLine || - +'' || .endOfLine || - +' New date and or new time shortcut:' || .endOfLine || - +'' || .endOfLine || - +' This shortcut allows directly entering a new date, or a new time,' || .endOfLine || - +' or both.' || .endOfLine || - +'' || .endOfLine || - +' Formats for new date: mm/dd, or mm/dd/yyyy' || .endOfLine || - +'' || .endOfLine || - +' Formats for new time: hh:mm, or hh:mm:ss' || .endOfLine || - +'' || .endOfLine || - +' When both date and time are entered, the date must precede the time.' || .endOfLine || - +' The date and time must be separated by one or more spaces. It is not' || .endOfLine || - +' required to enter both a date and a time. Only a new date can be' || .endOfLine || - +' entered, or only a new time.' || .endOfLine || - +'' || .endOfLine || - +' Months (mm), days (dd), hours (hh), minutes (mm), or seconds(ss) can' || .endOfLine || - +' contain a leading 0, but are not required to. I.e., for June 5th,' || .endOfLine || - +' the new date string can be 06/05, 6/05, 06/5, or 6/5. The year' || .endOfLine || - +' (yyyy) portion of the new date string is required to be the 4 digit' || .endOfLine || - +' year. I.e. 6/5/11 is not valid for June 5th 2011.' || .endOfLine || - +'' || .endOfLine diff --git a/modules/windows/oodialog/controls/userStringDTP.rc b/modules/windows/oodialog/controls/userStringDTP.rc new file mode 100644 index 0000000..bc76e09 --- /dev/null +++ b/modules/windows/oodialog/controls/userStringDTP.rc @@ -0,0 +1,76 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "userStringDTP.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_SYSTEMTIME DIALOGEX 0, 0, 247, 150 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Adjust System Date & Time" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + GROUPBOX "Change the System Date and / or the Time", IDC_STATIC, 11, 10, 226, 101, WS_GROUP + LTEXT "Current Date:", IDC_ST_CUR_DATE, 23, 27, 45, 8, SS_LEFT + EDITTEXT IDC_EDIT_CUR_DATE, 71, 25, 48, 14, NOT WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY + LTEXT "Current Time:", IDC_ST_CUR_TIME, 23, 46, 45, 8, SS_LEFT + EDITTEXT IDC_EDIT_CUR_TIME, 71, 44, 48, 14, NOT WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY + LTEXT "New Date:", IDC_ST_NEW_DATE, 143, 27, 35, 8, SS_LEFT + EDITTEXT IDC_EDIT_NEW_DATE, 181, 25, 48, 14, NOT WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY + LTEXT "New Time:", IDC_ST_NEW_TIME, 143, 46, 35, 8, SS_LEFT + EDITTEXT IDC_EDIT_NEW_TIME, 181, 44, 48, 14, NOT WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY + CONTROL "", IDC_DTP_SYSTIME, DATETIMEPICK_CLASS, WS_TABSTOP | DTS_LONGDATEFORMAT | DTS_APPCANPARSE, 11, 69, 226, 15 + LTEXT "Invalid shortcut string: 05/12/3011 08:09:22", IDC_ST_INVALID, 23, 93, 206, 8, SS_LEFT + DEFPUSHBUTTON "OK", IDOK, 82, 126, 50, 14, WS_GROUP + PUSHBUTTON "Cancel", IDCANCEL, 135, 126, 50, 14 + PUSHBUTTON "Help", IDHELP, 187, 126, 50, 14 +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_HELP DIALOGEX 0, 0, 409, 305 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Help for Setting the System Date and Time " +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + EDITTEXT IDC_HELP_TEXT, 10, 10, 389, 271, WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY | ES_WANTRETURN + DEFPUSHBUTTON "Close", IDOK, 350, 281, 49, 14 +} + diff --git a/modules/windows/oodialog/controls/userStringDTP.rex b/modules/windows/oodialog/controls/userStringDTP.rex new file mode 100755 index 0000000..edd25f2 --- /dev/null +++ b/modules/windows/oodialog/controls/userStringDTP.rex @@ -0,0 +1,646 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +/** + * An example of a date and time picker control and how to handle the USERSTRING + * event notification. + * + * This program mimics an application that could be used to change the system + * date and time. It allows the user to enter a new system date and or time + * through a DTP control. Once a new date and / or new time are displayed in + * the DTP control, if the user clicks the ok button the system date and time + * is updated to the date and time displayed in the control. + * + * When a DTP control has the CANPARSE style, it allows the user to directly + * enter text in the display area of the DTP. When the user is done editing, + * a USERSTRING event notification is sent. The programmer connects this event + * and then handles the notification by updating the DTP control based on the + * text the user entered. + * + * This program allows the user to directly enter what are termed 'shortcut' + * strings. + * + * When the program starts, the DTP control is set to the current system date + * and time. Of course as the dialog executes the system time is advancing. If + * the user has changed the DTP to a new date and / or time, but then wants to + * undo those changes, it would be difficult to manually set the DTP control to + * the current system date and time. So that operation is one set of shortcuts. + * + * The other set of shortcuts allows the user to directly go to some time or + * date by just typing it in. For instance, if the user wanted to change the + * date to May 12, 2050, rather than page through the DTP control to get there, + * the user can just type 5/12/2050 directly in the DTP control. + * + * To directly type in the DTP control, the user can either use the F2 key, or + * mouse click on the DTP control's display area when the DTP currently has the + * focus. This is a (little known?) feature of the DTP control itself. It is + * not something that the ooDialog framework provides. + * + * The valid shortcuts are these: + * + * Reset shortcut: + * + * This shortcut resets any changes to the date and or time to none. It also + * resets the date and time picker control to the current systeme date and + * time. + * + * Type 'reset', 'cancel' 'r', or 'c' Case is not significant. + * + * New date and or new time shortcut: + * + * This shortcut allows directly entering a new date, or a new time, or both. + * + * Formats for new date: mm/dd, or mm/dd/yyyy + * + * Formats for new time: hh:mm, or hh:mm:ss + * + * When both date and time are entered, the date must precede the time. The + * date and time must be separated by one or more spaces. It is not required + * to enter a date and a time. Only a new date can be entered or only a new + * time. + * + * Months (mm), days (dd), hours (hh), minutes (mm), or seconds(ss) can + * contain a leading 0, but are not required to. I.e., for June 5th, the new + * date string can be 06/05, 6/05, 06/5, or 6/5. The year (yyyy) portion of + * the new date string is required to be the 4 digit year. I.e. 6/5/11 is not + * valid for June 5th 2011. + */ + + sd = locate() + .application~setDefaults('O', sd'userStringDTP.h', .false) + + dlg = .SystemTimeDlg~new(sd'userStringDTP.rc', IDD_SYSTEMTIME) + dlg~execute("SHOWTOP") + +return 0 + +::requires "ooDialog.cls" + +::class 'SystemTimeDlg' subclass RcDialog + +/** initDialog() + * + * initDialog() is automatically invoked by the ooDialog framework when the + * underlying Windows dialog is created. It is used to do initialization that + * can only be done when the underlying dialog and dialog controls exist. + * + * This is a typical dialog initialization. + */ +::method initDialog + expose curDate curTime dtp newDate newTime resetting colorIsSet stInvalid + + -- We need to be sure the Rexx stInvalid object exists before we connect the + -- events to onFocus(). Otherwise, the events can fire with stInvalid being + -- .nil. + stInvalid = self~newStatic(IDC_ST_INVALID)~~setText("") + + self~connectDateTimePickerEvent(IDC_DTP_SYSTIME, "SETFOCUS", onFocus) + self~connectDateTimePickerEvent(IDC_DTP_SYSTIME, "KILLFOCUS", onFocus) + self~connectDateTimePickerEvent(IDC_DTP_SYSTIME, "DROPDOWN", onFocus) + + -- Connect the help key event to our onHelp() method. + self~connectHelp(onHelp) + + -- Connect the other DTP control event notifications and initialize the DTP. + self~connectDateTimePickerEvent(IDC_DTP_SYSTIME, "USERSTRING", onUserString) + self~connectDateTimePickerEvent(IDC_DTP_SYSTIME, "DATETIMECHANGE", onDateTime) + + dtp = self~newDateTimePicker(IDC_DTP_SYSTIME); + dtp~setFormat("'Today is:' dddd MMMM dd, yyyy 'at' hh':'mm':'ss tt") + + -- Save references to the read only edit controls. + curDate = self~newEdit(IDC_EDIT_CUR_DATE) + curTime = self~newEdit(IDC_EDIT_CUR_TIME) + newDate = self~newEdit(IDC_EDIT_NEW_DATE) + newTime = self~newEdit(IDC_EDIT_NEW_TIME) + + -- Set the new date and new time fields to 'no change at present.' + self~resetNewDateTime + + -- Begin updating the current date and time fields with the current system + -- date and time. + self~start('updateSysTime') + + +/** resetNewDateTime() + * + * The new date and new time fields display the date and time that the user has + * selected to set the system date and time to. The fields are updated every + * time the user changes the date and time in the DTP control. + * + * However, once the user has changed the DTP time and date, one of the + * shortcuts can be used to reset the DTP to the current system date and time. + * At this point the new date and new time fields are set to blank and the color + * of the fields is set to green, to indicate that no change will be made if the + * user clicks the ok button a this time. + */ +::method resetNewDateTime unguarded private + expose newDate newTime resetting colorIsSet + + newDate~setText('') + newTime~setText('') + + self~setControlColor(IDC_EDIT_NEW_DATE, 3) + self~setControlColor(IDC_EDIT_NEW_TIME, 3) + newDate~redraw + newTime~redraw + + resetting = .false + colorIsSet = .false + + +/** onDateTime() + * + * This is the event handler for the DATETIMECHANGE event. This method is + * invoked each time there is a change in the DTP control. + * + * There are 2 cases here we need to check for. Either, the user is changing + * the date and / or time to set the system to a new time, or the user has used + * the short cut to set the DTP control to the current system data and time. + * + * When the user is resetting the DTP control to the current system time, we + * need to set new date and new time back to blank - in effect undo any changes + * that may have selected a new data and time. + * + * Otherwise, the user has changed the DTP control to reflect the date and time + * she wants to change the system date and time to. In this case we update the + * new date and time fields to show what the system time will be set to if the + * ok button is clicked. + */ +::method onDateTime unguarded + expose dtp newDate newTime resetting colorIsSet stInvalid + + stInvalid~setText('') + + if resetting then do + self~resetNewDateTime + end + else do + parse value dtp~getDateTime with yy '-' mm '-' dd 'T' time '.' junk + + if \ colorIsSet then do + self~setControlColor(IDC_EDIT_NEW_DATE, 13) + self~setControlColor(IDC_EDIT_NEW_TIME, 13) + colorIsSet = .true + end + + newDate~setText(mm'/'dd'/'yy) + newTime~setText(time) + end + + return 0 + +/** onUserString() + * + * This is the event handler for the USERSTRING event. It is invoked when the + * user has elected to type a shortcut in the DTP control and has finished + * editing. + * + * This is the main point of this example, to show how to handle the user string + * event. We examine what the user typed and determine if it is a valid + * 'shortcut' string. When it is valid, we return a .DateTime object with the + * date and time we want the DTP control to update its display to. If it is not + * valid we return the same .DateTime object we received. + * + * When the returned date and time is different from the DTP control's current + * date an it, the control updates its display to the returned date and time. + * When the returned date and time is the same as the DTP controls current date + * and time, the DTP does nothing. + * + * When users type a shortcut string, they will expect the DTP control's display + * to change. However, typos are common. Without a clue as to what they did + * wrong, it is hard for users to know what happened. So, it the user string is + * not valid, we display a clue to the problem by setting the IDC_ST_INVALID + * static control's text to an error message. + * + * Other than those basic principles, it is merely a matter of determining if + * the user typed a valid shortcut, or not. + */ +::method onUserString unguarded + expose resetting stInvalid + use arg dt, userStr, id, hwnd + + stInvalid~setText('') + + -- Check for the shortcut to set the DTP to the current date and time. + upStr = userStr~upper + if upStr == 'C' | upStr == 'R' | upStr == 'CANCEL' | upStr == 'RESET' then do + resetting = .true + return .DateTime~new + end + + -- The rest is just mechanics. There is no attempt to be clever, this is just + -- a rather brute force approach. Check for things that can't possibly be + -- valid and return invalid for them. Continue doing that until we can parse + -- out month, day, year, hour, minutes, seconds. Check that the parsed values + -- are valid numbers, the return a new .DateTime object based on those values. + + dateStr = '' + timeStr = '' + + if userStr~words == 2 then do + dateStr = userStr~word(1) + timeStr = userStr~word(2) + end + else if userStr~words == 1 then do + if userStr~pos('/') <> 0 then dateStr = userStr + else if userStr~pos(':') <> 0 then timeStr = userStr + end + else do + return self~invalid(userStr, dt) + end + + slashes = dateStr~countStr('/') + colons = timeStr~countStr(':') + + if slashes == 0, colons == 0 then return self~invalid(userStr, dt) + if slashes > 2 | colons > 2 then return self~invalid(userStr, dt) + + parse value dt~isoDate with yy '-' mm '-' dd 'T' hh ':' min ':' ss '.' junk + + nYY = -1; nMM = -1; nDD = -1; nHH = -1; nMin = -1; nSS = -1 + + if slashes == 1 then do + parse var dateStr nMM '/' nDD . + nMM = nMM~strip~strip( , '0') + nDD = nDD~strip~strip( , '0') + + if \ nMM~dataType('W') | \ nDD~dataType('W') then return self~invalid(userStr, dt) + if nMM < 1 | nMM > 12 then return self~invalid(userStr, dt) + if nDD < 1 | nDD > 31 then return self~invalid(userStr, dt) + end + else if slashes == 2 then do + parse var dateStr nMM '/' nDD '/' nYY . + nMM = nMM~strip~strip( , '0') + nDD = nDD~strip~strip( , '0') + nYY = nYY~strip~strip( , '0') + + if \ nMM~dataType('W') | \ nDD~dataType('W') | \ nYY~dataType('W') then return self~invalid(userStr, dt) + if nMM < 1 | nMM > 12 then return self~invalid(userStr, dt) + if nDD < 1 | nDD > 31 then return self~invalid(userStr, dt) + if nYY < 1601 | nYY > 9999 then return self~invalid(userStr, dt) + end + + if colons == 1 then do + parse var timeStr nHH ':' nMin . + nHH = nHH~strip~strip( , '0') + nMin = nMin~strip~strip( , '0') + + if \ nHH~dataType('W') | \ nMin~dataType('W') then return self~invalid(userStr, dt) + if nHH < 0 | nHH > 23 then return self~invalid(userStr, dt) + if nMin < 0 | nMin > 59 then return self~invalid(userStr, dt) + end + else if colons == 2 then do + parse var timeStr nHH ':' nMin ':' nSS . + nHH = nHH~strip~strip( , '0') + nMin = nMin~strip~strip( , '0') + nSS = nSS~strip~strip( , '0') + + if \ nHH~dataType('W') | \ nMin~dataType('W') | \ nSS~dataType('W') then return self~invalid(userStr, dt) + if nHH < 0 | nHH > 23 then return self~invalid(userStr, dt) + if nMin < 0 | nMin > 59 then return self~invalid(userStr, dt) + if nSS < 0 | nSS > 59 then return self~invalid(userStr, dt) + end + + if nYY <> -1 then yy = nYY + if nMM <> -1 then mm = nMM~right(2, 0) + if nDD <> -1 then dd = nDD~right(2, 0) + if nHH <> -1 then hh = nHH~right(2, 0) + if nMin <> -1 then min = nMin~right(2, 0) + if nSS <> -1 then ss = nSS~right(2, 0) + + -- Okay, things should be good, but we haven't checked for something like + -- February 30, or June 31. Construct our ISO string and then check it is + -- valid. + isoStr = yy'-'mm'-'dd'T'hh':'min':'ss'.000000' + + if \ self~validIso(isoStr) then return self~invalid(userStr, dt) + + nDT = .DateTime~fromIsoDate(isoStr) + return nDT + + +/** updateSysTime() + * + * This method is started and runs asynchronously to the rest of the dialog. It + * updates the current System date and time as the dialog is running. + * + * When the dialog is started the current date and the current time read only + * edit controls are set to the system date and time. Of course, the correct + * system date and time is constantly incrementing. This method updates the + * edit with the correct current time approximately every second. We do this by + * setting an alarm to fire every second that re-invokes this method. + * + * To get the current date and time, we instantiate a new .DateTime object each + * time this method is inovked. This makes things very easy for us, and auto- + * matically takes care of any 'drift' in the time. For instance, if we just + * added a second, to the last time, each time we are invoked, we would slowly + * drift away from the correct time. This is due to the fact that the timer + * can not be 100% accurate. Also there is some time taken up in processing + * each time we are invoked. + */ +::method updateSysTime unguarded + expose curDate curTime updateAlarm + + -- If the dialog is ended, quit. + if \ self~isDialogActive then return + + parse value .DateTime~new with yy '-' mm '-' dd 'T' time '.' junk + curDate~setText(mm'/'dd'/'yy) + curTime~setText(time) + + timerMsg = .Message~new(self, updateSysTime) + updateAlarm = .Alarm~new(1, timerMsg) + + +/** onFocus + * + * This event handler is connected to several of the DTP control's event + * notifications. Its only purpose is to erase the 'Invalid shortcut string' + * text. + */ +::method onFocus unguarded + expose stInvalid + + stInvalid~setText("") + return 0 + + +/** invalid() + * + * Convenience method called from onUserString() when the user typed an invalid + * shortcut. It sets a static control to message showing the invalid shortcut. + * This gives the user a visual clue as to why the time was not updated. + */ +::method invalid unguarded private + expose stInvalid + use strict arg userStr, dt + + stInvalid~setText('Invalid shortcut string:' userStr) + return dt + + +/** validIso() + * + * This convenience method is called from onUserString() when the method gets to + * the point where it thinks it has a valid shortcut to update to a new date and + * time. + * + * But, it hasn't checked for things like June 31 or February 29. + * + * Here, rather than do an elaborate table lookup to check for invalid days, we + * take a simple approach. We trap a syntax condition and then just try to + * instantiate a .DateTime object with the string. If a condition is raised, we + * say - no the string is not valid. If no condition is raised we say - yes the + * string is valid. + */ +::method validIso unguarded private + use strict arg str + + signal on syntax + + .DateTime~fromIsoDate(str) + return .true + + syntax: + return .false + + +/** cancel() + * + * The event handler for the cancel event. This is invoked when the user closes + * the dialog, either through the cancel button or the escape key. + * + * We intercept the event to cancel the 'current' time updating, and then + * forward the message on to let the superclass handle the ending of the dialog + * prorperly. + * + * This is probably not really needed. If the alarm was not canceled, then the + * next time the alarm went off, updatesysTime() would see that the dialog was + * ended and quit on its own. + */ +::method cancel unguarded + expose updateAlarm + + updateAlarm~cancel + return self~cancel:super + +/** ok() + * + * The event handler for the OK event. This is invoked when the user clicks the + * ok button. + * + * In a real application, this is where the system date and time would be + * reset, if the user actually had a new date and time selected. Here we just + * put up a message box 'saying' we reset the date and time. + * + * Note that the newDate and newTime will not contain any text, *unless*, the + * user has actually changed the date or time in the DTP control. This makes a + * convenient check to see if we need to do anthing. + */ +::method ok unguarded + expose updateAlarm dtp newDate newTime + + updateAlarm~cancel + + nDate = newDate~getText + if nDate \== "" then do + nTime = newTime~getText + msg = "Set new system date and time to" nDate nTime + title = "System Date Time Reset" + j = MessageDialog(msg, self~hwnd, title) + end + + return self~ok:super + + +/** help() + * + * This is the event handler for the IDHELP command. Any button or menu item + * with the resource ID of IDHELP will generate the HELP command event. The + * ooDialog framework automatically connects the IDOK, IDCANCEL, and IDHELP + * commands to the ok(), cancel(), and help() methods in the dialog object. + * + * The default help() method does nothing. To do something the programmer over- + * rides the method in her subclass. Here we simply invoke the onHelp() method + * to do the work. + * + * Do not confuse the HELP command event with the help key (F1) event. + */ +::method help + self~onHelp + +/** onHelp() + * + * This is the event handler for the help key (F1) event. The event is + * generated when the user presses the F1 key. + * + * The programmer connects this event to a method in the Rexx dialog by using + * the connectHelp() method. Here in this event handler, we show a modal dialog + * with some help text. + * + * Do not confuse the help key (F1) event with the HELP command event. + */ +::method onHelp + .SystemTimeHelp~new(.application~srcDir'userStringDTP.rc', IDD_HELP)~execute("SHOWTOP") + + +::class 'SystemTimeHelp' subclass RcDialog + +::method initDialog + expose newFont e visibleLines + + e = self~newEdit(IDC_HELP_TEXT) + + -- Create a mono-spaced font for the edit control that displays the help text. + newFont = self~createFontEx('Courier New', 9) + + -- Set the font of the edit control to our custom font, set the text of the + -- edit control to our help text. + e~setFont(newFont) + e~setText(getHelpText()) + + +/** leaving() + * + * The leaving method is invoked automatically by the ooDialog framework + * immediately before the dialog is destroyed. + * + * At this point, the underlying Windows dialog still exists. This makes the + * leaving method the proper place to do clean up. Especially if some of the + * clean up, as does deleteFont(), requires the underlying dialog to exist. + * + * Here we delete the mono-spaced font created for the help text display. + */ +::method leaving + expose newFont + + self~deleteFont(newFont) + + +/** routine::getHelpText() + * + * This is convenience routine that returns the help text for the examp program. + * + * The help text is constructed here as a single string. + * + * The text could be contained in a file and read in when needed. To reduce the + * nubmer of files needed for the program, the text was just typed into the + * program file. + */ +::routine getHelpText + + txt = - + "" || .endOfLine || - + "" || .endOfLine || - + " Changing the System Date and Time" || .endOfLine || - + " =================================" || .endOfLine || - + "" || .endOfLine || - + " This program allows you to change the system date and or time by" || .endOfLine || - + " setting the displayed date and time in the date and time picker control" || .endOfLine || - + " in the center of the dialog to the desired new date (and / or new" || .endOfLine || - + " time.)" || .endOfLine || - + "" || .endOfLine || - + " User Interface" || .endOfLine || - + " ==============" || .endOfLine || - + "" || .endOfLine || - + " Two fields on the left of the dialog show the current system date and" || .endOfLine || - + " time." || .endOfLine || - + "" || .endOfLine || - + " Two fields on the right of the dialog show the date and time the system" || .endOfLine || - + " date and time will be changed to, if the user clicks the okay button at" || .endOfLine || - + " that point. When there is no change to the system date and time, the" || .endOfLine || - + " fields are empty and colored greenish as a visual clue that nothing" || .endOfLine || - + " will change. When there will be a change to the system date and time" || .endOfLine || - + " the fields are colored reddish." || .endOfLine || - + "" || .endOfLine || - + " The new system date and time are specified by changing the date and /" || .endOfLine || - + " or time in the date and time picker control in the center of the" || .endOfLine || - + " dialog. This is done through the standard date and time picker user" || .endOfLine || - + " interface." || .endOfLine || - + "" || .endOfLine || - + " This program allows directly entering what are termed 'shortcut'" || .endOfLine || - + " strings." || .endOfLine || - + "" || .endOfLine || - + " When the program starts, the DTP control is set to the current system" || .endOfLine || - + " date and time. Of course as the dialog executes the system time is" || .endOfLine || - + " advancing. If the DTP is changed to a new date and / or time, but then" || .endOfLine || - + " those changes need to be undone, it would be difficult to manually set" || .endOfLine || - + " the DTP control to the current system date and time. So that operation" || .endOfLine || - + " is one set of shortcuts." || .endOfLine || - + "" || .endOfLine || - + " The other set of shortcuts allows directly changing the DTP display to" || .endOfLine || - + " some time or date by just typing it in. For instance, to change the" || .endOfLine || - + " date to May 12, 2050, rather than page through the DTP control to get" || .endOfLine || - + " there, 5/12/2050 can be typed directly in the DTP control." || .endOfLine || - + "" || .endOfLine || - + " To directly type in the DTP control, use either the F2 key, or mouse" || .endOfLine || - + " click on the DTP control's display area when the DTP currently has the" || .endOfLine || - + " focus. This is a (little known?) feature of the DTP control itself." || .endOfLine || - + "" || .endOfLine || - + " The valid shortcuts are these:" || .endOfLine || - + "" || .endOfLine || - + " Reset shortcut:" || .endOfLine || - + "" || .endOfLine || - + " This shortcut resets any changes to the date and or time to none. It" || .endOfLine || - + " also resets the date and time picker control to the current system" || .endOfLine || - + " date and time." || .endOfLine || - + "" || .endOfLine || - + " Type 'reset', 'cancel' 'r', or 'c' Case is not significant." || .endOfLine || - + "" || .endOfLine || - + " New date and or new time shortcut:" || .endOfLine || - + "" || .endOfLine || - + " This shortcut allows directly entering a new date, or a new time," || .endOfLine || - + " or both." || .endOfLine || - + "" || .endOfLine || - + " Formats for new date: mm/dd, or mm/dd/yyyy" || .endOfLine || - + "" || .endOfLine || - + " Formats for new time: hh:mm, or hh:mm:ss" || .endOfLine || - + "" || .endOfLine || - + " When both date and time are entered, the date must precede the time." || .endOfLine || - + " The date and time must be separated by one or more spaces. It is not" || .endOfLine || - + " required to enter both a date and a time. Only a new date can be" || .endOfLine || - + " entered, or only a new time." || .endOfLine || - + "" || .endOfLine || - + " Months (mm), days (dd), hours (hh), minutes (mm), or seconds(ss) can" || .endOfLine || - + " contain a leading 0, but are not required to. I.e., for June 5th," || .endOfLine || - + " the new date string can be 06/05, 6/05, 06/5, or 6/5. The year" || .endOfLine || - + " (yyyy) portion of the new date string is required to be the 4 digit" || .endOfLine || - + " year. I.e. 6/5/11 is not valid for June 5th 2011." || .endOfLine || - + "" || .endOfLine + return txt diff --git a/modules/windows/oodialog/editrex.rex b/modules/windows/oodialog/editrex.rex new file mode 100755 index 0000000..67afced --- /dev/null +++ b/modules/windows/oodialog/editrex.rex @@ -0,0 +1,185 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: EditRex.rex */ +/* Type: Open Object Rexx ooDialog Script */ +/* */ +/* Description: */ +/* This script reads the registry entries for the ftype REXXScript EDIT */ +/* type and allows to change it between Notepad.EXE and any */ +/* given EDITOR */ +/* */ +/* It uses the WindowsRegistry Class and classes from the ooDialog */ +/* framework. */ +/* */ +/* */ +/****************************************************************************/ + +/* See if user gave directions */ +parse arg Interface + +/* The user may decide between Console or ooDialog Version */ +/* Default is ooDialog Version */ +/* If the ftype Open Command Setting is to rexxhide, the Console Version will NOT work */ +/* Verify if the given parm starts with "C", TRANSLATE changes it to UPPER CASE */ +if Interface~LEFT(1)~TRANSLATE = "C" then Interface = "CONSOLE" +else Interface = "ooDialog" + +/* create a new registry object */ +r = .WindowsRegistry~new + +/* leave if init failed */ +if r~InitCode \= 0 then do + call errorDialog 'Error open the registry. Program aborted.' + exit +end + +/* Set from default HKEY_LOCAL_MACHINE to HKEY_CLASSES_ROOT */ +r~Current_Key = r~CLASSES_ROOT + +/* Open the Key with Options QUERY and WRITE */ +if r~open(,"REXXScript\Shell\Edit\Command","QUERY WRITE") == 0 then do + call errorDialog 'Error opening the registry key with write access.' || '0d0a0d0a'x || - + 'If you are on Vista you must run this program with' || '0d0a'x || - + 'elevated privileges to see it work.' + exit +end + +/* Retrieves information about a given key in a compound variable */ +/* q.values holds the number of value entries. */ +q. = r~Query + +/* Retrieves all value entries of a given key into a compound variable */ +if r~ListValues(,vals.) = 0 then do + /* There are 3 possible values for each entry: + vals.i.name the Name of the value + vals.i.data the data of the entry + vals.i.type the type : NORMAL for alphabetic values, + EXPAND for expandable strings such as a path, + NONE for no specified type, + MULTI for multiple strings, + NUMBER for a 4-byte value, and + BINARY for any data format. + */ + /* get the current program only. Do not show the "%1" parameter */ + /* TRANSLATE it to UPPER CASE */ + program = vals.1.data~word(1)~TRANSLATE +end +else do + call errorDialog 'Error reading the registry. Program aborted.' + exit +end + +/* Ask user what to do */ +if Interface = "CONSOLE" then do + /* The next lines use an plain text interface */ + /* Show the curent content */ + say 'Current Edit Setting is : ' || program + say 'Please enter a number + to set it to :' + say '1 to EDIT it with NOTEPAD.EXE' + say '2 to EDIT with another program' + say 'Any other number to leave without changes' + say + /* Get selection */ + pull answer +end +else do + /* Get the current state, to make preselection in the dialog */ + if program~LASTPOS('NOTEPAD.EXE') > 0 then answer = '1' + else answer = '2' + /* The next lines use an "Single Selection Dialog" as interface to the user */ + sel.1 = "EDIT it with NOTEPAD.EXE" + sel.2 = "SELECT another program, currently set to : " || program + /* prepare the dialog */ + --dlg = .SingleSelection~new("Please select what to do","Ftype EDIT setting for ooRexx",sel.,answer,,answer) + dlg = .SingleSelection~new("Please select what to do","Ftype EDIT setting for ooRexx",sel.,answer) + /* show the dialog */ + answer = dlg~execute + + /* end of user interaction */ +end + +/* verify what to do */ +select + + when answer = '1' then do + newval = 'notepad.exe "%1"' + end + + when answer = '2' then do + if Interface = "CONSOLE" then do + say + say 'Please enter Path and name of the wanted editor ' + pull program + end + else do + /* Use the FilenameDialog to let the user select an other program */ + program = FilenameDialog('',,'Executables (*.EXE)'||'0'x||'*.EXE'||'0'x||'All Files (*.*)'||'0'x||'*.*','LOAD','Select program to use','EXE') + end + if program = '0' then exit /* Canceled by user */ + newval = program || ' "%1"' + end + otherwise exit +end + +/* Set the new value */ +/* Sets a named value of a given key */ +/* If name is blank or omitted, the default value is set */ +r~SetValue(r~Current_Key,"",newval,NORMAL) + +/* Forces the system to write the cache buffer of a given key to disk */ +/* If key_handle is omitted, CURRENT_KEY is flushed */ +r~flush(r~Current_Key) + +/* Closes a previously opened key specified by its handle */ +/* Since it can take several seconds before all data is written to disk,*/ +/* FLUSH was used before to empty the cache */ +/* If key_handle is omitted, CURRENT_KEY is closed */ +r~close(r~Current_Key) + +msg = 'The EDIT setting for ooRexx should now be' newVal + +if Interface = "CONSOLE" then do + say msg +end +else do + call InfoDialog msg +end + +::requires "winsystm.cls" -- required for the registry class +::requires "ooDialog.cls" -- required for the dialog class diff --git a/modules/windows/oodialog/examples/ReadMe.txt b/modules/windows/oodialog/examples/ReadMe.txt new file mode 100644 index 0000000..1021770 --- /dev/null +++ b/modules/windows/oodialog/examples/ReadMe.txt @@ -0,0 +1,96 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2007-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + ReadMe + + 1. ooDialog Example Programs + ------------------------------- + + This directory contains example ooDialog programs. They are intended to + be relatively short and simple programs that demonstrate how to use some + feature of ooDialog. + + - addManyRows.rex + + This example's main purpose is to show how to use the ProgressDialog + class. It allows the user to select how many list-view items are to be + added to the list-view before it starts. It also does some interesting + timings and displays the times in the dialog + + - browsePrinters.rex + + Shows how to use the BrowseForFolder class and how to customize the + browse dialog so that the user can select a printer. + + - fileNameDialog_demo.rex + + The FileNameDialog public routine allows a programmer to present the + user with the standard Windows Open or Save file dialog. The + fileNameDialog_demo program demonstrates how to use this routine. + + - imageButton.rex + + This example program demonstrates some of the new features introduced + in ooRexx 4.0.0, including the .Image, .Imagelist classes, and the + setImageList() method of the button class. + + - publicRoutines_demo.rex + + ooDialog contains a number of standard dialog and public routines. The + standard dialogs and public routines are designed to be easy to use. + They allow a programmer to added simple graphical elements to a program + without any detailed knowledge of the ooDialog framework. The + publicRoutines_demo program demonstrates how to use these public + routines. + + - simpleFolderBrowse.rex + + Demonstrates how to use the SimpleFolderBrowse class to allow the user + to pick a folder. + + - stopWatch.rex + + An intersting implmentation of a stop watch in Rexx. + + - useTools.rex + + This example program shows how to use a dialog that is an "owned" + window. Owned windows have several constraints, one of which is that + they always remain above their owner window. This makes them useful to + create "tool palette" types of programs. The example program does just + that, demonstrates a main dialog with a tool palette. + diff --git a/modules/windows/oodialog/examples/addManyRows.rex b/modules/windows/oodialog/examples/addManyRows.rex new file mode 100755 index 0000000..94c340f --- /dev/null +++ b/modules/windows/oodialog/examples/addManyRows.rex @@ -0,0 +1,609 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * This example shows how to use the standard dialog, the ProgressDialog + * dialog, to show the user how a lengthy operation is progressing. It also + * demonstrates how much faster an internal sort can be than using a Rexx sort. + * + * The main points of the example are: + * + * 1.) It shows how to use the ProgressDialog class. + * + * 2.) It shows how to use the LvFullRow, LvItem, and LvSubItem objects to add + * items to list-views + * + * 3.) It shows to sort on a column in the list-view + * + * Note that in the .rc file, the resource script file, for this example, the + * dialog is created *not* visible. Thus, while the dialog is being + * initialized, it is not visible on the screen. This eliminates flicker while + * the items are being inserted into the list-view. Some people like the users + * of their applications to see the list-view being filled, some people dislike + * flicker. So, it is mostly a matter of preference how you create the dialog, + * initially visible, or initially invisible. But, it is good to be aware of + * the option. + * + * In addition, with a large number of list-view items, it takes some time to + * create the LvFullRow objects and insert them into the list-view. With the + * dialog being invisible, the user is going to wonder what is going on. This + * is the perfect time to use a ProgressDialog. + * + * NOTE: During a Rexx sort of the items in a list-view, the list-view invokes + * the Rexx method in this dialog to do a comparison of 2 items. We do + * not know what sorting algorithm the list-view is using, but we can + * speculate that it is a quick sort. Each callback from the native code + * the list-view is running in, to the Rexx interpreter, is relatively + * expensive. Expensive relative to the time to actually do a single + * comparison. As the number of items to sort grows, the number of + * comparisons grows, worst case, exponentially. Even average case, + * O(n log n), the growth is far from linear. As the number of + * comparisons grows, the expensive callbacks into the interpreter truely + * dominate. Do not use the Rexx sort for a large number of items. + * Start by using a Rexx sort with a small number of items to get a feel + * for how long it is taking. Using a Rexx sort with a large nubmer of + * items, will always finish, eventually. It may literally take hours. + * + * This example times the operations where a progress dialog is displayed and + * shows those times in the main dialog. This is an interesting experiment. + * + * The internal sort is very fast, in comparison. Do not hesitate to sort + * even the maximum number of items using the internal sort. + */ + + -- Ensure we can be run from any directory. + srcDir = locate() + + -- Set the defaults for this application. Use the global .constDir 'O'nly, + -- Read the 'addManyRows.h' file for symbolic resource ID definitions. + -- And, turn automatica data detection off (.false.) + .application~setDefaults('O', srcDir'resources\addManyRows.h', .false) + + -- Allow the user to pick the number of items to be inserted into the + -- list-view. + dlgIntro = .ExampleSetUpDlg~new(srcDir'resources\addManyRows.rc', IDD_INTRO) + if dlgIntro~execute('SHOWTOP') == dlgIntro~IDCANCEL then do + ret = MessageDialog('You are missing out on an excellent example', ,'User Canceled', 'OK', 'WARNING') + return 99 + end + + dlg = .AddManyRowsDlg~new(srcDir'resources\addManyRows.rc', IDD_ADD_ROWS) + if dlg~initCode = 0 then do + dlg~itemCount = dlgIntro~selectedCount + dlg~execute("SHOWTOP") + end + +return 0 +-- End of entry point. + +::requires "ooDialog.cls" + + +/** AddManyRowsDlg + * + * Our main example dialog subclass. + */ +::class 'AddManyRowsDlg' subclass RcDialog + +::attribute itemCount +::attribute createRowsTime +::attribute insertRowsTime +::attribute insertedRows +::attribute internalSortTime +::attribute rexxSortTime + +/** initDialog() + * + * initDialog is the place to do any initialization that requires the underlying + * dialog to exist. Here we add some extended list-view styles and fill the + * list-view with its items. + */ +::method initDialog + expose list rows createCanceled insertCanceled + + list = self~newListView(IDC_LV) + + list~addExtendedStyle("FULLROWSELECT GRIDLINES CHECKBOXES HEADERDRAGDROP SUBITEMIMAGES") + + list~InsertColumn(0, "Line text", 75) + list~InsertColumn(1, "Line number", 55) + list~InsertColumn(2, "Numbers", 50) + list~InsertColumn(3, "Characters", 55) + list~InsertColumn(4, "Characters", 55) + list~InsertColumn(5, "Characters", 55) + list~InsertColumn(6, "Characters", 55) + list~InsertColumn(7, "Characters", 55) + list~InsertColumn(8, "Characters", 55) + list~InsertColumn(9, "Characters", 55) + list~InsertColumn(10, "Characters", 55) + list~InsertColumn(11, "Characters", 55) + + self~connectButtonEvent(IDC_PB_SORT_INTERN, 'CLICKED', onSortInternally) + self~connectButtonEvent(IDC_PB_SORT_REXX, 'CLICKED', onSortRexx) + + rows = self~createRows(list) + + self~newGroupBox(IDC_GB_TIMES)~setText('Time in seconds (' || self~itemCount || ' rows):') + + self~setStatics + +/** setStatics + * + * Helper method to set up the static controls that are used to display the + * timings. How they are set is dependent on whether the user canceled the + * LvFullRow creation or the insertion of the rows. + */ +::method setStatics private + expose createCanceled insertCanceled staticInternal staticRexxSort + + staticCreate = self~newStatic(IDC_ST_CREATE) + staticInsert = self~newStatic(IDC_ST_INSERT) + staticInternal = self~newStatic(IDC_ST_INTERNAL) + staticRexxSort = self~newStatic(IDC_ST_REXXSORT) + + if createCanceled then do + staticCreate~setText('Create full rows:' self~createRowsTime '(canceled)') + staticInsert~setText('Insert full rows: N/A') + staticInternal~hide + staticRexxSort~hide + self~newPushButton(IDC_PB_SORT_INTERN)~disable + self~newPushButton(IDC_PB_SORT_REXX)~disable + + rect = staticCreate~windowRect + s = .Size~new(rect~right - rect~left, rect~bottom - rect~top) + s~width *= 2 + staticCreate~resizeTo(s) + return 0 + end + + staticCreate~setText('Create full rows:' self~createRowsTime) + + if insertCanceled then do + staticInsert~setText('Insert full rows:' self~insertRowsTime '(canceled after inserting' self~insertedRows 'rows)') + staticInternal~hide + staticRexxSort~hide + self~newPushButton(IDC_PB_SORT_INTERN)~disable + self~newPushButton(IDC_PB_SORT_REXX)~disable + + rect = staticInsert~windowRect + s = .Size~new(rect~right - rect~left, rect~bottom - rect~top) + s~width *= 2 + staticInsert~resizeTo(s) + return 0 + end + + staticInsert~setText('Insert full rows:' self~insertRowsTime) + + +/** onSortInternally() + * + * The event handler for the Internal Sort push button. We put up a dialog to + * let the user decide what and how to sort. + */ +::method onSortInternally unguarded + expose list staticInternal + + dlg = .SortSetupDlg~new(.application~srcDir'resources\addManyRows.rc', IDD_SORT_PARAMS) + if dlg~execute('SHOWTOP') == dlg~IDCANCEL then return 0 + + d = .directory~new + d~column = dlg~column + d~ascending = dlg~ascending + d~caseless = dlg~caseless + + j = time('E') + + list~sortItems('InternalListViewSort', d) + + self~internalSortTime = time('e') + staticInternal~setText('Internal sort:' self~internalSortTime) + + +/** onSortRexx() + * + * The event handler for the Rexx Sort push button. We put up a dialog to + * let the user decide what and how to sort. We also warn the user that the + * sort can take a very long time depending on the number of items in the + * list-view + */ +::method onSortRexx unguarded + expose list staticRexxSort rexxColumn rexxAscending rexxCaseless + + count = self~itemCount + + if count > 1500 & count <= 2000 then do + msg = "A Rexx sort with" count 'items can take' || .endOfLine || - + 'some time. Please be patient.' || .endOfLine~copies(2) + end + else if count > 2000 then do + msg = "A Rexx sort with" count 'items is not a' || .endOfLine || - + 'good idea, it can take too long.' || .endOfLine~copies(2) || - + 'If you want to perform this sort out of' || .endOfLine || - + 'curiousity, start the sort and then let' || .endOfLine || - + 'it alone. Windows will say the window' || .endOfLine || - + 'is not responding. But it will event-' || .endOfLine || - + 'ually finish. 5 minutes for 5000 items.' || .endOfLine || - + 'Times are exponential for more items.' || .endOfLine~copies(2) + end + + if msg~length > 3 then do + msg || = 'Do you want to continue?' + title = 'Cautionary Statement - Think Twice' + if MessageDialog(msg, self~hwnd, title, 'YESNO', 'WARNING') == self~IDNO then return 0 + end + + dlg = .SortSetupDlg~new(.application~srcDir'resources\addManyRows.rc', IDD_SORT_PARAMS) + if dlg~execute('SHOWTOP') == dlg~IDCANCEL then return 0 + + rexxColumn = dlg~column + rexxAscending = dlg~ascending + rexxCaseless = dlg~caseless + + msg = 'Performing a list-view item sort using a Rexx method of this dialog. Please be patient...' + capt = 'Rexx ooDialog Dialog Method Sort' + pbDlg = .ProgressDialog~new(capt, msg) + + pbDlg~msgHeight = 2 + pbDlg~marqueeMode = .true + pbDlg~marqueePause = 50 + pbDlg~noStatus = .true + + j = time('E') + pbDlg~begin + + reply 0 + list~sortItems('DOREXXSORT') + + pbDlg~endNow + + self~rexxSortTime = time('e') + staticRexxSort~setText('Rexx sort:' self~rexxSortTime) + + +/** doRexxSort() + * + * This is the call back method that actually does the comparison for 2 items in + * the list view. + */ +::method doRexxSort unguarded + expose rexxColumn rexxAscending rexxCaseless + use arg lvRow1, lvRow2 + + if rexxColumn == 0 then do + text1 = lvRow1~item~text + text2 = lvRow2~item~text + end + else do + text1 = lvRow1~subitem(rexxColumn)~text + text2 = lvRow2~subitem(rexxColumn)~text + end + + if rexxAscending then do + if rexxCaseless then return text1~caselessCompareTo(text2) + else return text1~compareTo(text2) + end + else do + if rexxCaseless then return text2~caselessCompareTo(text1) + else return text2~compareTo(text1) + end + + +/** createRows() + * + * Here we create LvFullRow objects for every list-view item. LvItem objects + * represent the list-view item and LvSubItem objects represent each column in + * the list-view item. + * + * All the full row objects are put into an array. The array is then used to + * insert all the items into the list-view. + */ +::method createRows private + expose createCanceled insertCanceled + use arg list + + j = time('E') + + createCanceled = .false + insertCanceled = .false + + count = self~itemCount + rows = .array~new(count) + + step = (count * 2) / 100 + if \ step~datatype('W') then step = trunc(step) + pbDlg = .ProgressDialog~new + pbDlg~msgText = 'Creating and inserting full rows into the list-view. This will take some time.' + + if self~itemCount > 30000 then do + extra = .endOfLine~copies(2) || 'It is possible that inserting' self~itemCount 'items will exhaust your system resources.' + pbDlg~msgText || = extra + pbDlg~msgHeight = 5 + end + + a = .Alerter~new + pbDlg~setInterruptible(a) + pbDlg~begin + pbDlg~updateStatus('0 full rows created') + + do i = 1 to count + j = i - 1 + lvi = .LvItem~new(j, 'Line' i) + lvsi1 = .LvSubItem~new(j, 1, i) + lvsi2 = .LvSubItem~new(j, 2, random(1, 200)) + lvsi3 = .LvSubItem~new(j, 3, self~randomChars) + lvsi4 = .LvSubItem~new(j, 4, self~randomChars) + lvsi5 = .LvSubItem~new(j, 5, self~randomChars) + lvsi6 = .LvSubItem~new(j, 6, self~randomChars) + lvsi7 = .LvSubItem~new(j, 7, self~randomChars) + lvsi8 = .LvSubItem~new(j, 8, self~randomChars) + lvsi9 = .LvSubItem~new(j, 9, self~randomChars) + lvsi10 = .LvSubItem~new(j, 10, self~randomChars) + lvsi11 = .LvSubItem~new(j, 11, self~randomChars) + + rows[i] = .LvFullRow~new(lvi, lvsi1, lvsi2, lvsi3, lvsi4, lvsi5, lvsi6, lvsi7, lvsi8, lvsi9, lvsi10, lvsi11, .true) + + if i // step = 0 then do + pbDlg~increase + pbDlg~updateStatus(i 'full rows created') + end + + if a~isCanceled then do + pbDlg~updateStatus('canceled after creating' i 'full rows') + r = SysSleep(1.5) + pbDlg~endNow + leave + end + end + + self~createRowsTime = time('e') + self~itemCount = rows~items + + if a~isCanceled then do + createCanceled = .true + return rows + end + + j = time('r') + + pbDlg~updateStatus('0 full rows inserted') + + list~prepare4nItems(rows~items) + + do i = 1 to rows~items + list~addFullRow(rows[i]) + + if i // step = 0 then do + pbDlg~increase + pbDlg~updateStatus(i 'full rows inserted') + end + if a~isCanceled then do + pbDlg~updateStatus('canceled after inserting' i 'full rows') + r = SysSleep(1.5) + pbDlg~endNow + leave + end + end + + self~insertRowsTime = time('e') + + if a~isCanceled then do + self~insertedRows = i + insertCanceled = .true + end + else do + pbDlg~complete + pbDlg~updateStatus('finished inserting' rows~items 'full rows') + r = SysSleep(1.5) + pbDlg~endNow + end + + return rows + + +/** randomChars() + * + * Simple method to generate some random string of characters. + */ +::method randomChars private + + len = random(1, 7) + chars = '' + + do i = 1 to len + upper = random(0, 1) + if upper then chars || = random(65, 90)~d2c + else chars || = random(97, 122)~d2c + end + + return chars + + +/** ExampleSetUpDlg + * + * A simple helper dialog for our example. We let the user choose the number of + * list-view items to insert. + * + * There is not much comment for this class, it is really pretty straight + * forward, initialize the dialog controls to the beginning state, what until + * the user closes the dialog, record the number of items the user picked. + */ +::class 'ExampleSetUpDlg' subclass RcDialog + +::attribute selectedCount + +::method initDialog + expose selectedCount updItems editItems chkFreeForm firstRB lastRB + + firstRB = .constDir[IDC_RB_1000] + lastRb = .constDir[IDC_RB_25000] + + selectedCount = 5000 + self~newRadioButton(IDC_RB_5000)~check + + updItems = self~newUpDown(IDC_SP_ITEMS) + r = .directory~new + r~min = 500 + r~max = 50000 + updItems~setRange(r) + updItems~setPosition(10000) + + updItems~disable + editItems = self~newEdit(IDC_ED_ITEMS)~~disable + chkFreeForm = self~newCheckBox(IDC_CK_FREEFORM) + + self~connectButtonEvent(IDC_CK_FREEFORM, 'CLICKED', onClick) + self~connectUpDownEVent(IDC_SP_ITEMS, 'DELTAPOS', onPosChange) + + +::method onClick unguarded + expose chkFreeForm updItems editItems firstRB lastRB + + + if chkFreeForm~checked then do + updItems~enable + editItems~enable + + do i = firstRB to lastRB + self~newRadioButton(i)~disable + end + end + else do + updItems~disable + editItems~disable + + do i = firstRB to lastRB + self~newRadioButton(i)~enable + end + end + +::method onPosChange unguarded + use arg pos, delta, id, hwnd + return .UpDown~deltaPosReply(.true, .false, delta * 100) + + +::method ok unguarded + expose chkFreeForm updItems firstRB lastRB selectedCount + + if chkFreeForm~checked then do + selectedCount = updItems~getPosition + end + else do + j = 1 + do i = firstRB to lastRB + if self~newRadioButton(i)~checked then leave + j += 1 + end + select + when j = 1 then selectedCount = 1000 + when j = 2 then selectedCount = 2000 + when j = 3 then selectedCount = 5000 + when j = 4 then selectedCount = 10000 + when j = 5 then selectedCount = 15000 + when j = 6 then selectedCount = 25000 + otherwise selectedCount = 0 + end + -- End select + end + + return self~ok:super + + +/** SortSetUpDlg + * + * A dialog to let the user choose what and how they want soreted. + * + * Similar to the ExampleSetUpDlg class there is not much comment here, the + * dialog is straight forward, set up the controls, record what the user pickes. + */ +::class 'SortSetUpDlg' subclass RcDialog + +::attribute column +::attribute ascending +::attribute caseless + +::method initDialog + expose column ascending caseless rbItem rbAscending rbCaseless upDown edit + + column = 0 + ascending = .true + caseless = .true + + rbItem = self~newRadioButton(IDC_RB_ITEM)~~check + rbAscending = self~newRadioButton(IDC_RB_ASCENDING)~~check + rbCaseless = self~newRadioButton(IDC_RB_CASELESS)~~check + + upDown = self~newUpDown(IDC_SP_COL)~~disable + edit = self~newEdit(IDC_ED_COL)~~disable + + upDown~setRange(1, 11) + upDown~setPosition(3) + + self~connectButtonEvent(IDC_RB_ITEM, 'CLICKED', onItemClick) + self~connectButtonEvent(IDC_RB_SUBITEM, 'CLICKED', onSubItemClick) + + rbItem~assignFocus + + +::method onItemClick unguarded + expose upDown edit + + upDown~disable + edit~disable + + +::method onSubItemClick unguarded + expose upDown edit + + upDown~enable + edit~enable + + +::method ok unguarded + expose column ascending caseless rbItem rbAscending rbCaseless upDown + + if rbItem~checked then column = 0 + else column = upDown~getPosition + + if rbAscending~checked then ascending = .true + else ascending = .false + + if rbCaseless~checked then caseless = .true + else caseless = .false + + return self~ok:super + + diff --git a/modules/windows/oodialog/examples/browsePrinters.rex b/modules/windows/oodialog/examples/browsePrinters.rex new file mode 100755 index 0000000..2a36590 --- /dev/null +++ b/modules/windows/oodialog/examples/browsePrinters.rex @@ -0,0 +1,220 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2022 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * An example showing usage of the BrowseForFolder class. This example shows + * how to use the class to browse virtual folders, in this case the Printers + * folder. + * + * The BrowseForFolder object puts up the same Windows Shell browse dialog as + * does the SimpleFolderBrowse object, but it is much more configurable. + * + * This example uses the browse for folder dialog to let the user select a + * printer. + * + * The example puts up a regular dialog and on the push of a button shows the + * browse for folder dialog set to browse only printers. The user's pick is + * is displayed in an edit box. + */ + + -- Set up some symbolic IDs and then put up our example dialog. + .application~setDefaults('O', , .false) + .constDir[IDC_PB_BROWSE] = 100 + .constDir[IDC_ST_RESULTS] = 101 + .constDir[IDC_EDIT] = 102 + .constDir[IDC_RB_LONG_NAME] = 103 + .constDir[IDC_RB_SHORT_NAME] = 104 + + dlg = .PrintersDialog~new + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + + return 0 + +::requires "ooDialog.cls" + +::class 'PrintersDialog' subclass UserDialog + +/** init() + * + * Typical UserDialog init() method. Initializes the super class, the starts + * the dialog template by creating the frame in the template. Internally, the + * create() method will invoke the define() method. When create() returns, + * the dialog template will be complete. + */ +::method init + forward class (super) continue + + self~create(30, 30, 257, 123, "Browse For Printers Example", "CENTER") + + +/** define() + * + * A typical define() method for a UserDialog. We create a push button in the + * dialog template that allows the user to show the browse for folder dialog. + * + * An edit control and two radio buttons are created, the edit control shows + * the result of the user's selection in the browse for folder dialog. The + * radio button control how the selection is returned from the browse for + * folder dialog. + */ +::method defineDialog + + self~createStaticText(IDC_ST_RESULTS, 10, 10, 30, 11, , "Results:") + self~createEdit(IDC_EDIT, 10, 24, 237, 11, 'AUTOSCROLLH') + self~createRadioButton(IDC_RB_LONG_NAME, 10, 60, 90, 14, "AUTO", 'Long Display Name') + self~createRadioButton(IDC_RB_SHORT_NAME, 10, 79, 90, 14, "AUTO", 'Short Display Name') + self~createPushButton(IDC_PB_BROWSE, 10, 99, 65, 14, "DEFAULT", "Browse Printers", onBrowse) + self~createPushButton(IDCANCEL, 197, 99, 50, 14, , "Done") + + +/** onBrowse() + * + * The event handler for the Browse Printers push button. We configure a + * BrowseForFolder object, display it, and report the user's actions in the edit + * control. + * + * The Windows Shell keeps track of things in the shell using a structure called + * an 'item ID list.' Every thing in the shell has an item ID list. Most + * things in the shell have a corresponding file system path. But not every + * thing. Virtual folders like the printer objects do not have a file system + * path. + * + * The getFolder() method returns the file system path picked by the user. That + * method can not return a value for a virtual folder, so it returns .nil. To + * get the printer the user picks, we need to use the getItemIDList() method. + * This method returns the handle to an item ID list. + * + * Currently, the programmer can not do much with an item ID list handle. This + * may change in future versions of ooDialog. However, the programmer can get + * the display name of the shell item through the item ID list, which is what + * we do here. + * + * Like most, if not all, handles in Windows, the item ID list handle represents + * a system resource that has been allocated by the OS. When the Rexx + * programmer is done with the item ID list, it is good practice to release the + * handle to free up the system resources used by the item ID list. + */ +::method onBrowse unguarded + expose rbShort edit + + -- Set title, banner, and a hint for the dialog. + title = 'Browse For a Printer' + banner = 'Select the printer to use for this test.' + hint = 'This is only a demonstration, no printing will be done.' + + bff = .BrowseForFolder~new(title, banner, hint) + + -- Make this dialog the owner window of the browse dialog. The root for the + -- browse dialog will be the virtual Printers folder. If that is not set, + -- the user will not see the printers. In addition, we want the user to + -- only see the printers. That way, if the dialog is not canceled, we are + -- sure a printer was picked and not some random folder. + bff~owner = self + bff~root = 'CSIDL_PRINTERS' + + -- Set non-default options for the browse dialog. We need the browse for + -- printers option. The operating system will not allow a new folder to be + -- created in the virtual printers folder, so it disables the Make New + -- Folder button. It looks better to just remove the button altogether. + bff~options = 'BROWSEFORPRINTER NONEWFOLDERBUTTON' + + -- The getItemIDList() method is what actually puts up the browse for folder + -- dialog. Normally, by default, the getItemIDList() will release the COM + -- resources used our BrowseForFolder object. But, we still need the COM + -- resources to be able to use the getDisplayName() method. So, we tell the + -- method we still need COM active by passing in .true to the method. + -- + -- We we tell the object we still need COM, it then becomes our + -- responsibility to release COM. If the user cancels, we release COM and + -- return. Otherwise, we release COM further down in this method when we + -- are finished with COM. + pidl = bff~getItemIDList(.true) + if pidl == .nil then do + edit~setText('The user canceled.') + bff~releaseCOM + return 0 + end + + -- Decide what the format for the returned display name. With no arguments, + -- the getDisplayName() method will try to return the most complete name. + -- For a folder with a file system path, that will be a fully qualified + -- path name. For a virtual folder, the name will include the parent + -- folder(s) of the actual folder picked. + -- + -- The second optional argument to getDisplayName() specifies the format of + -- the returned name. Normal display will be just the printer name. + if rbShort~checked then do + name = bff~getDisplayName(pidl, 'NORMALDISPLAY') + end + else do + name = bff~getDisplayName(pidl, 'DESKTOPABSOLUTEEDITING') + end + + -- We are done with pidl, release it. + bff~releaseItemIDList(pidl) + + -- We are done with the BrowseForFolder object. Since we told the + -- getItemIDList() method to not release the COM resources, we need to + -- explicitly do it ourself. + bff~releaseCOM + + -- Determine text for the edit control ... + if name == .nil then do + text = 'Unexpected result. ' .DlgUtil~errMsg(.systemErrorCode) + end + else do + text = 'The user picked: ' name + end + + -- ... and set it + edit~setText(text) + + return 0 + + +/** initDialog() + * + * Simple init dialog method. We get references to the edit control and one of + * the two radio buttons. Since the radio buttons are auto and there are only 2 + * of them we only need one reference to be able to tell which is checked. + */ +::method initDialog + expose rbShort edit + + edit = self~newEdit(IDC_EDIT) + rbShort = self~newRadioButton(IDC_RB_SHORT_NAME) + rbShort~check diff --git a/modules/windows/oodialog/examples/fileNameDialog_demo.rex b/modules/windows/oodialog/examples/fileNameDialog_demo.rex new file mode 100755 index 0000000..e54d04a --- /dev/null +++ b/modules/windows/oodialog/examples/fileNameDialog_demo.rex @@ -0,0 +1,225 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2007-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* fileNameDialog_demo.rex */ + +/* +Purpose.: Demonstrate possible ways to use FileNameDialog +Who.....: Lee Peedin with input from + Mark Miesfeld +When....: August 13, 2007 +*/ + +-- Define a path most likely to be common to anyone using this demo - change as necessary + ooRexxHome = value("REXX_HOME", , 'ENVIRONMENT' ) + if ooRexxHome~length == 0 then + path = 'C:\Program Files\ooRexx\' + else + path = ooRexxHome || '\' + +-- Define a couple of variables to use in the code + delimiter = '0'x + +-- Remind the user of what FileNameDialog actually does + msg = 'REMEMBER, FileNameDialog does NOT actually open or save your specified file,'||.endOfLine||- + 'it simply provides a dialog that will return the file path and name!' + call infoDialog msg + +-- Provide a menu of different examples - use the built in SingleSelection dialog + preselect = 1 + do until op = '' + option.1 = '(Open) Select any file in a pre-determined folder' + option.2 = '(Open) Show only *.cls files in a pre-determined folder' + option.3 = '(Open) Allow either a *.cls file or a *.dll file to be selected' + option.4 = '(Open) Allow *.cls, *.dll, or *.* to be selected' + option.5 = '(Open) Allow multiple *.cls files to be selected' + option.6 = '(Save) Create a save dialog where the appended extension is the default (.txt)' + option.7 = '(Save) Create a save dialog where the default extension is changed (.cls)' + + max = 7 + ssdlg = .SingleSelection~new('Select A Demonstration','FileNameDialog Demonstration',option.,preselect,,max) + op = ssdlg~execute + if op \= '' then + do + preselect = op + 1 + if preselect > max then preselect = 1 + call ('OPTION'op) + end + end + + -- We return an unique code to indicate that we did execute and are exiting + -- normally here. 37 is my lucky prime number for August 2007. +return 37 + +Option1: + selfile = path + parent = '' -- don't need this in this example - just a place holder + filemask = 'All Files (*.*)'delimiter'*.*'delimiter + loadorsave = '' -- Load is the default + title = '' -- See documentation for default + defExtension = '' -- don't need this in this example - just a place holder + multiSelect = '' -- don't need this in this example - just a place holder + sepChar = '' -- don't need this in this example - just a place holder + + a_file = FileNameDialog(selfile,parent,filemask,loadorsave,title,defExtension,multiSelect,sepChar) + if a_file = 0 then + call errorDialog 'You Did Not Select A File' + else + call infoDialog 'You Selected' a_file +return +---------------------------------------------------------------------------------------------------------------- +Option2: + selfile = path + parent = '' -- don't need this in this example - just a place holder + filemask = 'Class Files (*.cls)'delimiter'*.cls'delimiter + loadorsave = 'LOAD' -- Load is the default + title = 'FileNameDialog-Option2'-- Define our own title + defExtension = '' -- don't need this in this example - just a place holder + multiSelect = '' -- don't need this in this example - just a place holder + sepChar = '' -- don't need this in this example - just a place holder + + a_file = FileNameDialog(selfile,parent,filemask,loadorsave,title,defExtension,multiSelect,sepChar) + if a_file = 0 then + call errorDialog 'You Did Not Select A File' + else + call infoDialog 'You Selected' a_file +return +---------------------------------------------------------------------------------------------------------------- +Option3: + selfile = path + parent = '' -- don't need this in this example - just a place holder + filemask = 'Class Files (*.cls)'delimiter'*.cls'delimiter||- + 'DLL Files (*.dll)'delimiter'*.dll'delimiter + loadorsave = 'LOAD' -- Load is the default + title = 'FileNameDialog-Option3'-- Define our own title + defExtension = '' -- don't need this in this example - just a place holder + multiSelect = '' -- don't need this in this example - just a place holder + sepChar = '' -- don't need this in this example - just a place holder + a_file = FileNameDialog(selfile,parent,filemask,loadorsave,title,defExtension,multiSelect,sepChar) + if a_file = 0 then + call errorDialog 'You Did Not Select A File' + else + call infoDialog 'You Selected' a_file +return +---------------------------------------------------------------------------------------------------------------- +Option4: + selfile = path + parent = '' -- don't need this in this example - just a place holder + filemask = 'Class Files (*.cls)'delimiter'*.cls'delimiter||- + 'DLL Files (*.dll)'delimiter'*.dll'delimiter||- + 'All Files (*.*)'delimiter'*.*'delimiter + loadorsave = 'LOAD' -- Load is the default + title = 'FileNameDialog-Option4'-- Define our own title + defExtension = '' -- don't need this in this example - just a place holder + multiSelect = '' -- don't need this in this example - just a place holder + sepChar = '' -- don't need this in this example - just a place holder + a_file = FileNameDialog(selfile,parent,filemask,loadorsave,title,defExtension,multiSelect,sepChar) + if a_file = 0 then + call errorDialog 'You Did Not Select A File' + else + call infoDialog 'You Selected' a_file +return +---------------------------------------------------------------------------------------------------------------- +Option5: + selfile = path + parent = '' -- don't need this in this example - just a place holder + filemask = 'Class Files (*.cls)'delimiter'*.cls'delimiter'All Files (*.*)'delimiter'*.*'delimiter + loadorsave = 'LOAD' -- Load is the default + title = 'FileNameDialog-Option5'-- Define our own title + defExtension = '' -- don't need this in this example - just a place holder + multiSelect = 'MULTI' -- Specify the ability to select multiple files + sepChar = '^' -- Define the charact to separate the multiple files + a_file = FileNameDialog(selfile,parent,filemask,loadorsave,title,defExtension,multiSelect,sepChar) + if a_file = 0 then + call errorDialog 'You Did Not Select A File' + else + do + if a_file~pos('^') == 0 then do + msg = 'You Selected one file:'.endOfLine + msg ||= ' ' a_file + end + else do + msg = 'You Selected multiple files.'.endOfLine~copies(2) + + parse var a_file dir'^'a_file + if dir~length < 30 then msg ||= 'The files are in the directory:' dir + else msg ||= 'The files are in the directory:'.endOfLine || ' ' dir + msg ||= .endOfLine~copies(2) + + do until a_file = '' + parse var a_file file_a'^'a_file + msg ||= ' ' file_a||.endOfLine + end + end + call infoDialog msg + end +return +---------------------------------------------------------------------------------------------------------------- +Option6: + selfile = path + parent = '' -- don't need this in this example - just a place holder + filemask = 'All Files (*.*)'delimiter'*.*'delimiter + loadorsave = 'SAVE' -- Load is the default + title = 'FileNameDialog-Option6'-- Define our own title + defExtension = '' -- don't need this in this example - just a place holder + multiSelect = '' -- don't need this in this example - just a place holder + sepChar = '' -- don't need this in this example - just a place holder + a_file = FileNameDialog(selfile,parent,filemask,loadorsave,title,defExtension,multiSelect,sepChar) + if a_file = 0 then + call errorDialog 'You Did Not Provide A Save Name' + else + call infoDialog 'You File Will Be Saved As' a_file +return +---------------------------------------------------------------------------------------------------------------- +Option7: + selfile = path + parent = '' -- don't need this in this example - just a place holder + filemask = 'Class Files (*.cls)'delimiter'*.cls'delimiter'All Files (*.*)'delimiter'*.*'delimiter + loadorsave = 'SAVE' -- Load is the default + title = 'FileNameDialog-Option7'-- Define our own title + defExtension = 'cls' -- Define an extension to append to the user's input + multiSelect = '' -- don't need this in this example - just a place holder + sepChar = '' -- don't need this in this example - just a place holder + a_file = FileNameDialog(selfile,parent,filemask,loadorsave,title,defExtension,multiSelect,sepChar) + if a_file = 0 then + call errorDialog 'You Did Not Provide A Save Name' + else + call infoDialog 'You File Will Be Saved As' a_file +return +---------------------------------------------------------------------------------------------------------------- +::requires "ooDialog.cls" + diff --git a/modules/windows/oodialog/examples/genGUID.rex b/modules/windows/oodialog/examples/genGUID.rex new file mode 100755 index 0000000..e7050d5 --- /dev/null +++ b/modules/windows/oodialog/examples/genGUID.rex @@ -0,0 +1,75 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** genGUID.rex - simple GUID generating program. + * + * Copy and paste the output as needed. + * + * To run in console only mode use: + * + * genGuid 1 + * + * In graphical mode you can use copy and paste of the edit control displayed. + */ + + -- Ensure we can be run from any directory. + srcDir = locate() + + .application~setDefaults('O', srcDir'resources\genGUID.h', .false) + + guid = .DlgUtil~getGUID + say guid + + if arg() == 0 then do + dlg = .DisplayDlg~new(srcDir'resources\genGUID.rc', IDD_GUID_GENERATOR) + if dlg~initCode = 0 then do + dlg~guid = guid + dlg~execute("SHOWTOP") + end + end + +return 0 + +::requires 'ooDialog.cls' + +::class 'DisplayDlg' subclass RcDialog + +::attribute guid + +::method initDialog + expose guid + self~newEdit(IDC_EDIT_GUID)~setText(guid) diff --git a/modules/windows/oodialog/examples/imageButton.rex b/modules/windows/oodialog/examples/imageButton.rex new file mode 100755 index 0000000..918d7f7 --- /dev/null +++ b/modules/windows/oodialog/examples/imageButton.rex @@ -0,0 +1,513 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * File: imageButton.rex + * + * Category: ooDialog example + * + * Syntax: + * rc = imageButton + * + * Purpose: + * Provides some example code of new ooDialog feature introduced in 4.0.0 + * + * This program uses a resource script (.rc) file for the dialog definition. + * The dialog was designed using a "what you see is what you get" dialog + * editor. The resource script can be compiled into a binary image for use + * with a ResDialog. In this case it is just left as a .rc file for use in + * a RcDialog. + * + * Dialogs built using a dialog editor are much easier to create and maintain + * then UserDialogs. + * + * Input: + * None. + * + * Returns: + * 0 on success, non-zero if the dialog could not be created for some reason. + * + * Notes: + * This is a short program written to amuse my niece. Two of the button + * controls in the dialog use an image list. The text for the buttons is 'Add + * Pictures' and 'View Pictures' with a picture of a camera on them. When the + * user moves the mouse pointer over either one of the buttons, the picture + * changes to a skull and the text changes to 'Death if you touch me.' When + * the user pushes either of the buttons the picture changes to a giant bee. + * + * My niece and I think this is hilarious. + * + * The dialog shows how to use a button control image list. Since I am not + * artistic, I produced the images by cutting them out of digital pictures + * I have taken over the last few years. + * + * A professional application would of course use professional graphics. This + * dialog just gives an idea of what the button control can do with an image + * list. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +use arg + + -- Ensure we can be run from any directory. + srcDir = locate() + + rcFile = srcDir"resources\imageButton.rc" + symbolFile = srcDir"resources\imageButton.h" + + .application~setDefaults("O", symbolFile, .false) + + dlg = .ImageListDlg~new(rcFile, IDD_IMAGELIST_BUTTON) + + if dlg~initCode <> 0 then do + say "The Image List Dialog was not created correctly" + say "Init code:" dlg~initCode + return 99 + end + + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +return 0 +-- End of entry point. + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" + +::class 'ImageListDlg' subclass RcDialog + +::method initDialog + expose pbPush pbView pbAdd stStatus ctr imagesLoaded + + self~connectButtonEvent(IDC_PB_PUSHME, "CLICKED", "onPushMe") + self~connectButtonEvent(IDC_PB_VIEW, "CLICKED", "onView") + self~connectButtonEvent(IDC_PB_ADD, "CLICKED", "onAdd") + + self~connectButtonEvent(IDC_PB_VIEW, "HOTITEM", onHover) + self~connectButtonEvent(IDC_PB_ADD, "HOTITEM", onHover) + + imagesLoaded = .false + ctr = 0 + + pbPush = self~newPushButton(IDC_PB_PUSHME) + pbView = self~newPushButton(IDC_PB_VIEW) + pbAdd = self~newPushButton(IDC_PB_ADD) + stStatus = self~newStatic(IDC_ST_STATUS) + + stStatus~setText("") + + self~setPictureButtons + +::method setPictureButtons private + expose pbView pbAdd stStatus imagesLoaded imageList + + -- Using an image list with the button controls needs at least comctl32 + -- version 6. See what version we are running under and don't use the image + -- list if we are on an older version of Windows. + if .DlgUtil~comCtl32Version < 6 then return self~oldSetButtons + + pbView~style = "MULTILINE BOTTOM" + + -- In the following code, there are a lot of if tests. You can change any of + -- the if tests to its converse to get an idea of the dialog behavior when + -- errors happen. Have fun, experiment. + + srcDir = .application~srcDir + + -- The images are loaded from files. + files = .array~new() + files[1] = srcDir"resources\Normal.bmp" -- Normal + files[2] = srcDir"resources\Hot.bmp" -- Hot (hover) + files[3] = srcDir"resources\Pushed.bmp" -- Pushed + files[4] = srcDir"resources\Disabled.bmp" -- Disabled + files[5] = srcDir"resources\Default.bmp" -- Default button + files[6] = srcDir"resources\Hot.bmp" -- Stylus hot, tablet PC only + + -- .ImageList~create() exposes the Windows API ImageList_Create(). Use the + -- MSDN documentation to fully understand this API. Simply do a Google search + -- with: MSDN ImageList_Create + -- + -- The IIC_COLOR24 flag and the size values correspond to the values the + -- bitmaps were created with. You can look at the properties page for one + -- of the bitamp files in Explorer to see these values. + + -- We set the flags to create a 24 bit color, masked image list. + flags = 'COLOR24 MASK' + + -- Create an empty .ImageList object: + imageList = .ImageList~create(.Size~new(61, 46), flags, 10, 10); + + -- Add the images to the image list, only if the image list is not null. If + -- the .ImageList object is null, an error happened when it was created and it + -- is not usable. + -- + -- When an image is added to the image list, the index of the image is + -- returned. -1 signals that the image was not added. We use that as a flag + -- to indicate some images are not added. + index = -1 + lastGoodIndex = -1 + if \ imageList~isNull then do + stStatus~setText('Created image list:' imageList~handle) + + -- We use a colorref when adding the image to the image list. The 255,255, + -- 255 value is white. Essentially it tells the image list to create a mask + -- that causes every white pixel in the image to be transparent. + -- + -- The only image it has any effect on is the camera. In the camera image, + -- the background uses white pixels. So, when the camera image is drawn, + -- the background becomes transparent, which allows the button color to show + -- through. + cRef = .Image~colorRef(255, 255, 255) + + -- For each image file, get an .Image object and add it to our image list. + do f over files + + -- The defaults for the optional arguments to getImage() are good for this + -- application. Again, isNull() signals the .Image object is not valid. + image = .Image~getImage(f) + if \ image~isNull then do + + -- Add the image, quit if we get back a -1. + index = imageList~addMasked(image, cRef) + if index == -1 then leave + + stStatus~setText('Added image index:' index) + lastGoodIndex = index + + -- The underlying ImageList control makes a copy of the image passed to + -- it. We can now relase the image to free up the system resource. + -- Note that when this program ends, the OS will free the resource + -- automatically, so this is NOT necessary. Note also that you should + -- not release SHARED images. However, when an image is loaded from a + -- file, it can not be a shared image. + image~release + + -- Once you release the image, the .Image object is no longer valid and + -- trying to use it will raise a syntax error. You can use the isNull() + -- method on any image object at any time to test if it is valid without + -- raising a syntax error. In addition, if you invoke the release() + -- method after the image has already been released, it is just ignored. + end + else do + say 'Failed to load bitmap:' f 'system error code:' .SystemErrorCode + end + end + end + else do + stStatus~setText('Error creating .ImageList. Images are not available.') + return + end + + if lastGoodIndex == -1 then do + stStatus~setText("Failed to add any images. Images are not available") + imageList~release + return + end + + imagesLoaded = .true + + if index == -1 then do + stStatus~setText("Not all images were loaded. Last good image at index" lastGoodIndex) + end + + -- Set up the alignment and margin around the image on the 'View Pictures' + -- button. Then set the image list in the button control + align = 'LEFT' + margin = .Rect~new(1) + + pbView~setImageList(imageList, margin, align) + + if .SystemErrorCode <> 0 then do + stStatus~setText('setImageList() failed. SystemErrorCode:' .SystemErrorCode 'Images not available.') + imageList~release + return + end + else do + stStatus~setText("View Pictures button image list loaded.") + end + + -- Temporarily set the title to the longest text, to calculate ideal size. + pbView~setTitle("DEATH if you touch me") + bestSize = pbView~getIdealSize + + -- Write this to the screen, example only. + say 'Got ideal size:' bestSize + say ' width: ' bestSize~width + say ' height:' bestSize~height + say + + -- Now reset the button label and set the size to the ideal size. + pbView~setTitle("View Pictures") + pbView~setRect(0, 0, bestSize~width, bestSize~height, "NOMOVE") + + -- Example only of the getImageList() method. A .Directory object is + -- returned. + d = pbView~getImageList + + -- Just write this to the screen. + say 'Got View Picutes button control image list information.' + say 'Returned:' d + if d <> .nil then do + say ' image list:' d~imageList + say ' handle: ' d~imageList~handle + say ' rect: ' d~rect + say ' align: ' d~alignmentKeyword + say 'Image margins:' d~rect~left',' d~rect~top',' d~rect~right',' d~rect~bottom + end + else do + stStatus~setText("Error getting View Pictures button control image list information.") + end + say + + -- For the Add Pictures button, use the same image list created for the View + -- Pictures button. We just change the margins and the alignment. + align = 'CENTER' + margin~left = 10 + margin~right = 10 + margin~top = 30 + margin~bottom = 15 + + pbAdd~setImageList(imageList, margin, align) + + if .SystemErrorCode <> 0 then do + stStatus~setText('setImageList() failed. SystemErrorCode:' .SystemErrorCode 'Images not available.') + + -- Releasing the image list now, after it has been successfully set for the + -- View Pictures button, causes the images to disappear from that button. + -- + -- In general, DON'T release an image list that is in use. This is just + -- done here to demonstrate that things won't blow up. + imageList~release + return + end + else do + stStatus~setText("Add Pictures button image list loaded.") + end + + -- Now, the same as above, figure out the ideal size and then adjust the + -- button size. + pbAdd~style = "BOTTOM MULTILINE" + pbAdd~setTitle("DEATH if you touch me") + s = pbAdd~getIdealSize + pbAdd~setTitle("Add Pictures") + pbAdd~setRect(0, 0, s~width, s~height, "NOMOVE") + + -- Again, just for an example of the getImageList() method. + d = pbAdd~getImageList + + say 'Got Add Picutes button control image list information.' + say 'Returned:' d + if d <> .nil then do + -- Write this to the screen. Note that the image list hand is the same as + -- the above. + say ' image list:' d~imageList + say ' handle: ' d~imageList~handle + say ' rect: ' d~rect + say ' align: ' d~alignmentKeyword + say 'Image margins:' d~rect~left',' d~rect~top',' d~rect~right',' d~rect~bottom + end + else do + stStatus~setText("Error getting Add Pictures button control image list information.") + end + say + +return + +-- This method allows the dialog to work on systems prior to XP. We just use +-- the old fashioned buttons. +::method oldSetButtons private + expose pbView pbAdd + + pbView~setTitle("View Pictures") + pbAdd~setTitle("Add Pictures") + + pbView~resize(50, 15) + pbAdd~resize(50, 15) + +return .true + +-- As the user pushes the Push Me button, we cycle through some different +-- examples of changing the button state and style. This changes the pictures +-- displayed on the buttons. (Provided of course that there were no errors in +-- setting the button control image list(s).) The state and style changes work +-- whether we have images or not, so we don't check for pictures loaded or not +-- on those. +::method onPushMe unguarded + expose pbView pbAdd stStatus ctr imagesLoaded oldImageList + + select + when ctr == 0 then do + pbView~state = "FOCUS" + stStatus~setText('View Pictures button set to the Focused state.') + ctr += 1 + end + when ctr == 1 then do + pbAdd~style = "DEFPUSHBUTTON" + stStatus~setText('Add Pictures button now the default push button.') + ctr += 1 + end + when ctr == 2 then do + pbView~style = "DEFPUSHBUTTON" + stStatus~setText('View Pictures button now the default push button.') + ctr += 1 + end + when ctr == 3 then do + pbView~disable + stStatus~setText('View Pictures button now disabled.') + ctr += 1 + end + when ctr == 4 then do + pbView~enable + cancel = self~newPushButton(IDCANCEL) + cancel~style = "DEFPUSHBUTTON" + stStatus~setText('View Pictures button now enabled, should not be default push button.') + ctr = 5 + end + when ctr == 5 then do + if imagesLoaded then do + oldImageList = pbView~setImageList(.nil) + stStatus~setText('Removed View Pictures button images. Push "Push Me one more time to restore".') + end + ctr = 6 + end + when ctr == 6 then do + if imagesLoaded, oldImageList \== .nil then do + pbView~setImageList(oldImageList~imageList, oldImageList~rect, oldImageList~alignment) + stStatus~setText('Restored View Pictures button images.') + end + ctr = 0 + end + otherwise do + -- Should be impossible to happen. Just do the same as if ctr were 6. + if imagesLoaded, oldImageList \== .nil then do + pbView~setImageList(oldImageList~imageList, oldImageList~rect, oldImageList~alignment) + stStatus~setText('Restored View Pictures button images.') + end + ctr = 0 + end + end + -- End select + +-- This is the amusing part. We get this event message when the mouse is first +-- moved over a button (entering will be .true) or when the mouse moves off a +-- button (entering will be .false.) We change the text and style of the +-- button, the button control itself changes the picture. +::method onHover unguarded + expose imagesLoaded pbView pbAdd + use arg id, entering + + if \ imagesLoaded then return + + isViewButton = (id == .constDir[IDC_PB_VIEW]) + + if entering then do + text = "DEATH if you touch me" + style = "TOP" + end + else do + if isViewButton then text = "View Pictures" + else text = "Add Pictures" + style = "BOTTOM" + end + + if isViewButton then do + pbView~style = style + pbView~setTitle(text) + end + else do + pbAdd~style = style + pbAdd~setTitle(text) + end + +::method onView unguarded + expose stStatus + stStatus~setText('In onView, no actions defined.') + +::method onAdd unguarded + expose stStatus + stStatus~setText('In onAdd, no actions defined.') + + +/* When you are done using an image list you can release it to free up system + * resources. + * + * Please note that when this program ends, the process will disappear and the + * OS will free up the resources automatically. + * + * As noted in a comment above, if you release the image list when it is in + * use, the pictures disappear. Testing has shown that releasing an image list + * when it is in use, does not crash the system. However, releasing an image + * list while it is in use would seem to be a foolish practice. + * + * When would you want to release an image list? In this case if this dialog + * was a part of a bigger, long running application. When this dialog ends, it + * makes sense to free up the system resources used for the image list. Since + * the main application is still running, the OS will not release the resources + * used in this dialog. + * + * Microsoft says, you should release an image list when you are done with it. + * + * In this case that would be when the dialog is closed. There are at least 2 + * strategies that could be employed. + * + * 1.) Save a reference to the image list handle returned by .ImageList~create() + * and pass it to release(). + * + * 2.) Use getImageList() to ask the button to give you the image list + * information and use the image list object that is returned as part of the + * .Directory object. The image list object in strategy 1 and 2 are the same + * object. + * + * Don't forget to release the handle if either the dialog is canceled or if it + * is closed. Below is a demonstration of both strategies. + */ + +::method cancel + expose imageList imagesLoaded + + if imagesLoaded then imageList~release + return self~cancel:super + +::method ok + expose imagesLoaded pbView + + if imagesLoaded then do + imageListInfo = pbView~getImageList + if imageListInfo <> .nil then imageListInfo~imageList~release + end + + return self~ok:super + diff --git a/modules/windows/oodialog/examples/openSaveFileDemo.rex b/modules/windows/oodialog/examples/openSaveFileDemo.rex new file mode 100755 index 0000000..2672623 --- /dev/null +++ b/modules/windows/oodialog/examples/openSaveFileDemo.rex @@ -0,0 +1,538 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** openSaveFileDemo.rex + * + * This application shows several examples of using the Common Item Dialog. + * + * The Common Item Dialog (formerly known as the Common File Dialog) is used in + * two variations: the Open dialog and the Save dialog. These two dialogs share + * most of their functionality, but each have some unique methods. + * + * The common item dialog implementation found in Windows Vista and later + * provides several advantages over the implementation provided in earlier + * versions of Windows. + * + * ooDialog provides complete support for all features of the Common Item + * Dialog. + * + * This example will only run on Vista or later. + * + * Both the .OpenFileDialog and the .SaveFileDialog are subclasses of the + * .CommonItemDialog class. The Rexx programmer can not instantiate a + * .CommonItemDialog object. Instead the programmer picks the type of file + * dialog he wants, a save file or an open file dialog and instantitates that + * class. Almost all of the methods for these classes come from the + * CommonItemDialog class and are documented in the reference manual under the + * CommonItemDialog section. + * + * Some of the features of the Common Item Dialog are a little advanced. How- + * ever, the basic every day usage is simple. This example puts up an opening + * dialog that allows the user to choose from a number of different usage + * patterns and then shows the Common Item Dialog picked. + * + * One of the features of the Common Item Dialog is that it allows its state to + * be saved on a per instance basis in addition to the per process basis. + * This is done by generating a GUID and assigning it to the dialog before it + * is configured. Then, for each dialog with the same GUID, the operating + * system saves its state separately. + * + * To make use of this feature, the programmer would generate a single GUID and + * then assign the same GUID each time the file dialog was shown in the + * application. + * + * This example makes use of that feature by assigning a different GUID for + * each of the XX dialogs that can be displayed from the opening dialog. + * + * This simple program can be used to generate a GUID. Run the program and + * then copy and paste the output on the command line in to your program. + * + * - - - - - - - - - Cut begin - - - - - - - - - - - - - - - - - - - - - - - - + * /* genGUID.rex */ + * + * guid = .DlgUtil~getGUID + * say guid + * return 0 + * + * ::requires 'ooDialog.cls' + * - - - - - - - - - Cut end - - - - - - - - - - - - - - - - - - - - - - - - - + * + */ + if \ .application~requiredOS('Vista', 'openSaveFileDemo.rex') then return 99 + + srcDir = locate() + + -- Set up the symbolic IDs and then put up our example dialog. + .application~setDefaults('O', srcDir'resources\osfDialogs.h', .false) + + dlg = .CommonSaveDialog~new(srcDir'resources\osfDialogs.rc', IDD_SIMPLE_OSF_DIALOGS) + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + + return 0 + +::requires "ooDialog.cls" + +::class 'CommonSaveDialog' subclass RcDialog + +-- Do not copy these GUIDs into your own code. Always generate your own GUID. +::constant GUID_OPEN '021b0a3d-cb16-4def-ab42-7fc259fd84d9' +::constant GUID_SAVE 'beff4495-fa60-468b-90c3-1dcb6fde0e78' +::constant GUID_OPEN_MULTI 'b6c25d80-198e-4baa-aad8-1249e4f15b3f' +::constant GUID_OPEN_CUSTOM '745c45cb-3464-46fc-96cf-8628ad4bf63b' +::constant GUID_SAVE_DEFAULT 'fe2c5305-d7f9-43cd-9d7b-9c3d4d1b79be' +::constant GUID_OPEN_FOLDER 'ce5ad183-b42f-4f37-a5d6-78d1cffea2e6' + + +/** initDialog() + * + * Simple standard init dialog method. We save references to our commonly used + * controls, and connect the button click event for the push button. + * + * We also use this method to find the installed directory of ooRexx. + */ +::method initDialog + expose rbOpen rbSave rbOpenMulti rbOpenCustom rbSaveDefault rbOpenFolder edit rexx_home + + rbOpen = self~newRadioButton(IDC_RB_OPEN)~~check + rbSave = self~newRadioButton(IDC_RB_SAVE) + rbOpenMulti = self~newRadioButton(IDC_RB_OPEN_MULTI) + rbOpenCustom = self~newRadioButton(IDC_RB_OPEN_CUSTOM) + rbSaveDefault = self~newRadioButton(IDC_RB_SAVE_DEFAULT) + rbOpenFolder = self~newRadioButton(IDC_RB_OPEN_FOLDER) + + edit = self~newEdit(IDC_EDIT_OSF) + + self~connectButtonEvent(IDC_PB_SHOW_OSF, 'CLICKED', onShowOSFDialog) + + rexx_home = value('REXX_HOME', , 'ENVIRONMENT') + if rexx_home == '' then rexx_home = 'C:\Program Files' + + self~addToolTips + + +/** onShowOSFDialog() + * + * When the user clicks on the 'Show' push button, we put up the example Common + * Item Dialog specified by the user through the radio buttons. + * + * Each Common Item Dialog is displayed using a separate, private, method. To + * look at the example code for some type of dialog, for instance the simple + * open file dialog, examine the associated method. + */ +::method onShowOSFDialog unguarded + expose rbOpen rbSave rbOpenMulti rbOpenCustom rbOpenFolder rbSaveDefault + + select + when rbOpen~checked then return self~openExample + when rbSave~checked then return self~saveExample + when rbOpenMulti~checked then return self~openMultifilesExample + when rbOpenCustom~checked then return self~openCustomExample + when rbSaveDefault~checked then return self~saveDefaultExample + when rbOpenFolder~checked then return self~openFolderExample + otherwise return 0 -- Can not really happen + end + -- End select + + +/** openExample() + * + * Displays the most simple Open File Dialog example. We just show the dialog + * and get the result. We do not use any customization or advanced features, + * other than slightly changing the options. + */ +::method openExample unguarded private + + -- Setting the client GUID has the operating system preserve the state for + -- this specific open file dialog. + ofd = .OpenFileDialog~new + ret = ofd~setClientGuid(self~GUID_OPEN) + + -- The default flags for the Open File Dialog contain the file must exsit + -- flag. This prevents the user from typing in their own file name; the + -- user can only open an exsiting file. + -- + -- For certain applications, this behaviour may be desired. But for this + -- example, we want the user to be able to type in any file name, so we + -- remove that flag. We get the exsiting flags and set the flags to the + -- existing flags minus the FILEMUSTEXIST keyword. + ofd~options = ofd~options~delWord(ofd~options~wordPos('FILEMUSTEXIST'), 1) + + -- Very simple, we are all set, show the dialog and get the user's response: + ret = ofd~show(self) + + if ret == ofd~canceled then text = 'The user canceled the open' + else text = 'Open file:' ofd~getResult + + -- The proper use of both the .SaveFileDialog and the .OpenFileDialog is to + -- instantiate the object, configure it, show it, and then release it. The + -- release() method is essential to ensuring the COM resources are properly + -- cleaned up. + -- + -- If release() is not called, the ooDialog framework will *attempt* to do + -- the clean up in an uninit() method. However, 1.) there is *no* guarentee + -- that the interpreter will invoke the uninit() method. 2.) There is *no* + -- guarentee the uninit() will be run on this thread. The COM resources can + -- *not* be cleaned up if uninit() is run on another thread than this one. + -- + -- The only way to guarentee that the COM resources are cleaned up properly + -- is for the programmer to invoke the release() method. + ofd~release + + -- Have the edit box display the result. + self~showResult(text) + + return 0 + + +/** saveExample() + * + * Displays the most simple Save File Dialog example. We just show the dialog + * and get the result. We do not use any customization or advanced features. + */ +::method saveExample unguarded private + + -- Setting the client GUID has the operating system preserve the state for + -- this specific save file dialog. + sfd = .SaveFileDialog~new + ret = sfd~setClientGuid(self~GUID_SAVE) + + -- We are all set, show the dialog and get the user's response: + ret = sfd~show(self) + + if ret == sfd~canceled then text = 'The user canceled the save' + else text = 'Save to file:' sfd~getResult + + -- The proper use of both the .SaveFileDialog and the .OpenFileDialog is to + -- instantiate the object, configure it, show it, and then release it. The + -- release() method is essential to ensuring the COM resources are properly + -- cleaned up. + -- + -- If release() is not called, the ooDialog framework will *attempt* to do + -- the clean up in an uninit() method. However, 1.) there is *no* guarentee + -- that the interpreter will invoke the uninit() method. 2.) There is *no* + -- guarentee the uninit() will be run on this thread. The COM resources can + -- *not* be cleaned up if uninit() is run on another thread than this one. + -- + -- The only way to guarentee that the COM resources are cleaned up properly + -- is for the programmer to invoke the release() method. + sfd~release + + -- Have the edit box display the result. + return self~showResult(text) + + return 0 + + +/** openMultiFilesExample() + * + * Displays a basic open file dialog that allows the user to pick multiple file + * names at one time. + */ + +::method openMultiFilesExample unguarded private + expose rexx_home + + ofd = .OpenFileDialog~new + ret = ofd~setClientGuid(self~GUID_OPEN_MULTI) + + -- To allow the user to select multiple files, we need to add this keywod + -- to the options: + ofd~options = ofd~options 'ALLOWMULTISELECT' + + -- Show the dialog and get the response + ret = ofd~show(self) + + -- If msg ends up not being .nil, we show a message box ... + msg = .nil + + if ret == ofd~canceled then do + text = 'The user canceled the open operation.' + end + else do + files = ofd~getResults + if files~items == 1 then do + text = 'Open file:' files[1] + end + else do + text = 'Open files (file names only):' + msg = 'Open files (complete file names as returned):' || .endOfLine~copies(2) + + do f over files + text ||= ' ' || fileSpec('N', f) + msg ||= f || .endOfLine + end + end + end + ofd~release + + -- Have the edit box display the result. + self~showResult(text) + + if msg \== .nil then do + title = 'Complete Open File Names' + j = MessageDialog(msg, self~hwnd, title, 'OK', 'INFORMATION') + end + + return 0 + + +/** openCustomExample() + * + * Displays an Open File Dialog that has some easy to use customizations. + */ +::method openCustomExample unguarded private + + ofd = .OpenFileDialog~new + ret = ofd~setClientGuid(self~GUID_OPEN_CUSTOM) + + ofd~options = ofd~options~delWord(ofd~options~wordPos('FILEMUSTEXIST'), 1) + + -- With the Common Item Dialog you can easily change the title for the + -- dialog, the label for the edit box, and the label for the ok button: + ofd~setTitle("The ooRexx Project's Open File Dialog") + ofd~setFileNameLabel('Type in, or select an existing, file to open here:') + ofd~setOkButtonLabel('Finished') + + -- There are also a large number of options that can be set or changed. + -- Here, we show just a few that effect the appearance of the dialog: + opts = 'FORCEPREVIEWPANEON HIDEMRUPLACES HIDEPINNEDPLACES' + ofd~options = ofd~options opts + + -- Okay, we are all set, show the dialog and get the user's response: + ret = ofd~show(self) + + if ret == ofd~canceled then text = 'The user canceled the open' + else text = 'Open file:' ofd~getResult + + ofd~release + + -- Have the edit box display the result. + return self~showResult(text) + + +/** saveDefaultExample() + * + * Displays a save file dialog that uses file type filters and sets the initial + * file name and directory location. + */ +::method saveDefaultExample unguarded private + expose rexx_home + + sfd = .SaveFileDialog~new + ret = sfd~setClientGuid(self~GUID_SAVE_DEFAULT) + + -- Add a file types filter. To do this you use an array containing the + -- filter values. Each single filter consists of 2 parts, the description + -- and the extension, so the array must contain an even number of items. + filter = .array~of('Rexx Program File', '*.rex', 'Rexx Class File', '*.cls', 'Text File', '*.txt') + sfd~setFileTypes(filter) + + -- Set the initial filter selected. This is done by using the index for + -- the filter in the array. Each filter consists of a pair, so in the above + -- we have 3 filters. The second filter is the 'Rexx Class File' filter + sfd~setFileTypeIndex(2) + + -- Set the default extension. Note that you do not include the period. The + -- default extension governs whether or not an extension is added if the + -- user leaves off the extension. If you do not set a deault extension, no + -- extension is added when the user does not type an extension, even if a + -- file type filter is in effect. When a default extension is set, if the + -- user picks a new filter, the extension is updated automatically by the + -- operating system. + sfd~setDefaultExtension('cls') + + -- Set the initial save as file name. You must provide a complete path + -- name or an error is generated. Likewise the file must exist. The + -- complete path name also serves to specifiy the directory that the save + -- file dialog is initially opened in. + ret = sfd~setSaveAsItem(rexx_home'\ooDialog.cls') + + -- The default options for the Save File Dialog contain the OVERWRITEPROMPT + -- keyword. This option causes the operating system to prompt the user if + -- they select a save file name that is the name of an existing file. If + -- that behaviour is not desired it can be changed by removing the keyword + -- as in this code. Uncomment to see the effect: + + /* sfd~options = sfd~options~delWord(sfd~options~wordPos('OVERWRITEPROMPT'), 1) */ + + -- Show the dialog and get the response + ret = sfd~show(self) + + if ret == sfd~canceled then text = 'The user canceled the save operation.' + else text = 'Save file:' sfd~getResult + + sfd~release + + -- Have the edit box display the result. + return self~showResult(text) + + +/** openFolderExample() + * + * Displays a basic open file dialog. The main point here is to demonstrate + * how to control which directory is initially selected when the dialog opens. + */ + +::method openFolderExample unguarded private + expose rexx_home + + ofd = .OpenFileDialog~new + ret = ofd~setClientGuid(self~GUID_OPEN_FOLDER) + + -- Normally the operating system will pick the initial directory that is + -- selected when the open file dialog is first shown. Usually this is the + -- last directory the user had selected. The setFolder() method over-rides + -- this behaviour and forces the dialog to open with the specified directory + -- selected. + ofd~setFolder(rexx_home) + + -- In this example we do not change the default options. One of the + -- defaults is that the file must exist. This is useful in the case where + -- we want to ensure the user picks an exsisting file. We do not need to + -- check for file existence. The operating system forces the user to pick + -- an exsiting file or cancel. + + -- Show the dialog and get the response + ret = ofd~show(self) + + if ret == ofd~canceled then text = 'The user canceled the open operation.' + else text = 'Open file:' ofd~getResult + + ofd~release + + -- Have the edit box display the result. + return self~showResult(text) + + +/** showResult() + * + * A convenience method that updates the edit box with the results for each + * open / save file dialog. + */ +::method showResult unguarded private + expose edit + use strict arg text + + edit~setText(text) + return 0 + + +/** addToolTips() + * + * A convenience method to add a tool tip for each radio button. The tool tips + * let us shwo some text explaining the tip of Open / Save File dialog that will + * be displayed when the specific radio button is selected. + * + * Notes: A tool tip will display the text on multiple lines, and will break + * the text at embedded new line characters. But - it will only do this + * if setMaxTipWidth() is invoked. However, if the width is set to less + * than the width up to the new line, the tool tip will break the text + * at a word break. So, what we do is set the max width to very large, + * the width of an entire text, and then the tool tip breaks the text at + * every new line. + * + * The text is pretty long, so to ensure the user has enough time to + * read it all, we set the delay before the tool tip disappears to twice + * the default delay time. + */ +::method addToolTips private + expose rbOpen rbSave rbOpenMulti rbOpenCustom rbSaveDefault rbOpenFolder edit + + text = "Select this Radio Button to show " || .endOfLine || - + "a simple Open File Dialog that" || .endOfLine || - + "allows the user to type in a" || .endOfLine || - + "file name." + s = self~getTextSizePX(text) + + ttOpen = self~createToolTip('IDC_TT_OPEN') + ttOpen~addTool(rbOpen, text) + ttOpen~setMaxTipWidth(s~width) + + delayTime = ttOpen~getDelayTime('AUTOPOP') * 2 + + ttOpen~setDelayTime('AUTOPOP', delayTime) + + text = "Select this Radio Button to show " || .endOfLine || - + "a simple Save File Dialog that" || .endOfLine || - + "allows the user to type in a" || .endOfLine || - + "file name." + + ttSave = self~createToolTip('IDC_TT_SAVE') + ttSave~addTool(rbSave, text) + ttSave~setMaxTipWidth(s~width) + ttSave~setDelayTime('AUTOPOP', delayTime) + + text = "Select this Radio Button to show" || .endOfLine || - + "an Open File Dialog that allows" || .endOfLine || - + "the user to select multiple files" || .endOfLine || - + "at one time." + + ttMulti = self~createToolTip('IDC_TT_OPEN_MULTI') + ttMulti~addTool(rbOpenMulti, text) + ttMulti~setMaxTipWidth(s~width) + ttMulti~setDelayTime('AUTOPOP', delayTime) + + text = "Select this Radio Button to show" || .endOfLine || - + "an Open File Dialog that has some" || .endOfLine || - + "simple customizations of the apparence" || .endOfLine || - + "of the dialog." + + ttCustom = self~createToolTip('IDC_TT_OPEN_CUSTOM') + ttCustom~addTool(rbOpenCustom, text) + ttCustom~setMaxTipWidth(s~width) + ttCustom~setDelayTime('AUTOPOP', delayTime) + + text = "Select this Radio Button to show" || .endOfLine || - + "a Save File Dialog that sets a" || .endOfLine || - + "default save as file name and a" || .endOfLine || - + "file type filter." + + ttDefault = self~createToolTip('IDC_TT_SAVE_DEFAULT') + ttDefault~addTool(rbSaveDefault, text) + ttDefault~setMaxTipWidth(s~width) + ttDefault~setDelayTime('AUTOPOP', delayTime) + + text = "Select this Radio Button to show" || .endOfLine || - + "an Open File Dialog that sets" || .endOfLine || - + "the initial direcotry that the" || .endOfLine || - + "dialog opens in." + + ttFolder = self~createToolTip('IDC_TT_OPEN_FOLDER') + ttFolder~addTool(rbOpenFolder, text) + ttFolder~setMaxTipWidth(s~width) + ttFolder~setDelayTime('AUTOPOP', delayTime) + diff --git a/modules/windows/oodialog/examples/publicRoutines_demo.rex b/modules/windows/oodialog/examples/publicRoutines_demo.rex new file mode 100755 index 0000000..3d01317 --- /dev/null +++ b/modules/windows/oodialog/examples/publicRoutines_demo.rex @@ -0,0 +1,377 @@ +/* publicRoutines_demo.rex */ + +/* +Purpose.: Demonstrate each of the ooDialog Public Routines +Who.....: Lee Peedin +When....: August 14, 2007 +*/ + +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2007-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* +This demo incorporates the following "features of ooRexx 3.2 +24 September 2007 + .endOfLine is used instead of '0d0a'x + ScreenSize + MSSleep + Variations of TimedMessage + time('t') +*/ + +-- Define a path most likely to be common to anyone using this demo - change as necessary + ooRexxHome = value("REXX_HOME", , 'ENVIRONMENT' ) + if ooRexxHome~length == 0 then + path = 'C:\Program Files\ooRexx\' + else + path = ooRexxHome || '\' + +-- Define a couple of variables to use in the code, including a global used for +-- a helper dialog. + delimiter = '0'x + .local~helperDlgTitle = "The publicRoutines_Demo Helper Dialog" + +-- Provide a menu of different examples - use the built in SingleSelection dialog + preselect = 1 + do until op = '' + option.1 = 'Play an audio file 1 time - (synchronously)' + option.2 = 'Play an audio file 1 time - (asynchronously)' + option.3 = 'Play an audio file multiple times - (loop)' + option.4 = 'Stop playing the audio file' + option.5 = 'Show an InfoDialog' + option.6 = 'Show an ErrorDialog' + option.7 = 'Show a multi-line InfoDialog' + option.8 = 'Show an AskDialog - Yes button as the default' + option.9 = 'Show an AskDialog - No button as the default' + option.10 = 'Show a FileNameDialog' + option.11 = 'Retrieve the handle to a window' + option.12 = 'Use the .DlgUtil Class To Return Screen Resolution' + option.13 = 'A Standard Timed Message (5 Seconds)' + option.14 = 'An unTimed Message' + option.15 = 'Stop The unTimed Message' + option.16 = 'An Early Reply Timed Message' + option.17 = 'Use the .DlgUtil Class To Query System Metrics' + + max = 17 + ssdlg = .SingleSelection~new('Select A Demonstration','Public Routines Demonstration',option.,preselect,,max%2+1) + op = ssdlg~execute + if op \= '' then + do + preselect = op + 1 + if preselect > max then preselect = 1 + call ('OPTION'op) ssdlg + end + end +exit + +Option1: + fileName = path||'samples\oodialog\wav\gotcha.wav' + wstream = .stream~new(filename) + if wstream~query('exists') = '' then + call errorDialog'The expected audio file' filename 'does not exist' + else + do + msg = "When you close this message box, a *.wav file will"||.endOfLine||- + "play synchronously. You will return to the demo progam"||.endOfLine||- + "when the *.wav file is ended." + call InfoDialog msg + + call Play fileName + end +return +---------------------------------------------------------------------------------------------------------------- +Option2: + fileName = path||'samples\oodialog\wav\gotcha.wav' + wstream = .stream~new(filename) + if wstream~query('exists') = '' then + call errorDialog 'The expected audio file' filename 'does not exist' + else + do + msg = "When you close this message box, a *.wav file will"||.endOfLine||- + "play asynchronously. You will return to the demo progam"||.endOfLine||- + "immediately, while the *.wav file continues to play." + call InfoDialog msg + + call Play fileName,'YES' + end +return +---------------------------------------------------------------------------------------------------------------- +Option3: + fileName = path||'samples\oodialog\wav\gotcha.wav' + wstream = .stream~new(filename) + if wstream~query('exists') = '' then + call errorDialog 'The expected audio file' filename 'does not exist' + else + do + msg = "When you close this message box, a *.wav file will"||.endOfLine||- + "play asynchronously in a continuous loop. You will"||.endOfLine||- + "return to the demo progam immediately. The *.wav"||.endOfLine||- + "file will continue to play until you stop it using"||.endOfLine||- + "the 'Stop playing the audio file' option." + call InfoDialog msg + + call Play fileName,'LOOP' + end +return +---------------------------------------------------------------------------------------------------------------- +Option4: + call Play fileName +return +---------------------------------------------------------------------------------------------------------------- +---------------------------------------------------------------------------------------------------------------- +Option5: + call InfoDialog 'This is an InfoDialog - note the icon used & the tone played' +return +---------------------------------------------------------------------------------------------------------------- +Option6: + call ErrorDialog 'This is an ErrorDialog - note the icon used & the tone played' +return +---------------------------------------------------------------------------------------------------------------- +Option7: + msg = 'This is line1'||.endOfLine||- + 'This is line2'||.endOfLine||- + 'This is line3 - note that the dialog is "stretched" to accomodate the longest line' + call InfoDialog msg +return +---------------------------------------------------------------------------------------------------------------- +Option8: + rv = AskDialog('Do you like this demonstration? (Yes button is pre-selected)') + if rv = 1 then + call InfoDialog 'You selected "Yes" - glad you like it' + else + call InfoDialog 'You selected "No" - mind sharing what you think would improve the demonstration?' + +return +---------------------------------------------------------------------------------------------------------------- +Option9: + rv = AskDialog('Do you like this demonstration? (No button is pre-selected)','n') + if rv = 1 then + call InfoDialog 'You selected "Yes" - glad you like it' + else + call InfoDialog 'You selected "No" - you must be hard to please' + +return +---------------------------------------------------------------------------------------------------------------- +Option10: + selfile = path + parent = '' -- don't need this in this example - just a place holder + filemask = 'All Files (*.*)'delimiter'*.*'delimiter + loadorsave = '' -- Load is the default + title = '' -- See documentation for default + defExtension = '' -- don't need this in this example - just a place holder + multiSelect = '' -- don't need this in this example - just a place holder + sepChar = '' -- don't need this in this example - just a place holder + + a_file = FileNameDialog(selfile,parent,filemask,loadorsave,title,defExtension,multiSelect,sepChar) + if a_file = 0 then + call ErrorDialog 'You Did Not Select A File' + else + call InfoDialog 'You Selected' a_file + + call InfoDialog 'For additional FileNameDialog examples, see the sample titled "fileNameDialog_demo.rex"' +return +---------------------------------------------------------------------------------------------------------------- +Option11: + + call infoDialog 'This program will open a dialog window in the'||.endOfLine||- + 'upper left corner of your screen named:'||.endOfLine||.endOfLine||- + '"'.helperDlgTitle'"'||.endOfLine||.endOfLine||- + 'and will return its handle. After finding the window, the'||.endOfLine||- + 'handle value will be added to the dialog window title.' + + -- The public routine FindWindow locates a window by its title. Since this + -- example should run for anyone, and there is no way of guaranteeing what + -- window might be open on anyone's desktop, the example creates its own + -- simple dialog window. That way it ensures that there is a known window + -- to find. + + aWindow = .SimpleDialog~new() + if aWindow~initCode = 0 then + do + -- Start the dialog concurrently, so this example program can + -- continue to run. Note, it takes some finite amount of time for + -- the OS to create and start up the underlying dialog. The example + -- sleeps a short time to give the OS time to get the dialog going. + aWindow~start("Execute") + call SysSleep .01 + + hWnd = FindWindow(.helperDlgTitle) + if hWnd = 0 then + call ErrorDialog 'Window could not be found' + else + do + -- The window handle can now be used to change the title of + -- the helper dialog, which demonstrates that the handle is + -- correct. + aWindow~SetWindowTitle(hWnd,.helperDlgTitle '- My handle is.:' hWnd) + call InfoDialog 'The handle to the "'.helperDlgTitle'" window is:' hWnd + end + + -- Now close the helper dialog. + aWindow~cancel + end + else + do + call ErrorDialog 'Sorry, the dialog creation failed' + end +return +---------------------------------------------------------------------------------------------------------------- +Option12: + use arg self + + -- Dialog units only have meaning in relation to a specfic dialog because the units are dependent on the + -- font used by the dialog. The screenSize() method of the .DlgUtil can accurately calculate the dialog + -- unit values for any dialog, if passed a reference to the dialog. + + ss = .DlgUtil~screenSize('B', self) + tab = '09'x + msg = 'Dialog units are expressed as dialog units' || .endOfLine ||- + 'of' self 'dialog' || .endOfLine~copies(3) || - + 'Width In Dialog Units: ' || tab || ss[1] || .endOfLine ||- + 'Height In Dialog Units:' || tab || ss[2] || .endOfLine ||- + 'Width In Pixels: ' || tab || tab || ss[3] || .endOfLine ||- + 'Height In Pixels:' || tab || tab || ss[4] + call InfoDialog msg +return +---------------------------------------------------------------------------------------------------------------- +Option13: + msg = 'This Message Will Remain On The Screen For 5000 milliSeconds' + ret = timedMessage(msg,'A Standard TimedMessage', 5000) +return +---------------------------------------------------------------------------------------------------------------- +Option14: + msg = "Hey, I'm Back Here - Frozen In Time! This Message Will Remain On The Screen Until The Program Calls For It To Be Stopped" + tdlg = timedMessage(msg,'An unTimedMessage', -1) +return +---------------------------------------------------------------------------------------------------------------- +Option15: + if symbol('tdlg') = 'VAR' then + do + tdlg~cancel + drop tdlg + end + else + call errorDialog 'There Is Not unTimed Message To Stop' +return +---------------------------------------------------------------------------------------------------------------- +Option16: +-- Total time will be the duration of the MSSleep - The TimeMessage will last only half the total duration +-- call time 'r' + startTime = time() + startTs = .TimeSpan~new(time('F')) + msg = 'Processing Occurring - Please Wait - Processing Will Take Longer Than This Message' + ret = timedMessage(msg,'A TimedMessage Early Reply', 5000, .true) + ret = MSSleep(10000) + endTime = time() + endTS = .TimeSpan~new(time('F')) + msg = 'Start Time:' startTime '- End Time:' endTime '- Duration:' (endTS - startTS)~string~right(9)~strip('T', '0') 'Seconds' + call infoDialog msg +return +---------------------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------------------------- +Option17: + + tab = '09'x + + -- There are a large number of system metric values. You query the value you + -- are interested in by numeric index. The GetSystemMetrics Windows API is + -- documented in the MSDN Library, which Microsoft makes available online. + -- The numeric values of the possible indexes and their meanings are all + -- documented there. Use a Google search of "GetSystemMetrics MSDN Library" + -- to locate the documentation. + + SM_CMONITORS = 80 + SM_CMOUSEBUTTONS = 43 + SM_MOUSEWHEELPRESENT = 19 + + countMonitors = .DlgUtil~getSystemMetrics(SM_CMONITORS) + countMouseButtons = .DlgUtil~getSystemMetrics(SM_CMOUSEBUTTONS) + haveMouseWheel = .DlgUtil~getSystemMetrics(SM_MOUSEWHEELPRESENT) + + if countMonitors <> -1 then + l1 = "Attached Monitors:" tab || countMonitors"." ||.endOfLine + else + l1 = "SystemMetrics error." ||.endOfLine + + select + when countMouseButtons == 0 then + l2 = "Mouse:" tab || tab || "no mouse attached." ||.endOfLine + when countMouseButtons > 0 then + l2 = "Mouse:" tab || tab || countMouseButtons "button mouse." ||.endOfLine + otherwise + l2 = "SystemMetrics error." ||.endOfLine + end + -- End select + + select + when countMouseButtons == 0 then + l3 = "Mouse wheel:" tab || "no mouse attached." ||.endOfLine + when haveMouseWheel then + l3 = "Mouse wheel:" tab || "present." ||.endOfLine + when \ haveMouseWheel then + l3 = "Mouse wheel:" tab || "none." ||.endOfLine + otherwise + l3 = "SystemMetrics error." ||.endOfLine + end + -- End select + + l4 = .endOfLine||.endOfLine||" --------------------------- "||.endOfLine||.endOfLine + + SM_CXSIZE = 30 + SM_CXVSCROLL = 20 + SM_CYHSCROLL = 3 + SM_CYMENU = 15 + + l5 = "Height of single line menu bar in pixels:" tab .DlgUtil~getSystemMetrics(SM_CYMENU) || ". " ||.endOfLine + l6 = "Width of title bar button in pixels:" tab .DlgUtil~getSystemMetrics(SM_CXSIZE) || ". " ||.endOfLine + l7 = "Width of vertical scroll bar in pixels:" tab .DlgUtil~getSystemMetrics(SM_CXVSCROLL) || ". " ||.endOfLine + l8 = "Height of horizontal scroll bar in pixels:" tab .DlgUtil~getSystemMetrics(SM_CYHSCROLL) || ". " ||.endOfLine + + msg = l1 || l2 || l3 || l4 || l5 || l6 || l7 || l8 + j = infoDialog(msg) + +return +---------------------------------------------------------------------------------------------------------------- + +-- Requires directive to use the Public Routines +::requires "ooDialog.cls" + +::class SimpleDialog subclass UserDialog public +::method Execute + self~Create(0,0,290,40, .helperDlgTitle) + self~execute:super("SHOWTOP") diff --git a/modules/windows/oodialog/examples/resources/CheckIn.bmp b/modules/windows/oodialog/examples/resources/CheckIn.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e73153ef2ec8a6faccef7c062bbe3a768f3005b9 GIT binary patch literal 4150 zcmb_fdrXye7|yNM<&Q4^wQAEptjH}~YM8f5V726c%W!R}fhiWtS>iP?bAliOl2buV zC`~~S9T!8ulmoM}$S$IxG?cAn?=Jn#E{ zeu1F@kKZR(0R8Jn7^5*tc66h^r`_GIQS{~gga-)^6CSyTc!+-M0RnT}>0<832u~88 zxyN{#e(wnaYZ&n=%1Vz;jf<||x-J@9*s>-H$!iuPdG%s! zUcCsLSABpaLgLDWgh(W=h{UFt2qXyJNBnZe0<4aDXCINW2KHgZtK#5JxNLn2{k?GZ z_bBvr!|93MF1jc5b`sR;puMA~gFv70+O6R1Zl`@a5pt%ixUa1z?hvMQ(80}w# zjY+?Fc;b7#U*#LW+u&ynmFqt9$9EF z#DktLnH9dA-|esyukzqP?%#NEdNpRuY7#K_^RHBi2II45CzaxC%~k17=~2?)GIba^ zbjiH(iGP6k?Ko7>h;h@bnEdX5fVp1^{27(j>zEMqt7zcwrdlpw%=i*C)VFxdEB1o8 zO%I5FZIn;>^Z5&ku3*;uOC|?%PYwBvxSQan-sII&gWqH;;;AS4ySk(=*awB7JW_n* zA9M_WHB?qNn;HVc&!e)6xTzh*|rS%xsz6^!!Ty{A2I@xtVagh@1H}I0w&~5HB2D2b=|KPVDvW8;6|cXIxe0k2dKZLKZ1d1E-5$ybG&&9pN3 zUiMAsXuBabYGkn^e!2Ja=YKWq{7!t4cd{&WdpSb4mLN3wC_*>oA#B3|gsuMuVR2a_ zA~OBJ`L<@7*HV)<>CKFU7_a=+!+USzw;Vi+JUg(Zr4Q@=>Bq9mHbges@piofL3K{N zeBK5BKizoY4>$aNS72StFaM9xGdnY3rFZ^l!cm`R2MWOG82XWDVl+IeE+Z>$-eFU$7*WNg_K@K zNJ#@MN9$n8uf=K5^LS$}7VWD-SamBxx0NC^r4V6B`3Q~AL2OoD1=qsR+_qs?(kebb zzlHKU-iTM#k?b@AtOW+LP)V5xs5VX!EXNvAKwd=U{D|pP3!B>kOV$rKL9MG#Of+M6OEOWjz?4zg5IHkBO&Aq0|;5EG!F z;?&Nx({$`it+m=t)S(qHY$A{VLDpLO^t`9QBv$=$k&9k%W}cjL=Dg4IocGQ5o$vTZ zxV-TiZ!YZjU52-}@H!u{$<{g>?Y94M1-t^%;OU;Q;c+)@3eu!!K`4K}16ep-c^?5E->@l2(>nibWQ%n0jMUl`q)G3DQ2zd* zIY=qc!7fnyA7HC(Zf>HjOK-7GbMy8*pERxU4+zUaQkD+ycxYb;bC0GDJ&&Q@yuFA^ znshD*oj$QRI~Cky|ll;k{jp zyvlLDPH~x{5u}$qsIvBjL$DK5Wql<`J5pL9r*zEMK?lYh^(Mdmlm&Y=+$o*hNec|AU_9*3xI(!#5< zc^2C+U!XXOFJ?UAlMZRxxh4quheQ^j|LY|bS3Sa+nn&y`9%H`aC~LIzt`-|mEjFU2 z-N<{Io42yYDSS~s!TF>^n)Iy}%AfoPzg{)vZ&g z6;GpHGK0oW11`vnXz5x&Tepc}31Za}?`eKfv500l+n3aUhK?D|BR=Vnrh|KuVE*L) z%@6CSY1{UF!hC0#u7T;#Gp|LoUoxSyXPHCVyRtKusA)eYv?>>Pe3O*bO7ev7gEZ;R zBvk*CIyFn|U3v;d|0;)aU~OkC?^}kn=P8Rb zLEJshcm~cV9nz$Gn>GG7ZaqWGwy(l~cBa*-HvQ}S!#-6qRnj^$uvwPxO$MacRn=M|`~tU*1vj-Icc zp_ifW`d_@KvF6$aR9Dxb99V&z#S@SC9cm-jboM$fm_PYfRA0fJ`+wu+UE6@P3Pmb@ ze-^4gt~4Y*~SS03ISY4*&oF literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/examples/resources/CodeReview.bmp b/modules/windows/oodialog/examples/resources/CodeReview.bmp new file mode 100644 index 0000000000000000000000000000000000000000..61c52d62a9adde7916f0418a0d5272ef673cd95c GIT binary patch literal 4150 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/examples/resources/LockModule.bmp b/modules/windows/oodialog/examples/resources/LockModule.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b97e6a595c57541dd3778c828efbf95db4fd6331 GIT binary patch literal 4150 zcmd5v=?*QTjgFbr33-deA5|4*?<5A-A2ZYDS^9a$0kVCkiCHg)fJWrmd z2+@#oU~36#HWs0*z=5TXiC8ixEh*&8o{I4wF2(q)B^W(>3C21WV~k@F&jke-F-wq# zk?$|W@R5xBQZ7Agy>U^)~!oguGn{dOH#9z76H?B7djF zA0U6g)01DgeH|@G`*=CN`Ufcd?cPZHx)q~7$VV@Je>Xkg{>dM*`DOp=K?gms`KjS% z8+^tC@nO>3LO8Di^Dh9oKXd)Xf}H2_d>-%5mvdr_`x#qa( z^tnJl&j(D%z#HTj4fz*i_s2H2^xD5``zqGnYk5HaMDOMLuKq7rfm-IzaURGzXRX63 zoAGk$RAhd66mxjb#?bm!?alc7xys2e^_L844Y+?Vd!U;=$UamLqz^hx4%Gv@7ut}K zTa21(K*ky3v;ohjnCmHWPp-MXe&9OBaZZpw+W)Q{s|`OjNDib1aeXKm&{?3pNF6c@ z6gMDwn3h+J=61mO=e<$PT8!hYBL9=b!$gW}M;YtyqXvODY5y<(^*1$?VA{fBWGpDg zl-$oW6OxPcxkZ?iQ;3P25vkdq>Z}?(Jne16t@B^`gMKT6QU~=wYGKcU_<0mR6Jveh z=WLpuw-Se1fvF2V*ZED3e#A5B)KSFQl$Nu+N8j@|JzUN;2nV=#A{>b4kM9Mep;Pi8 z{UCXe)$}F%Gc&&wZuUX;+De%Tp-WtDFTK05l2RiZomsjm?J5F$ZKLnL7N5X}VpGAy%6-;wrwFf+pVA@59mZ<;kJ z{>lxAgvn12L_;K+1(V6R*&rHJi&y&7dS7Wx%-odk7pYS+{BE0HG=%Aa$wEZ(Xfmn2 zVdv7!2-RWF3X>7l#QB*Fe*^gu4qG0m58{Q%V^o9b4einRY)YT--6g)L7GCq*@JDC- z9ZIja-PIcriIAU&>X2I4uxp|-!qkL14)VKo(a! z9N{w>1l60-P_+r}sts^gY=F$=!_IZY8n||r!BxH*b^KP9?{)c~P53L;6b|9@1**Q`@So*49e##3ILF!4nk^6ui)aqJpBScyfJ#27l)~%7fhFK!6^P_nDVJ!?$d&! zH%2w1Z?$wciLz&4^U!LU9T)@m>~a-W>6Kt~+bjuQ5~7 z0IR|`m?Tj^FZCWr&p0WR^qs@6sPk}dhSvE}S-OgK^9#PJ$T zAS_NuF^MogA;ak7Qj9z%!|*g2hNjno7g^TCwj%JF={;^9TmN?TmqjF^<{zjyau*;w zSabP#6IZAvcy5`{8)QUv23B2u!Qo7`)1{X!{u9W5GsEp%H1a>*BSNq2I4C8h^|JDu3gYGss@9TYGHV|io+nWTCIO=^Z6RB|EfKyD(`F_l>QygK7kTm zGB9qHFS=>zV1%87Vk=@hX%Ei^>pOR1S;$yRbi7 z4cjy1Z(|m;zSBkzqtO^>JQh5UlNgs#i_sbPFycfVc(HT_7!lW0Xiv7&$iHh;8srU7 zktYYv5aBfn4q-LGivnyNSK!N@KVXh$IDN0j`cehlZZu%^wMGofe9Y1J$bBdov&c;& z{}x_1vZr_$bTdGZ*0}S*i$h z6f5bBI!C6!X;(5FDPQwL)s`Isg^gT)`CuBcF|6Lbg!1qGe zzPjvhz2>Z9#*HD(1|I<*pM`sy85R7INf0&iGK3V!f*X>_Ku`})?s4d z%9vyFz|10~-Ks-D{cFV6yhdn=9Db5YtWCWD>#&r+O;&jCHL`OZL_dEo-*3sQnl_<_ t$IT2C`_I~bD0`+bUPig0VcIs4Y?@zej-`K8;Ka?5<{v{>^#C8C@h^ZlkPrX> literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/examples/resources/Normal.bmp b/modules/windows/oodialog/examples/resources/Normal.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5c046138abb92e8b10f2d693cfa33988a7c90280 GIT binary patch literal 8518 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 H-{1cOz>CFC literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/examples/resources/SplitModule.bmp b/modules/windows/oodialog/examples/resources/SplitModule.bmp new file mode 100644 index 0000000000000000000000000000000000000000..277cf98f00840f784b4fdda51ccfda68d72b75fd GIT binary patch literal 4150 zcmeHIT}V@L6gL8)2#TOr>9N-c40;KC2zp5BK?@B*uol>ih^d9Ct+^=E3e@aFH?4(H zMk7L(6-H25?nP3=@~f0$e(dgUyW8$If1Uq-U(ufK$4k(K-~FG<<(%KS=bYcU1qbrC z?mGzElUT;I)w1qL0Rc-+;3_9hdW&z?Zz$&v(&N6<)UFc!ni&!hZV zC)#uvm!l2QfDbW=;P)abu5!q}6-0z(@YCl(Xw^e`l_Kq^lQHP%KvW7s_6t0Zi0DNM zvTv31%ibkO-eq0~ooLfxhVHi`F8Lt`MMV8{iX!BImm^I446F_etRHDdos3tGTad#7 zK015g?ziK^({7A7Z5VlC$GeAZ7`8RTb-M{+s)3niLnqpFm;vhlniS$ah*BNaB#GA| z925`^_z|Jmi1?`v;tCq84(rNqH53)H`bWb7bX#g+x0+zHR-?D61~yAII_s-&z4|y> zPL&}ZSVEmK`}@`Ehq&_yKVQ=P#ls=UA?klf;@=w!C%&8Mg3SY)M~UXZT$w%pYVj`fOCdMBl{#Yc4cu+!&d?6-k_F?SwUbv0BF>2VA)qkb>A>IPQ0%2Q%zXHOW2Z)Ov z!21I+&n)ok8?ZQu`1j8c?$yC(KL@ePginT@S^P@%ljJT)3Si^>%`;zw;XVkjdm#?p zh48!`KIb*~`mey(XNKsghtN|Ce|Ih14ToGwzx1J0Kg4fIJLlx&F28r~S-ex@o^CZ@ z=5je^FO^}&Qi`wUV%~#^`h%FP+mERmm9F_`ZDoJ>a#N{(h(GV|7+Ri{>WBEp3B31O zcvHSg^~35<7$a;=#bBq}J)%ZG#N9#|C2UURpk|LSU#43%`XTNP!U$m#i=$?bFh4E& zA#NLi?ZFL7_Xy)=mlpjHFWbYtgcnNpNP=DaJ(b0z}ikgIf$WW4pUl7{E-{*!fl32Q9GxhR%Pw8lp7ykTeBST-PS^6s=2@0_l6U7c zZO-rcp7-*7Tkt~ey|<_w z#0L5py@&>T5beLgxQ=MwHCVk@5oK6C-H6=y2a%pDyfdy#{H^p8>Vh9ZJTeG75`rBb zfZ`95AJY67`LSRoU)WYJqlbL5E#Vst;-M>kG)xa1J~hbt$+s2Xc+hV==u7iJG#C#Y z9iqV6mmLVb40 z-%Y;cUusb0AcPs4CS&Fo*%?gHk*-BFG`%hJ;bgbI5T+ann6ON8+F8QU*zeNoaT0>sVQz`zF zB~x%d(1tK;&zT1o1MOH`zYy6455fwvA5~qN`M??FZvEujQC)+EKd)vcp00Wvvvy2X zxyad&g?(qdQ!3wj=!nHXYE znwb>pzlx0~3l(4bQ)Z-^)4aRkf4jGgT&~~nWfsjXe*$O!_*vCLTxN3mTowcH811&oq1?#J2a$$xw!D>Sx3Ui($*T1 zu^2l3@~bs&?fe|C9m>ZeYscf!;t6>7#9L|}Z1xvnVdXqb-#A(EtRt`P^Zp!P8lYvM!I}Zt}0i>Yv_G?DL)Nn7wTpXQtGr>|N&U!aTX* zw>o^$ke~;q7Q*3v{CM#c%1&&-n+F%GnfKiGJQN@P41UhR1m|_t34L}_bJOgfGC$q$ zedHsN&>kos#0yi8sve{_b${v^p?gG~8Mtq$y^C7({>jgLHv9=Z1C4n8Y&}qgWRiSF zN{8ga36m48!I={l8hLK@u3x2C!n--hzMFA7W7x}gz)N;gYY-ojk_RWW4kstlqe

?T7s|hD3!e^g2{DDiqqxk)$qhbsHc!OELc0seX8I&>Phpx?`J`ujK zcWqcbYPRNAJLJqe+2Vr=awGij8mjTZ+ly!LJ^!iJgm?3GobT{Sunv6nUbNO% wqP4CP$2gZ;_Lehtp!v&EH1FPyCZ1L0ye|K<3ICvX^D}(kh&^^Q^Z)w%FXt30xc~qF literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/examples/resources/addManyRows.h b/modules/windows/oodialog/examples/resources/addManyRows.h new file mode 100644 index 0000000..e270aec --- /dev/null +++ b/modules/windows/oodialog/examples/resources/addManyRows.h @@ -0,0 +1,69 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_ADD_ROWS 101 +#define IDD_INTRO 103 +#define IDD_SORT_PARAMS 105 +#define IDC_ST_CREATE 1000 +#define IDC_RB_ITEM 1001 +#define IDC_LV 1002 +#define IDC_PB_SORT_INTERN 1003 +#define IDC_RB_SUBITEM 1003 +#define IDC_PB_SORT_REXX 1004 +#define IDC_ED_COL 1005 +#define IDC_ST_INSERT 1006 +#define IDC_SP_COL 1007 +#define IDC_SP_ITEMS 1010 +#define IDC_ED_ITEMS 1011 +#define IDC_CK_FREEFORM 1013 +#define IDC_RB_1000 1020 +#define IDC_RB_2000 1021 +#define IDC_RB_5000 1022 +#define IDC_RB_10000 1023 +#define IDC_RB_15000 1024 +#define IDC_RB_25000 1025 +#define IDC_GB_TIMES 1027 +#define IDC_ST_INTERNAL 1028 +#define IDC_ST_REXXSORT 1029 +#define IDC_RB_ASCENDING 1030 +#define IDC_RB_DESCENDING 1031 +#define IDC_RB_CASELESS 1034 +#define IDC_RB_CASE 1035 diff --git a/modules/windows/oodialog/examples/resources/addManyRows.rc b/modules/windows/oodialog/examples/resources/addManyRows.rc new file mode 100644 index 0000000..81afddb --- /dev/null +++ b/modules/windows/oodialog/examples/resources/addManyRows.rc @@ -0,0 +1,106 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "addManyRows.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ADD_ROWS DIALOGEX 0, 0, 411, 238 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU +CAPTION "Large Item Count List View" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + CONTROL "", IDC_LV, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_REPORT, 10, 10, 391, 153 + PUSHBUTTON "Rexx Sort", IDC_PB_SORT_REXX, 10, 214, 62, 14 + PUSHBUTTON "Internal Sort", IDC_PB_SORT_INTERN, 10, 195, 62, 14 + GROUPBOX "Time in seconds (2000 rows):", IDC_GB_TIMES, 77, 168, 269, 60 + LTEXT "Create full rows:", IDC_ST_CREATE, 86, 185, 107, 8, SS_LEFT + LTEXT "Insert full rows:", IDC_ST_INSERT, 86, 207, 107, 8, SS_LEFT + LTEXT "Internal sort:", IDC_ST_INTERNAL, 226, 185, 107, 8, SS_LEFT + LTEXT "Rexx sort:", IDC_ST_REXXSORT, 226, 207, 107, 8, SS_LEFT + DEFPUSHBUTTON "OK", IDOK, 351, 214, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_INTRO DIALOGEX 0, 0, 241, 130 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU +CAPTION "Progress Bar Example - Set Up" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + LTEXT "The upcoming example creates a list-view with a large number of items. Select the number of items for the list-view", IDC_STATIC, 12, 10, 209, 19, SS_LEFT + GROUPBOX "Pre-sets", IDC_STATIC, 11, 34, 104, 85, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "1,000", IDC_RB_1000, 21, 49, 35, 10, WS_TABSTOP + AUTORADIOBUTTON "2,000", IDC_RB_2000, 74, 49, 35, 10 + AUTORADIOBUTTON "5,000", IDC_RB_5000, 21, 73, 35, 10 + AUTORADIOBUTTON "10,000", IDC_RB_10000, 74, 73, 35, 10 + AUTORADIOBUTTON "15,000", IDC_RB_15000, 21, 98, 35, 10 + AUTORADIOBUTTON "25,000", IDC_RB_25000, 74, 98, 35, 10 + AUTOCHECKBOX "Use Free-form", IDC_CK_FREEFORM, 126, 39, 80, 10 + GROUPBOX "Free-form", IDC_STATIC, 126, 57, 104, 39 + EDITTEXT IDC_ED_ITEMS, 151, 73, 40, 14, ES_AUTOHSCROLL + CONTROL "", IDC_SP_ITEMS, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_SETBUDDYINT, 179, 73, 11, 14 + DEFPUSHBUTTON "OK", IDOK, 127, 106, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 181, 106, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_SORT_PARAMS DIALOGEX 0, 0, 295, 162 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU +CAPTION "Set Up the Sort" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + GROUPBOX "Sort Parameters:", IDC_STATIC, 10, 10, 275, 116 + GROUPBOX "Column:", IDC_STATIC, 29, 31, 59, 77 + AUTORADIOBUTTON "Item", IDC_RB_ITEM, 38, 48, 39, 8, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "Subitem", IDC_RB_SUBITEM, 38, 67, 39, 8 + EDITTEXT IDC_ED_COL, 38, 87, 31, 12, ES_AUTOHSCROLL + CONTROL "", IDC_SP_COL, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 57, 87, 11, 14 + GROUPBOX "", IDC_STATIC, 107, 31, 160, 77, WS_GROUP + AUTORADIOBUTTON "Ascending", IDC_RB_ASCENDING, 124, 48, 48, 8, WS_TABSTOP + AUTORADIOBUTTON "Descending", IDC_RB_DESCENDING, 192, 48, 55, 8 + AUTORADIOBUTTON "Case Sensitive", IDC_RB_CASE, 124, 67, 60, 8, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "Case Insensitive", IDC_RB_CASELESS, 192, 67, 65, 8 + DEFPUSHBUTTON "OK", IDOK, 180, 138, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 235, 138, 50, 14 +} diff --git a/modules/windows/oodialog/examples/resources/genGUID.h b/modules/windows/oodialog/examples/resources/genGUID.h new file mode 100644 index 0000000..6dd8978 --- /dev/null +++ b/modules/windows/oodialog/examples/resources/genGUID.h @@ -0,0 +1,43 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_GUID_GENERATOR 100 +#define IDC_EDIT_GUID 1002 diff --git a/modules/windows/oodialog/examples/resources/genGUID.rc b/modules/windows/oodialog/examples/resources/genGUID.rc new file mode 100644 index 0000000..c542be1 --- /dev/null +++ b/modules/windows/oodialog/examples/resources/genGUID.rc @@ -0,0 +1,51 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include "genGUID.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_GUID_GENERATOR DIALOGEX 0, 0, 186, 64 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "GUID Generator" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + CONTROL "This is your GUID:", IDC_STATIC, WC_STATIC, NOT WS_GROUP | SS_LEFT, 10, 11, 90, 10 + CONTROL "", IDC_EDIT_GUID, WC_EDIT, NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY, 11, 23, 165, 12 + CONTROL "Done", IDOK, WC_BUTTON, WS_TABSTOP | BS_DEFPUSHBUTTON, 126, 40, 50, 14 +} diff --git a/modules/windows/oodialog/examples/resources/imageButton.h b/modules/windows/oodialog/examples/resources/imageButton.h new file mode 100644 index 0000000..43fdd9c --- /dev/null +++ b/modules/windows/oodialog/examples/resources/imageButton.h @@ -0,0 +1,45 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDC_ST_STATUS 1000 +#define IDC_PB_ADD 1001 +#define IDD_IMAGELIST_BUTTON 1033 +#define IDC_PB_PUSHME 1042 +#define IDC_PB_VIEW 1044 diff --git a/modules/windows/oodialog/examples/resources/imageButton.rc b/modules/windows/oodialog/examples/resources/imageButton.rc new file mode 100644 index 0000000..26b0149 --- /dev/null +++ b/modules/windows/oodialog/examples/resources/imageButton.rc @@ -0,0 +1,53 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include "imageButton.h" +#include + + +IDD_IMAGELIST_BUTTON DIALOGEX 0, 0, 235, 116 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU +CAPTION "ooRexx Photograph Shop" +FONT 8, "Ms Shell Dlg 2", 400, 0, 1 +BEGIN + PUSHBUTTON "", IDC_PB_VIEW, 7, 7, 69, 62 + PUSHBUTTON "", IDC_PB_ADD, 157, 7, 69, 62 + LTEXT "Status", IDC_ST_STATUS, 7, 78, 219, 11, SS_SUNKEN | SS_WORDELLIPSIS + PUSHBUTTON "Push Me", IDC_PB_PUSHME, 7, 95, 50, 14 + DEFPUSHBUTTON "OK", IDOK, 123, 95, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 178, 95, 50, 14 +END diff --git a/modules/windows/oodialog/examples/resources/osfDialogs.h b/modules/windows/oodialog/examples/resources/osfDialogs.h new file mode 100644 index 0000000..f960def --- /dev/null +++ b/modules/windows/oodialog/examples/resources/osfDialogs.h @@ -0,0 +1,65 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_SAVE_FILE 100 +#define IDD_SIMPLE_OSF_DIALOGS 102 +#define IDC_EDIT_OSF 1000 +#define IDC_PB_SHOW 1000 +#define IDC_PB_SHOW_OSF 1001 +#define IDC_RB_OPEN 1002 +#define IDC_RB_OPEN_MULTI 1004 +#define IDC_EDIT 1005 +#define IDC_CK_EXE 1006 +#define IDC_CK_DLL 1007 +#define IDC_CK_CLS 1008 +#define IDC_CK_NONE 1009 +#define IDC_RB_SAVE 1010 +#define IDC_RB_OPEN_FOLDER 1012 +#define IDC_RB_SAVE_DEFAULT 1014 +#define IDC_RB_OPEN_CUSTOM 1016 + +#define IDC_TT_OPEN 1200 +#define IDC_TT_SAVE 1201 +#define IDC_TT_OPEN_MULTI 1202 +#define IDC_TT_OPEN_CUSTOM 1203 +#define IDC_TT_SAVE_DEFAULT 1204 +#define IDC_TT_OPEN_FOLDER 1205 + + diff --git a/modules/windows/oodialog/examples/resources/osfDialogs.rc b/modules/windows/oodialog/examples/resources/osfDialogs.rc new file mode 100644 index 0000000..96d480b --- /dev/null +++ b/modules/windows/oodialog/examples/resources/osfDialogs.rc @@ -0,0 +1,80 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "osfDialogs.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_SAVE_FILE DIALOGEX 0, 0, 257, 123 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Save File Dialog Example" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + LTEXT "Result of the Save File Dialog execution will be shown here:", IDC_STATIC, 11, 10, 235, 11, SS_LEFT | SS_CENTERIMAGE + EDITTEXT IDC_EDIT, 10, 23, 236, 12, NOT WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY + LTEXT "Filter (remove from view) files with these extensions:", IDC_STATIC, 11, 49, 235, 11, SS_LEFT | SS_CENTERIMAGE + GROUPBOX "", IDC_STATIC, 10, 59, 236, 32 + AUTOCHECKBOX "*.exe", IDC_CK_EXE, 21, 72, 35, 9 + AUTOCHECKBOX "*.dll", IDC_CK_DLL, 71, 72, 35, 9 + AUTOCHECKBOX "*.cls", IDC_CK_CLS, 117, 72, 35, 9 + AUTOCHECKBOX "None", IDC_CK_NONE, 197, 72, 35, 9 + DEFPUSHBUTTON "Show Save File Dialog", IDC_PB_SHOW, 10, 99, 85, 14 + PUSHBUTTON "Done", IDCANCEL, 197, 99, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_SIMPLE_OSF_DIALOGS DIALOGEX 0, 0, 256, 193 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Open File or Save File Demonstration" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + GROUPBOX "Pick the Open / Save File Dialog to display:", IDC_STATIC, 10, 10, 236, 106 + AUTORADIOBUTTON "Simple Open File", IDC_RB_OPEN, 23, 27, 66, 11 + AUTORADIOBUTTON "Simple Save File", IDC_RB_SAVE, 23, 49, 66, 11 + AUTORADIOBUTTON "Open Multiple Files", IDC_RB_OPEN_MULTI, 23, 72, 85, 11 + AUTORADIOBUTTON "Open File Easy Customizations", IDC_RB_OPEN_CUSTOM, 117, 27, 110, 11 + AUTORADIOBUTTON "Save File Default Name", IDC_RB_SAVE_DEFAULT, 117, 49, 110, 11 + AUTORADIOBUTTON "Open File in Specified Folder", IDC_RB_OPEN_FOLDER, 117, 72, 110, 11 + DEFPUSHBUTTON "Show", IDC_PB_SHOW_OSF, 84, 93, 50, 14 + LTEXT "Result of the Open / Save File Dialog execution will be shown here:", IDC_STATIC, 10, 136, 235, 11, SS_LEFT | SS_CENTERIMAGE + EDITTEXT IDC_EDIT_OSF, 10, 149, 236, 12, NOT WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY + PUSHBUTTON "Done", IDCANCEL, 196, 169, 50, 14 +} diff --git a/modules/windows/oodialog/examples/resources/saveFileWithFilter.h b/modules/windows/oodialog/examples/resources/saveFileWithFilter.h new file mode 100644 index 0000000..254c4b1 --- /dev/null +++ b/modules/windows/oodialog/examples/resources/saveFileWithFilter.h @@ -0,0 +1,54 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_SAVE_FILE 100 +#define IDD_SIMPLE_OSF_DIALOGS 102 +#define IDC_PB_SHOW 1000 +#define IDC_RB_OPEN 1002 +#define IDC_EDIT 1005 +#define IDC_CK_EXE 1006 +#define IDC_CK_DLL 1007 +#define IDC_CK_CLS 1008 +#define IDC_CK_NONE 1009 +#define IDC_RB_SAVE 1010 +#define IDC_RB_OPEN_FOLDER 1012 +#define IDC_RB_SAVE_DEFAULT 1014 +#define IDC_RB_OPEN_CUSTOM 1016 diff --git a/modules/windows/oodialog/examples/resources/saveFileWithFilter.rc b/modules/windows/oodialog/examples/resources/saveFileWithFilter.rc new file mode 100644 index 0000000..354f9dc --- /dev/null +++ b/modules/windows/oodialog/examples/resources/saveFileWithFilter.rc @@ -0,0 +1,79 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "saveFileWithFilter.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_SIMPLE_OSF_DIALOGS DIALOGEX 0, 0, 256, 169 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Open File or Save File Demonstration" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + GROUPBOX "Pick the Open / Save File Dialog to display:", IDC_STATIC, 10, 10, 236, 84 + AUTORADIOBUTTON "Simple Open File", IDC_RB_OPEN, 23, 27, 66, 11 + AUTORADIOBUTTON "Simple Save File", IDC_RB_SAVE, 23, 49, 66, 11 + AUTORADIOBUTTON "Open File in Specified Folder", IDC_RB_OPEN_FOLDER, 104, 73, 110, 11 + AUTORADIOBUTTON "Save File Default Name", IDC_RB_SAVE_DEFAULT, 104, 49, 110, 11 + AUTORADIOBUTTON "Open File Easy Customizations", IDC_RB_OPEN_CUSTOM, 104, 27, 110, 11 + DEFPUSHBUTTON "Show", IDOK, 23, 72, 50, 14 + LTEXT "Result of the Open / Save File Dialog execution will be shown here:", IDC_STATIC, 10, 112, 235, 11, SS_LEFT | SS_CENTERIMAGE + EDITTEXT IDC_EDIT, 10, 125, 236, 12, NOT WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY + PUSHBUTTON "Done", IDCANCEL, 196, 145, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_SAVE_FILE DIALOGEX 0, 0, 257, 123 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Save File Dialog Example" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + LTEXT "Result of the Save File Dialog execution will be shown here:", IDC_STATIC, 11, 10, 235, 11, SS_LEFT | SS_CENTERIMAGE + EDITTEXT IDC_EDIT, 10, 23, 236, 12, NOT WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY + LTEXT "Filter (remove from view) files with these extensions:", IDC_STATIC, 11, 49, 235, 11, SS_LEFT | SS_CENTERIMAGE + GROUPBOX "", IDC_STATIC, 10, 59, 236, 32 + AUTOCHECKBOX "*.exe", IDC_CK_EXE, 21, 72, 35, 9 + AUTOCHECKBOX "*.dll", IDC_CK_DLL, 71, 72, 35, 9 + AUTOCHECKBOX "*.cls", IDC_CK_CLS, 117, 72, 35, 9 + AUTOCHECKBOX "None", IDC_CK_NONE, 197, 72, 35, 9 + DEFPUSHBUTTON "Show Save File Dialog", IDC_PB_SHOW, 10, 99, 85, 14 + PUSHBUTTON "Done", IDCANCEL, 197, 99, 50, 14 +} diff --git a/modules/windows/oodialog/examples/resources/useTools.h b/modules/windows/oodialog/examples/resources/useTools.h new file mode 100644 index 0000000..8ffeaf6 --- /dev/null +++ b/modules/windows/oodialog/examples/resources/useTools.h @@ -0,0 +1,51 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#define IDC_ST_TOOL_SIMULATOR 200 +#define IDC_PB_SHOW_PALETTE 210 +#define IDC_PB_LOCKMODULE 301 +#define IDC_PB_LOCKPROJECT 302 +#define IDC_PB_SPLITMODULE 303 +#define IDC_PB_SAVEMODULE 304 +#define IDC_PB_SAVEPROJECT 305 +#define IDC_PB_SAVEALL 306 +#define IDC_PB_CHECKIN 307 +#define IDC_PB_LINKTOWEB 308 +#define IDC_PB_CODEREVIEW 309 +#define IDC_PB_UPDATE 310 +#define IDC_PB_PROJECTREVIEW 311 +#define IDC_PB_CLOSE 400 diff --git a/modules/windows/oodialog/examples/saveFileWithFilter.rex b/modules/windows/oodialog/examples/saveFileWithFilter.rex new file mode 100755 index 0000000..9ecea29 --- /dev/null +++ b/modules/windows/oodialog/examples/saveFileWithFilter.rex @@ -0,0 +1,408 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** saveFileWithFilter.rex + * + * This example shows how to use the Common Item Dialog in file save mode. + * + * This example will only run on Vista or later. + * + * Both the .OpenFileDialog and the .SaveFileDialog are subclasses of the + * .CommonItemDialog class. The Rexx programmer can not instantiate a + * .CommonItemDialog object. Instead the programmer picks the type of file + * dialog he wants, a save file or an open file dialog and instantitates that + * class. Almost all of the methods for these classes come from the + * CommonItemDialog class and are documented in the reference manual under the + * CommonItemDialog section. + * + * This example shows 2 things. 1.) How to use a filter with the dialog. This + * is done with the .ShellItemFilter class. 2.) How to connect event + * notifications. This is done with the .CommonDialogEvents class. + * + * For the purpose of the example, we use a hypothetical case that the + * application wants the user to pick a file to save to, but the data being + * saved can not be saved to file with the extension of .exe, or .dll, or .cls. + * + * To achieve this a filter is used so that the save dialog does not show any + * files with those extensions. To ensure the user does not type in a file + * name with those extensions, when the user picks a file name, the OnFileOk + * event is used to check the file name the user picked. + * + * To give the example a little variety, a dialog is first put up to allow the + * user to pick some or all of the extensions to filter out and the Save File + * Dialog can be shown multiple times. + * + * The Common Item Dialog allows its state to be saved on a per instance basis + * in addition to the per process basis. This is done by generating a GUID and + * assigning it to the dialog before it is configured. Then, for each dialog + * with the same GUID, the operating system saves its state separately. + * + * To make use of this feature, the programmer would generate a single GUID and + * then assign the same GUID each time the file dialog was shown in the + * application. + * + * This simple program can be used to generate a GUID. Run the program and + * then copy and paste the output on the command line in to your program. + * + * - - - - - - - - - Cut begin - - - - - - - - - - - - - - - - - - - - - - - - + * /* genGUID.rex */ + * + * guid = .DlgUtil~getGUID + * say guid + * return 0 + * + * ::requires 'ooDialog.cls' + * - - - - - - - - - Cut end - - - - - - - - - - - - - - - - - - - - - - - - - + * + */ + if \ .application~requiredOS('Vista', 'saveFileWithFilter.rex') then return 99 + + srcDir = locate() + + -- Set up the symbolic IDs and then put up our example dialog. + .application~setDefaults('O', srcDir'resources\saveFileWithFilter.h', .false) + + dlg = .CommonSaveDialog~new(srcDir'resources\saveFileWithFilter.rc', IDD_SAVE_FILE) + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + + return 0 + +::requires "ooDialog.cls" + +::class 'CommonSaveDialog' subclass RcDialog + +-- Do not copy this GUID into your own code. Always generate your own GUID. +::constant GUID 'a25b89e4-db67-4423-ae66-a4836bb76024' + + +/** initDialog() + * + * Simple standard init dialog method. We save references to our commonly used + * controls, set the .exe check box to checked on start up, and connect the + * button click event for the push button and the 'None' check box. Each time + * the None check box is clicked we toggle the state of the other 3 check boxex. + * + * We also use this method to find the installed directory of ooRexx. + */ +::method initDialog + expose ckExe ckDll ckCls ckNone edit rexx_home + + ckExe = self~newCheckBox(IDC_CK_EXE)~~check + ckDll = self~newCheckBox(IDC_CK_DLL) + ckCls = self~newCheckBox(IDC_CK_CLS) + ckNone = self~newCheckBox(IDC_CK_NONE) + + edit = self~newEdit(IDC_EDIT) + + self~connectButtonEvent(IDC_CK_NONE, 'CLICKED', onCheckNone) + self~connectButtonEvent(IDC_PB_SHOW, 'CLICKED', onShowSaveDialog) + + rexx_home = value('REXX_HOME', , 'ENVIRONMENT') + if rexx_home == '' then rexx_home = 'C:\Program Files' + + +/** onShowSaveDialog() + * + * When the user clicks on the 'Show Save File Dialog' push button, we put up + * the Save File Dialog and then report the results in the edit control. + * + * The Save File Dialog filters out files in the view of the dialog. The + * checked check boxes determine which files are filtered out, or no files are + * filtered out. + * + * Say the .exe and .dll extensions are set (through the check boxes) to be + * filtered out. + * + * To filter out those values in the view of the dialog, we need to instantiate + * a .ShellItemFilter object. The ShellItemFilter has just one method: + * includeItem(). The operating system's Save File Dialog will invoke that + * method for each file in the initial folder. When / if the user changes to a + * new folder, the operating system again invokes the method for each file in + * the new folder. If the method returns S_OK the file is included, if S_FALSE + * is returned, the file is not shown in the view. + * + * The includeItem() of the .ShellItemFilter class simply returns S_OK. To + * change that behavior the Rexx programmer creates a subclass and over-rides + * the includeItem() method. + * + * However, the user could simply type in the name: myfile.exe in the edit box. + * We also want to prevent that. To do this we need to instantiate a + * .CommonDialogEvents object. The .CommonDialogEvents class has a method for + * every notification the operating system's common item dialog sends. These + * methods all simply return the proper value to continue. To change the + * default behaviour the Rexx programmer creates a subclass and over-rides the + * methods she is interested in. + */ +::method onShowSaveDialog unguarded + expose edit rexx_home + + -- Setting the client GUID has the operating system preserve the state for + -- this specific save file dialog. + sfd = .SaveFileDialog~new + ret = sfd~setClientGuid(self~GUID) + + -- The filter variable is a simple string of words. Each word in the string + -- is a file extension to filter out of the view. + filter = self~getCurrentFilter + + -- If the filter is 'None', the None check box is checked. No point in + -- setting the filter or event handler at all for that case. + if filter \== 'None' then do + -- Instantiate our .CommonDialogEvents object and inform the Common Item + -- Dialog of it through the advise() method. + eventHandler = .CDevents~new + eventHandler~filter = filter + sfd~advise(eventHandler) + + -- Same basic thing for our filter object. The Common Item Dialog is + -- informed of the filter through the setFilter() method. + filterObj = .SIFilter~new + filterObj~filter = filter + sfd~setFilter(filterObj) + end + + -- We set the initial folder to the install directory of ooRexx because we + -- know that directory contains .exe, .dll, and .cls files. + sfd~setFolder(rexx_home) + + -- We are all set, show the dialog and get the user's response: + ret = sfd~show(self) + + + if ret == sfd~canceled then text = 'The user canceled the save' + else text = 'Save to file:' sfd~getResult + + -- The proper use of both the .SaveFileDialog and the .OpenFileDialog is to + -- instantiate the object, configure it, show it, and then release it. The + -- release() method is essential to ensuring the COM resources are properly + -- cleaned up. + -- + -- If release() is not called, the ooDialog framework will *attempt* to do + -- the clean up in an uninit() method. However, 1.) there is *no* guarentee + -- that the interpreter will invoke the uninit() method. 2.) There is *no* + -- guarentee the uninit() will be run on this thread. The COM resources can + -- *not* be cleaned up if uninit() is run on another thread than this one. + -- + -- The only way to guarentee that the COM resources are cleaned up properly + -- is for the programmer to invoke the release() method. + sfd~release + + -- Have the edit box display the result. + edit~setText(text) + + +/** onCheckNone() + * + * The event handler for the CLICK event. This method is invoked whenever the + * user clicks on the 'None' check box. If the click checks the check box we + * uncheck all the othe check boxes and disable them. If the click unchecks + * the check box we re-enable the other check boxes. + */ +::method onCheckNone unguarded + expose ckExe ckDll ckCls ckNone + + if ckNone~checked then do + ckExe~~uncheck~disable + ckDll~~uncheck~disable + ckCls~~uncheck~disable + end + else do + ckExe~enable + ckDll~enable + ckCls~enable + end + + +/** getCurrentFilter() + * + * A simple private helper method. We create a string with each file extension + * name for every extension whose check box is checked. If the None check box + * is checked we use the string 'None' The file extension names need to be + * separated by spaces so that we have a string of 'words.' + */ +::method getCurrentFilter unguarded private + expose ckExe ckDll ckCls ckNone + + if ckNone~checked then do + f = 'None' + end + else do + f = '' + if ckExe~checked then f = '.exe' + if ckDll~checked then f ||= ' .dll' + if ckCls~checked then f ||= ' .cls' + end + if f == '' then f = 'None' + + return f + + +/* Class: Helper + * + * Both the .SIFilter and the .CDEvents classes need to obtain the file + * extension from complete path names. The code to do that is put in this + * mixin class so we don't need to duplicate the code in each class. + * + * In addition both of the classes need a way to know which filter the user + * selected (through the check boxes.) The filter attribute is a convenient + * way to inform the objects of the current filter. + */ +::class 'Helper' mixinclass object +::attribute filter unguarded +::method getExtension + use strict arg file + + pos = file~lastpos('.') + if pos > 0 then return file~substr(pos) + else return '' + + +/* Class: SIFilter + * + * To assign a filter to your Open/Save File Dialog you need to use a + * ShellItemFilter object. + * + * The .ShellItemFilter class has one method, includeItem(). This method is + * invoked by the operating system (through the ooDialog framework's + * implementation of the COM IShellItemFilter interface.) + * + * The Rexx ShellItemFilter returns S_OK from the includeItem() method. To + * actually filter items, the programmer needs to subclass ShellItemFilter and + * provide a custom filter by over-riding the includeItem() method. + */ +::class 'SIFilter' subclass ShellItemFilter inherit Helper + +/** includeItem() + * + * Our includeItem() over-ride. + * + * sfd -> The Rexx SaveFileDialog object we are connected to. + * hwnd -> The window handle of the operating system's Save File Dialog. + * item -> The complete path name of a file about to be put in the view. + */ +::method includeItem + use arg sfd, hwnd, item + + -- If the filter is none, every file should be included and we simply return + -- S_OK. This can not actually happen in our program because, if the filter + -- is none, this event handler is not connected in the first place. + filStr = self~filter + if filStr == 'None' then return self~S_OK + + -- Get the extension of this file and see if the extension is in the filter. + -- If it is, return S_FALSE to exclude it from the view. + ext = self~getExtension(item) + if filStr~caselessWordPos(ext) <> 0 then return self~S_FALSE + + return self~S_OK + + +/* Class: CDEvents + * + * The operating system's Common Item Dialog has 12 event notifications it sends + * to an event handler. The Rexx programmer can elect to handle some or all of + * those events by using a CommonDialogEvents object. + */ +::class 'CDEvents' subclass CommonDialogEvents inherit Helper + +/** onFileOk() + * + * This is the event handler for the Ok push button, which is labeled Open, or + * Save depending on the type of file dialog. Or it could be a custom label. + * + * It is invoked when the user has pushed Save (for this dialog) but before + * the dialog is closed. It gives us a chance to veto the close. If S_OK is + * returned the dialog closes. If S_FALSE is returned the dialog does not + * close. + * + * Obviously, if the dialog does not close when the user presses the button, it + * can be disconcerting. So, you should always put up some explanation of why + * the dialog does not close. + * + * Here we examine the choosen file and see if it has one of the extensions not + * allowed. If so we refuse the file. + * + * cfd -> .CommonFileDialog This is the Rexx Common File Dialog object. + * hwnd -> This is the window handle of the operating system file dialog. + */ +::method onFileOk unguarded + use arg cfd, hwnd + + if self~filter == 'None' then return self~S_OK + + file = cfd~getResult + if file \== .nil then do + ext = self~getExtension(file) + + if self~filter~caselessWordPos(ext) <> 0 then do + extList = self~nameExtensions(self~filter) + title = 'ooRexx Save File Selection Error' + msg = 'File:' file 'is not acceptable.' || .endOfLine~copies(2) || - + 'The file to save to must not have' extList + j = MessageDialog(msg, hwnd, title, 'OK', 'ERROR') + return self~S_FALSE + end + end + + return self~S_OK + + +/** nameExtensions() + * + * Just a simple helper method to take the filter string: '.exe .dll' and turn + * it into a phrase for the message box. I.e.: + * + * '.cls' -> an extension of .cls + * + * '.exe .cls' -> an extension of .exe, or .cls + * + * etc., etc.. + */ +::method nameExtensions unguarded private + use strict arg exts + + count = exts~words + str = 'an extension of ' + + if count == 1 then do + str ||= exts + end + else do i = 1 to count + if i == count then str ||= 'or' exts~word(i) + else str ||= exts~word(i) || ', ' + end + return str || '.' diff --git a/modules/windows/oodialog/examples/simpleFolderBrowse.rex b/modules/windows/oodialog/examples/simpleFolderBrowse.rex new file mode 100755 index 0000000..821540b --- /dev/null +++ b/modules/windows/oodialog/examples/simpleFolderBrowse.rex @@ -0,0 +1,135 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * A quick example of the SimpleFolderBrowse class. This class only has one + * method: getFolder() and it is a class method. + * + * It is very easy to use, you just invoke the getFolder() method and the folder + * picked by the user is returned. When the user picks a folder the fully + * qualified path name is returned. If the user cancels, the empty string is + * returned. + * + * It is possible, depending on how the dialog is set up, for the user to pick a + * virtual folder that has no file system path. In that case, .nil is returned. + * + */ + + -- Set up some symbolic IDs and then put up our dialog. + .application~setDefaults('O', , .false) + .constDir[IDC_PB_BROWSE] = 100 + .constDir[IDC_ST_RESULTS] = 101 + .constDir[IDC_EDIT] = 102 + .constDir[IDC_RB_USE_OPTIONS] = 103 + .constDir[IDC_RB_NO_OPTIONS] = 104 + + dlg = .BrowseDialog~new + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + + return 0 + +::requires "ooDialog.cls" + +::class 'BrowseDialog' subclass UserDialog + +::method init + forward class (super) continue + + self~create(30, 30, 257, 123, "Simple Folder Browse Example", "CENTER") + + +/** defineDialog() + * + * Create a simple dialog template. + */ +::method defineDialog + + self~createStaticText(IDC_ST_RESULTS, 10, 10, 30, 11, , "Results:") + self~createEdit(IDC_EDIT, 10, 24, 237, 11, 'AUTOSCROLLH') + self~createRadioButton(IDC_RB_USE_OPTIONS, 10, 60, 90, 14, "AUTO", 'Use optional arguments') + self~createRadioButton(IDC_RB_NO_OPTIONS, 10, 79, 90, 14, "AUTO", 'No optional arguments') + self~createPushButton(IDC_PB_BROWSE, 10, 99, 50, 14, "DEFAULT", "Browse", onBrowse) + self~createPushButton(IDCANCEL, 197, 99, 50, 14, , "Done") + + +/** onBrowse() + * + * When the user clicks on the 'Browse' push button, we put up the browse for + * folder dialog and then report the results in the edit control. + * + * If the 'Use opitonal arguments' radio button is checked we use all the + * possible optional arugments. Otherwise we just put up the browse for folder + * dialog 'plain.' I.e., using all defaults. + */ +::method onBrowse unguarded + expose rbUse + + if rbUse~checked then do + title = 'Browsing for folders the REXXish way' + banner = 'Instructions could go here ...' + hint = 'Pick any folder you wish, or some other hint' + + startDir = value("REXX_HOME", , 'ENVIRONMENT') + if startDir == '' then startDir = 'C:\Program Files' + + folder = .SimpleFolderBrowse~getFolder(title, banner, hint, startDir, 'CSIDL_DRIVES', self) + end + else do + folder = .SimpleFolderBrowse~getFolder + end + + edit = self~newEdit(IDC_EDIT) + + select + when folder == .nil then text = 'The user picked a virtual folder' + when folder == '' then text = 'The user canceled' + otherwise text = 'The user picked:' folder + end + -- End select + + edit~setText(text) + + +/** initDialog() + * + * Simple init dialog method. We just use it to check one of the radio buttons. + */ +::method initDialog + expose rbUse + + rbUse = self~newRadioButton(IDC_RB_USE_OPTIONS) + rbUse~check diff --git a/modules/windows/oodialog/examples/stopWatch.rex b/modules/windows/oodialog/examples/stopWatch.rex new file mode 100755 index 0000000..c1f408c --- /dev/null +++ b/modules/windows/oodialog/examples/stopWatch.rex @@ -0,0 +1,189 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* ========================================================================= */ +/* Stopwatch a Rexx Stopwatch */ +/* ========================================================================= */ + + dlg = .StopWatchCls~new /* Create OODialog Class instance */ + dlg~execute('ShowTop') /* Create, show and run the Windows Object */ + +EXIT -->| +/* ========================================================================= */ +::requires 'ooDialog.cls' /* OODialog Windows GUI Class */ +::requires "winSystm.cls" /* for clipboard manager */ +/* ========================================================================= */ +::class StopWatchCls subclass userdialog +/* ------------------------------------------------------------------------- */ +::attribute state unguarded /* [Stopped,Running,Split,splitting] */ +::attribute session unguarded /* session number */ +::attribute events unguarded /* event record for clipboard */ +/* ------------------------------------------------------------------------- */ +::method Init +/* ------------------------------------------------------------------------- */ + + self~Init:super /* we call the Super Class (userdialog) */ + + rc = self~CreateCenter(160,62,'Stopwatch - - Stopped',,,'MS Sans Serif',8) + self~InitCode = (rc=0) + self~state = 'Stopped' + self~time = '00:00:00.00' + self~Session = 0 + self~events = .array~new + +/* ------------------------------------------------------------------------- */ +::method DefineDialog +/* ------------------------------------------------------------------------- */ +expose menuBar + + u = .dlgAreaU~new(self) /* Whole dialog */ + self~createEdit( 10, u~x, u~y, u~w, u~h('31%'), 'readonly center', 'time') + self~createPushButton(11, u~x, u~y('41%'),u~w('45%'),u~h('38%'), ,'Start', 'ButtonPress') + self~createPushButton(12, u~x('55%'),u~y('41%'),u~w('45%'),u~h('38%'), ,'Exit', 'ButtonPress') + + menuBar = .BinaryMenuBar~new + filePopup = .PopupMenu~new(13) + filePopup~insertItem(IDCANCEL,IDCANCEL,"E&xit") + editPopup = .PopupMenu~new(14) + editPopup~insertItem(15, 15, "&Copy","GRAYED",,,.true,"Copy2CB") + + menuBar~insertPopup(14,14,editPopup,"&Edit") + menuBar~insertPopup(13,13,filePopup,"&File") + +/* ------------------------------------------------------------------------- */ +::method InitDialog +/* ------------------------------------------------------------------------- */ +expose el b1 b2 menuBar + + menuBar~attachTo(self) + + b1 = self~newPushButton(11) + b2 = self~newPushButton(12) + el = self~newEdit(10) + + d = .Directory~new~~weight(700) + el~~setcolor(0,13)~~setFont(self~createFontEx('Lucida Console',18,d),1) + +return InitDlgRet + +/* ------------------------------------------------------------------------- */ +::Method ButtonPress UnGuarded +/* Pressing either button runs this method */ +/* ------------------------------------------------------------------------- */ +expose el b1 b2 events state session menuBar + + ----- + REPLY --> -- run asynchronously -v>| + ----- + + action = self~newPushButton(arg(1))~title /* pressed button title */ + + Select + when action='Start' then do + call time 'r' /* RESET the clock */ + session += 1 + events~append(session '0909'x 'Start' '09'x date('s',,,'-') time()) + call SetStateButtonsAndTitle 'Running','Stop','Split','Running' + menuBar~enable(15) + do while State <> 'Stopped' /* Run the stopwatch display */ + if State='Running' | State='Splitting' + then do + ftime=FormatTime(time('e')) + el~~SetTitle(ftime)~~Update + if State='Splitting' + then do + State='Split' + events~append(session '09'x ftime '09'x 'Split') + end /* DO */ + end + call syssleep 0.004 /* dont hog resources */ + end /* DO */ + events~append(session '09'x ftime '09'x 'Stop') + end /* DO */ + when action='Stop' + then call SetStateButtonsAndTitle 'Stopped','Start','Exit','Stopped' + when action='Resume' + then call SetStateButtonsAndTitle 'Running','Stop','Split','Running' + when action='Split' + then call SetStateButtonsAndTitle 'Splitting','Resume','Split','Split Time' + when action='Exit' then do + State='Stopped' /* kill running threads */ + self~OK -- EXIT Dialog ->| + end + otherwise + end /* select */ + +return + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +SetStateButtonsAndTitle: +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + State = arg(1) + b1~SetTitle(arg(2)) + b2~SetTitle(arg(3)) + self~SetTitle('Stopwatch -' session '-' arg(4)) + +return + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +FormatTime: +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +procedure +arg t + parse var t t'.'ms /* take off the ms */ + hh = t % 3600 + t = t // 3600 + mm = t % 60 + ss = t // 60 + +return hh~right(2,'0')||':'||mm~right(2,'0')||':'ss~right(2,'0')||'.'ms~left(2) + +/* ------------------------------------------------------------------------- */ +::Method Cancel UnGuarded /* stop possible running thread on exit */ +/* ------------------------------------------------------------------------- */ + self~state='Stopped' + return self~Cancel:Super -- Leave the dialog -->| +/* ------------------------------------------------------------------------- */ +::method Copy2CB UnGuarded +/* ------------------------------------------------------------------------- */ +expose events + + cb = .WindowsClipboard~new + cb~copy(events~makeString('l',.endofline)) + +/* ========================================================================= */ diff --git a/modules/windows/oodialog/examples/useTools.rex b/modules/windows/oodialog/examples/useTools.rex new file mode 100755 index 0000000..ab8e4b6 --- /dev/null +++ b/modules/windows/oodialog/examples/useTools.rex @@ -0,0 +1,360 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** Owned window example + * + * This example demonstrates how to make a dialog window owned by another dialog + * window. It simulates a tool palette, which is owned by the main dialog. + * + * Windows that are owned by another window have several constraints. The owned + * window is always above its owner window. If the owner window is minimized, + * the owned window is hidden. When the owner window is destroyed, its owned + * windows are also destroyed. + * + * The programmer creates an owned window by setting its ownerDialog attribute + * to the owner window. Once set, the owner window can not be changed. The + * ownerDialog attribute can not be set once the Windows dialog of the owned + * windows has been created. The underlying Windows dialog of the owner window + * must be created before the underlying Windows dialog of the owned window is + * created. However, the owner Windows dialog does not have to be created yet + * when it is assigned to the owned window. + * + * The owned dialog always behaves as if it were executed using the popupAsChild + * method. That is, it is a modeless dialog that operates indepenedently of its + * owner dialog and it is destroyed when its owner (parent) dialog is destroyed. + * But, the programmer does not have to use the popupAsChild method to execute + * the owned dialog, the programmer can use any of the methods that start the + * underlying Windows dialog. + */ + + srcDir = locate() + + .application~useGlobalConstDir("O", srcDir"resources\useTools.h") + + dlg = .MainDialog~new + + dlgTool = .ToolPaletteDlg~new(srcDir) + dlgTool~ownerDialog = dlg + + -- Start the main dialog asynchronously so we continue and then can start the + -- tool palette. + dlg~executeAsync("SHOWTOP", IDI_DLG_OOREXX) + + -- Start the tool palette now. It can not be started until its owner dialog + -- has been started. + dlgTool~popup("SHOWTOP") + + -- End async execution which will not return until the main dialog closes. + dlg~endAsyncExecution + + +::requires "ooDialog.cls" + +::class 'MainDialog' subclass UserDialog + +::method init + forward class (super) continue + + self~create(30, 30, 466, 323, "Main Dialog", "CENTER MINIMIZEBOX MAXIMIZEBOX") + +::method defineDialog + + self~createStaticText(IDC_ST_TOOL_SIMULATOR, 50, 50, 366, 223, "CENTER", "") + self~createPushButton(IDC_PB_SHOW_PALETTE, 20, 299, 50, 14, "HIDDEN", "Show Palette", onShowPalette) + self~createPushButton(IDOK, 342, 299, 50, 14, "DEFAULT", "Ok") + self~createPushButton(IDCANCEL, 397, 299, 50, 14, , "Cancel") + +::method initDialog + expose font toolText + + d = .directory~new + d~weight = 700 + d~quality = 2 + font = self~createFontEx("Arial", 40, d) + + toolText = self~newStatic(IDC_ST_TOOL_SIMULATOR) + toolText~setFont(font) + + +-- The event handling method for the Show Palette button click. We hide the +-- button and execute a new tool palette dialog. The button is always hidden +-- while a tool palette dialog is executing and is only visible when the user +-- has closed the currently executing tool palette dialog. +::method onShowPalette unguarded + expose dlgTool + + self~paletteButton(.false) + + dlgTool = .ToolPaletteDlg~new( , "resources\useTools.h" ) + dlgTool~ownerDialog = self + + dlgTool~popup("SHOWTOP") + + +-- The leaving method is invoked automatically by ooDialog when the underlying +-- Windows dialog is being closed. It can be used to do some final clean up, +-- such as releasing resources. Note that in this program, it is not really +-- necessary to release the created font. As soon as the program ends, the +-- operating system will automatically release the font resource. +::method leaving + expose font + self~deleteFont(font) + + +-- The following methods just display the tool being used to simulate the +-- tool the user selected. A real program would need code to actually use +-- the selected tool. + +::method lockModule + expose toolText + toolText~setText('Running lockModule tool') + +::method lockProject + expose toolText + toolText~setText('Running lockProject tool') + +::method splitModule + expose toolText + toolText~setText('Running splitModule tool') + +::method saveModule + expose toolText + toolText~setText('Running saveModule tool') + +::method saveProject + expose toolText + toolText~setText('Running saveProject tool') + +::method saveAll + expose toolText + toolText~setText('Running saveAll tool') + +::method checkIn + expose toolText + toolText~setText('Running checkIn tool') + +::method linkToWeb + expose toolText + toolText~setText('Running linkToWeb tool') + +::method codeReview + expose toolText + toolText~setText('Running codeReview tool') + +::method update + expose toolText + toolText~setText('Running update tool') + +::method projectReview + expose toolText + toolText~setText('Running projectReview tool') + +-- Invoked by the tool palette dialog when the user presses the close tool +-- button. That is the only way for the user to close the tool palette. Here +-- we set the tool text to the empty string and then make the Show Palette +-- button visible. This allows the user to click on the button and reshow a +-- tool palette. +::method closePalette + expose toolText + + toolText~setText('') + self~paletteButton(.true) + +-- This private method either hides or makes visible the Show Palette button +-- depending on the value of the argument. +::method paletteButton private + use strict arg showButton + + if showButton then self~newPushButton(IDC_PB_SHOW_PALETTE)~show + else self~newPushButton(IDC_PB_SHOW_PALETTE)~hide + + +::class 'ToolPaletteDlg' subclass UserDialog + +::method init + expose s buttonIDs + + forward class (super) continue + + -- Populate the buttonIDs and buttonNames arrays. + self~populateButtons() + + -- The bitmaps are 32 x 32, we want the button to have a 4 pixel margin so + -- that the button high-lighting for hot, pressed, default, etc., shows. + -- Convert the size in pixels to dialog units + s = .Size~new(40, 40) + self~pixel2dlgUnit(s) + count = buttonIDs~items + + -- The last button is the close button. We palace an empty spot the width + -- of a button between the tool buttons and the last button. + count += 1 + + -- Now size the dialog to exactly fit the buttons + self~create(0, 30, count * s~width, s~height, "Tool Palette", "NOMENU") + +::method defineDialog + expose s buttonIDs + + -- Create all our tool buttons and connect their button click event with the + -- onToolClick method in this dialog. + do i = 1 to buttonIDs~items + x = (i - 1) * s~width + if i == buttonIDs~items then x += s~width + self~createPushButton(buttonIDs[i], x, 0, s~width, s~height, 'BITMAP', , onToolClick) + end + + +-- In the initDialog method we create a bitmap Image object from the bitmap +-- files for each button. Then an ImageList for each button is created and +-- assigned to the button. Each image list only has one image in it, so the +-- operating system uses that one image for all the states of the button. +-- +-- Note that when the bitmap image is added to the image list, the image list +-- makes a copy of the image, so we release the image resource in our copy once +-- it is added to the image list. +::method initDialog + expose buttonIDs buttonNames + + tempButton = self~newPushButton(buttonIDs[1]) + + size = tempButton~getRealSize + size~width -= size~width - 32 + size~height -= size~height - 32 + + flags = 'COLOR24 MASK' + type = 'BITMAP' + cRef = .Image~colorRef(0, 0, 0) + + align = 'CENTER' + margin = .Rect~new(4) + + do i = 1 to buttonIDs~items + bmpButton = self~newPushButton(buttonIDs[i]) + + image = .Image~getImage(buttonNames[i], type) + imageList = .ImageList~create(size, flags, 1, 0) + imageList~addMasked(image, cRef) + + bmpButton~setImageList(imageList, margin, align) + image~release + end + + +-- The leaving method is called automatically by the ooDialog framework when the +-- underlying Windows dialog is closing. The leaving method is a good place to +-- do any final clean up. We use it here to release the operating system +-- resouces used by the image lists. +-- +-- Note this. For some controls like the list-view control, Microsoft's +-- documentation explicityly states that the list-view control will release +-- the image list resources. However, for the button control, the documentation +-- does not say one way or the other. +::method leaving unguarded + expose buttonIDs + + do id over buttonIDs + btn = self~newPushButton(id) + btn~getImageList~release + end + +-- The event handler for the button click event. We map which button was +-- clicked to the proper method in the parent / owner dialog and invoke that +-- method +::method onToolClick unguarded + use arg id, hwnd + + select + when id == self~constdir[IDC_PB_LOCKMODULE ] then self~ownerDialog~lockModule + when id == self~constdir[IDC_PB_LOCKPROJECT ] then self~ownerDialog~lockProject + when id == self~constdir[IDC_PB_SPLITMODULE ] then self~ownerDialog~splitModule + when id == self~constdir[IDC_PB_SAVEMODULE ] then self~ownerDialog~saveModule + when id == self~constdir[IDC_PB_SAVEPROJECT ] then self~ownerDialog~saveProject + when id == self~constdir[IDC_PB_SAVEALL ] then self~ownerDialog~saveAll + when id == self~constdir[IDC_PB_CHECKIN ] then self~ownerDialog~checkIn + when id == self~constdir[IDC_PB_LINKTOWEB ] then self~ownerDialog~linkToWeb + when id == self~constdir[IDC_PB_CODEREVIEW ] then self~ownerDialog~codeReview + when id == self~constdir[IDC_PB_UPDATE ] then self~ownerDialog~update + when id == self~constdir[IDC_PB_PROJECTREVIEW] then self~ownerDialog~projectReview + when id == self~constdir[IDC_PB_CLOSE ] then do + self~cancel:super + self~ownerDialog~closePalette + end + otherwise nop + end + -- End select + +-- Over-riding the ok and cancel methods, but not doing anything, prevents the +-- user from closing the tool palette unless she uses the close tool button. +::method ok +::method cancel + +-- Private method to fill 2 arrays with the button IDs and the button bitmap +-- names. +::method populateButtons private + expose buttonIDs buttonNames + + srcDir = .application~srcDir + + buttonIDs = .array~of(IDC_PB_LOCKMODULE, - + IDC_PB_LOCKPROJECT, - + IDC_PB_SPLITMODULE, - + IDC_PB_SAVEMODULE, - + IDC_PB_SAVEPROJECT, - + IDC_PB_SAVEALL, - + IDC_PB_CHECKIN, - + IDC_PB_LINKTOWEB, - + IDC_PB_CODEREVIEW, - + IDC_PB_UPDATE, - + IDC_PB_PROJECTREVIEW, - + IDC_PB_CLOSE - + ) + + buttonNames = .array~of(srcDir'resources\LockModule.bmp', - + srcDir'resources\LockProject.bmp', - + srcDir'resources\SplitModule.bmp', - + srcDir'resources\SaveModule.bmp', - + srcDir'resources\SaveProject.bmp', - + srcDir'resources\SaveAll.bmp', - + srcDir'resources\CheckIn.bmp', - + srcDir'resources\LinkToWeb.bmp', - + srcDir'resources\CodeReview.bmp', - + srcDir'resources\Update.bmp', - + srcDir'resources\ProjectReview.bmp', - + srcDir'resources\ClosePalette.bmp' - + ) + diff --git a/modules/windows/oodialog/ftyperex.rex b/modules/windows/oodialog/ftyperex.rex new file mode 100755 index 0000000..08914aa --- /dev/null +++ b/modules/windows/oodialog/ftyperex.rex @@ -0,0 +1,181 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: ftyperex.rex */ +/* Type: ooRexx Script */ +/* */ +/* Description: */ +/* This script reads the registry entries for the Ftype REXXScript OPEN */ +/* type and allows to change it between REXX.EXE and REXXHIDE.EXE. */ +/* */ +/* It uses the WindowsRegistry Class and the UserDialog Class. */ +/* */ +/****************************************************************************/ + + +/* See if user gave directions */ +parse arg Interface + +/* The user may decide between Windowed or ooDialog Version */ +/* Default is ooDialog Version */ +/* If the Ftype Setting is to rexxhide, the WINDOWED Version will NOT work */ +/* Verify if the given parm starts with "W", TRANSLATE changes it to UPPER CASE */ +if Interface~LEFT(1)~TRANSLATE = "C" then Interface = "CONSOLE" +else Interface = "ooDialog" + + +/* create a new registry object */ +r = .WindowsRegistry~new + +/* leave if init failed */ +if r~InitCode \= 0 then do + call errorDialog 'Error open the registry. Program aborted.' + exit +end + +/* Set from default HKEY_LOCAL_MACHINE to HKEY_CLASSES_ROOT */ +r~Current_Key = r~CLASSES_ROOT + +/* Open the Key with Options QUERY and WRITE */ +if r~open(,"REXXScript\Shell\Open\Command","QUERY WRITE") = 0 then do + msg = 'Error opening the registry key with write access' || '0d0a0d0a'x || - + 'If you are on Vista you must run this program with' || '0d0a'x || - + 'elevated privileges to see the expected outcome.' + call ErrorDialog msg + exit +end + +/* Retrieves information about a given key in a compound variable */ +/* q.values holds the number of value entries. */ +q. = r~Query + +/* Retrieves all value entries of a given key into a compound variable */ +if r~ListValues(,vals.) = 0 then do + /* There are 3 possible values for each entry: + vals.i.name the Name of the value + vals.i.data the data of the entry + vals.i.type the type : NORMAL for alphabetic values, + EXPAND for expandable strings such as a path, + NONE for no specified type, + MULTI for multiple strings, + NUMBER for a 4-byte value, and + BINARY for any data format. + */ + /* verify, which is the current entry, TRANSLATE it to UPPER CASE */ + if vals.1.data~TRANSLATE~LASTPOS('REXX.EXE') = 0 then do + if vals.1.data~TRANSLATE~LASTPOS('REXXHIDE.EXE') = 0 then do + call errorDialog 'ftyperex is not prepared to work with this setting:' vals.1.data + end + else do /* remember the current entry */ + was = "rexxhide.exe" + end + end + else do /* remember the current entry */ + was = "rexx.exe" + end +end +else do + call errorDialog 'Error reading the registry. Program aborted.' + exit +end + + +/* Ask user, what to do */ +if Interface = "CONSOLE" then do + /* Test, if rexxhide was set. In this case, show Message Box */ + if was = "rexxhide.exe" then do + call errorDialog "Ftype is curently set to rexxhide.exe. You must use the ooDialog interface." + exit + end + /* The next lines use an plain text interface */ + /* Show the curent content */ + say 'Current Ftype Setting is : ' || vals.1.data + say 'Please enter a number + to set it to :' + say '1 to start it with rexx.exe' + say '2 to start it with rexxhide.exe' + say 'Any other entry to leave without changes' + say + /* Get selection */ + pull answer +end +else do + /* The next lines use an "Single Selection Dialog" as interface to the user */ + sel.1 = "Start it with rexx.exe" + sel.2 = "Start it with rexxhide.exe" + /* Get the current state, to make preselection in the dialog */ + if was = "rexx.exe" then answer = '1' + else if was = "rexxhide.exe" then answer = '2' + + dlg = .SingleSelection~new("Please select what to do","Ftype setting for REXXScript",sel.,answer,,answer) + answer = dlg~execute + /* end of userinteraction */ +end + +/* verify what to do */ +select + when answer = '1' then do + newval = LEFT(vals.1.data,LASTPOS(was,vals.1.data)-1)|| 'rexx.exe" "%1" %*' + end + + when answer = '2' then do + newval = LEFT(vals.1.data,LASTPOS(was,vals.1.data)-1)|| 'rexxhide.exe" "%1" %*' + end + otherwise exit +end + +/* Set the new value */ +/* Sets a named value of a given key */ +/* If name is blank or omitted, the default value is set */ +r~SetValue(r~Current_Key,"",newval,NORMAL) + +/* Forces the system to write the cache buffer of a given key to disk */ +/* If key_handle is omitted, CURRENT_KEY is flushed */ +r~flush(r~Current_Key) + +/* Closes a previously opened key specified by its handle */ +/* Since it can take several seconds before all data is written to disk,*/ +/* FLUSH was used before to empty the cache */ +/* If key_handle is omitted, CURRENT_KEY is closed */ +r~close(r~Current_Key) + +msg = 'The Ftype setting for RexxScript is now:' || '0d0a'x || newval +if interface = "CONSOLE" then say msg +else call InfoDialog msg + +::requires "winsystm.cls" -- required for the registry class +::requires "ooDialog.cls" -- required for the dialog class diff --git a/modules/windows/oodialog/menus/BinaryMenuBar.rex b/modules/windows/oodialog/menus/BinaryMenuBar.rex new file mode 100755 index 0000000..ffa9c7b --- /dev/null +++ b/modules/windows/oodialog/menus/BinaryMenuBar.rex @@ -0,0 +1,141 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Very, very simple example of a BinaryMenuBar. Please use the ooDialog + * reference manual to look up the meaning of the arguments to the methods of + * the menu objects. + */ + + .application~useGlobalConstDir('O') + + .constDir[IDC_STATIC] = 200 + .constDir[IDM_MENUBAR] = 1000 + .constDir[IDM_POP_FILE] = 1200 + .constDir[IDM_MI_LEAVE] = 1201 + .constDir[IDM_MI_TEST_ITEM] = 1202 + .constDir[IDM_MI_CONTEXT] = 1203 + .constDir[IDM_SEPARATOR] = 1204 + .constDir[IDM_POP_HELP] = 1300 + .constDir[IDM_MI_ABOUT] = 1301 + + dlg = .MenuDlg~new + dlg~execute('ShowTop') + +::requires 'ooDialog.cls' + +::class 'MenuDlg' subclass Userdialog + +::method init + forward class (super) continue + + self~createCenter(160, 80, 'Dialog with a menu') + +::method defineDialog + + text = "Choosing the 'Leave' menu item will close the dialog " - + "with 'Cancel', the 'Exit' menu item will close with 'Ok.'" + + self~createStaticText(IDC_STATIC, 10, 10, 140, 60, , text) + + +::method initDialog + expose staticText + + -- A subtle point here. We can either attach automatically, or connect menu + -- items automatically, be we can not do both. If we attach automatically, + -- then the menu bar is empty at this point, so there are no menu items to + -- automatically connect. In this case, we attach automatically, then when + -- the menu bar is populated, we automatically connect all menu items. + menu = .BinaryMenuBar~new(.nil, IDM_MENUBAR, , self) + + subMenu = .PopupMenu~new(IDM_POP_HELP) + subMenu~insertItem(IDM_MI_ABOUT, IDM_MI_ABOUT, "About") + + menu~insertPopup(IDM_POP_HELP, IDM_POP_HELP, subMenu, "Help") + + subMenu = .PopupMenu~new(IDM_POP_FILE) + subMenu~insertItem(IDOK, IDOK, "Exit") + subMenu~insertItem(IDOK, IDM_MI_LEAVE, "Leave") + subMenu~insertItem(IDM_MI_LEAVE, IDM_MI_TEST_ITEM, "Test Item") + subMenu~insertItem(IDM_MI_LEAVE, IDM_MI_CONTEXT, "Context") + subMenu~insertSeparator(IDM_MI_LEAVE, IDM_SEPARATOR) + + menu~insertPopup(IDM_POP_HELP, IDM_POP_FILE, subMenu, "File") + + menu~connectAllCommandEvents + + staticText = self~newStatic(IDC_STATIC) + +::method about + expose staticText + + staticText~setText(self~getMsg("About")) + +::method testItem + expose staticText + + staticText~setText(self~getMsg("Test Item")) + +::method context + expose staticText + + staticText~setText(self~getMsg("Context")) + +::method leave + expose staticText + + -- User will probably not see this blur by, so we sleep for a second. + staticText~setText(self~getMsg("Leave")) + j = SysSleep(1) + + self~cancel:super + +::method getMsg private + use strict arg item + + return "Menu item:".endOfLine~copies(2) || '9'x || item || - + .endOfLine~copies(2) || "was last selected." + + +-- We over-ride the cancel method and do nothing so that the user can only +-- close the dialog through the menu. +::method cancel unguarded + expose staticText + + msg = "You must use the 'Leave' or 'Exit' menu items to close the dialog." + staticText~setText(msg) diff --git a/modules/windows/oodialog/menus/ContextMenu.h b/modules/windows/oodialog/menus/ContextMenu.h new file mode 100644 index 0000000..a957fc0 --- /dev/null +++ b/modules/windows/oodialog/menus/ContextMenu.h @@ -0,0 +1,58 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#define IDD_CONTEXT 1000 +#define IDC_LV 1003 +#define IDC_ST_MSG 1004 + +#define IDM_RC_DLG 10000 +#define IDM_RC_SHOW 40000 +#define IDM_RC_ENABLE_LV 40005 +#define IDM_RC_DISABLE_LV 40001 +#define IDM_RC_BEEP 40002 +#define IDM_RC_QUIT 40003 + +#define IDM_LV_BAR 20000 +#define IDM_LV_SORT 20001 +#define IDM_LV_JUMBLE 20002 +#define IDM_LV_REVERSE 20003 +#define IDM_LV_SEP1 20004 +#define IDM_LV_SEP2 20005 +#define IDM_LV_FNAME 20006 +#define IDM_LV_LNAME 20007 +#define IDM_LV_PROFESSION 20008 +#define IDM_LV_RESTORE 20009 diff --git a/modules/windows/oodialog/menus/ContextMenu.rc b/modules/windows/oodialog/menus/ContextMenu.rc new file mode 100644 index 0000000..eb30edb --- /dev/null +++ b/modules/windows/oodialog/menus/ContextMenu.rc @@ -0,0 +1,68 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#include "ContextMenu.h" +#include +#include +#include + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +IDM_RC_DLG MENU +BEGIN + POPUP "Sample" + BEGIN + MENUITEM "Show Message", IDM_RC_SHOW + MENUITEM SEPARATOR + MENUITEM "Disable List View", IDM_RC_DISABLE_LV + MENUITEM "Enable List View", IDM_RC_ENABLE_LV + MENUITEM SEPARATOR + MENUITEM "Beep", IDM_RC_BEEP + MENUITEM "Quit", IDM_RC_QUIT + END +END + + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +IDD_CONTEXT DIALOGEX 0, 0, 293, 148 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_FIXEDSYS | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU +CAPTION "Example Context Menus" +FONT 8, "Ms Shell Dlg 2", 400, 0, 1 +BEGIN + CONTROL "", IDC_LV, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SINGLESEL | LVS_REPORT, 10, 10, 175, 93 + CTEXT "Right click on list view or right click on any other dialog area", IDC_ST_MSG, 10, 118, 156, 20 + DEFPUSHBUTTON "OK", IDOK, 178, 124, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 233, 124, 50, 14 +END diff --git a/modules/windows/oodialog/menus/ContextMenu.rex b/modules/windows/oodialog/menus/ContextMenu.rex new file mode 100755 index 0000000..6f79452 --- /dev/null +++ b/modules/windows/oodialog/menus/ContextMenu.rex @@ -0,0 +1,726 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* A demonstration of some of the Menu features in ooDialog. + * + * This example focuses on context menus. Two different context menus are used + * in this example, showing 2 different ways to create the context menus. One + * of the context menus is shown when the user right-clicks on the list view + * control. The other context menu is shown when the user right-clicks on any + * other place on the dialog. The first menu is specific to the list view, the + * other menu is specific to the dialog. + * + * The list view menu is created by loading a menu from a resource script file. + * Menus created from a resouce script are always menu bars. In this example, + * the menu bar is *not* attached to the dialog, rather it is simply used as the + * source of the list view context menu. + * + * The second context menu is created dynamically using methods of the PopupMenu + * class. + */ + + -- Locate the directory our source code is in. Then this program can be + -- executed from anywhere. It will work if the program is dragged and dropped + -- on ooDialog.exe for instance. + srcDir = locate() + + -- When using symbolic IDs with menus, as this program does, the programmer + -- *must* use the global constant directory, (.constDir,) rather than the + -- constDir attribute of a dialog. Menus are independent of dialogs. + -- + -- The use of the global constant directory is controlled by the .Application + -- object. The .Application object is also used to set other application-wide + -- defaults or values. In this program, we also want to make the default for + -- automatic data detection to be off. Both of these requirements can be done + -- with one method call to the .Application object. As a convenience, the + -- setDefaults() method will also populate the .constDir with symbols. + -- + -- In this invokcation, the application is set to use the .constDir only, "O", + -- symbols are loaded into the .constDir from the file: ContextMenu.h, and the + -- default for automatic data detection is set to off (.false.) Note that we + -- create a complete path name for ContextMenu.h + .application~setDefaults("O", srcDir'ContextMenu.h', .false) + + -- The folloing demonstrates that menu objects are distinct from dialogs. + -- + -- You can create a menu completely indepedent of a dialog. Note that at this + -- point in the program, there is no dialog object at all. Once created, the + -- menu object can then be used where ever it is convenient. + -- + -- The code for creating the list view menu is put in a separate function so + -- that people can focus on only one thing at a time. The function is at the + -- end of this file. In createListViewMenu(), the context menu is created + -- dynamically and passed back to us. + contextMenu = createListViewMenu() + + -- Create a RcDialog as normally done. + dlg = .ContextMenuDlg~new(srcDir"ContextMenu.rc", IDD_CONTEXT) + + -- putMenu() is a method added to our dialog class. It is used to pass the + -- context menu object to the dialog. There are any number of ways to + -- accomplish this. For instance the menu object could have been passed in + -- as an argument to new() above. + dlg~putMenu(contextMenu) + + -- Excute the dialog as usual. + if dlg~initCode = 0 then do + dlg~execute("SHOWTOP") + end + else do + say 'Error creating the context menu dialog initCode:' dlg~initCode + return 99 + end + +return 0 +-- End of entry point. + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" + +::class 'ContextMenuDlg' subclass RcDialog + +/** init() + * + * The init() method is invoked for every object instantiation. This is part of + * ooRexx and has nothing to do with ooDialog, except for this: + * + * ooDialog programming is primarily based on subclassing the dialog classes + * provided by the ooDialog framework. If you over-ride the init() method, you + * *must* initialize the base class, with the proper arguments for the base + * class, before you invoke any methods of the base class. + * + * Here with create the second context menu and create some arrays that contain + * the list view items. Both of these tasks do not need to be done in this + * method, they could be done elsewhere. + */ +::method init + expose dlgPopup + use arg rcScript, dlgID + forward class (super) continue + + -- A menu bar can be loaded from a resource script file using the + -- .ScriptMenuBar class. + -- + -- The first argument to init(), rcScript, is the .rc file that contains the + -- dialog template. That .rc file also contains the menu template for the + -- dialog context menu. In the new method of the .ScriptMenuBar the .rc file + -- is parsed and the menu with symbolic resource id of: IDM_RC_DLG is loaded + -- into memory. + menuBar = .ScriptMenuBar~new(rcScript, IDM_RC_DLG) + + -- If an error occurs in a menu object initialization, then a condition is + -- always raised. menuBar will never be 0 + if menuBar == 0 then do + -- This code will never execute because if the menu bar was not created, a + -- condition was raised. + say 'ERROR: menubar shold be good, not 0.' + say 'A condition should have been raised.' + say 'SystemErrorCode:' .SystemErrorCode SysGetErrortext(.SystemErrorCode) + self~initCode = 1 + return + end + + -- A menu bar is made up of a number of pop up menus. You can get one of + -- those pop up menus by specifying either its resource ID or its position. + -- + -- In this program, the menu bar itself is not used. It contains only 1 pop + -- up menu, which is used as a context menu in this program. Which pop up + -- menu to get is specified either by its resource ID or by its position in + -- the menu. Here, we get it by its position, which is 1. Since both a + -- resource ID and a position are numbers, we need to denote whether we are + -- getting the menu by position or by resource ID. The second argument is the + -- 'byPosition' argument. If true, the first arugment is a position. If + -- false, the first argument is a resource ID. The default is .false. + dlgPopup = menubar~getPopup(1, .true) + + -- Start with the menu item to enable the list view greyed out. + dlgPopup~disable(IDM_RC_ENABLE_LV) + + -- Create an array of items for the list view control. This could be done in + -- initDialog(), or anywhere convenient. + self~createArrays() + +/** initDialog() + * + * initDialog() is invoked automatically by the dialog framework as soon as the + * underlying Windows dialog is created. This is the place to do any + * initialization of the dialog controls, initialization that requires the + * underlying dialog or dialog control to exist. + * + * We would not necessarily need to make the menu connections here. However, + * as you will see in makeMenuConnections() method, we are using the window + * handles of the dialog and the list view to filter the context menu + * notifications. This does require that the underlying dialog and controls do + * exist. + */ +::method initDialog + + self~makeMenuConnections + self~initListView + + +/** makeMenuConnections() + * + * Connects the menu related events to event handling methods in this dialog. + * + * There are 2 types of connections made here. + * + * 1.) The context menu event is connected. The context menu event is generated + * when ever the user right clicks on the dialog, types the shift-F10 keyboard + * combination, or the VK_APPS key (Natural keyboard.) The context menu event + * needs to be connected to a method that shows the context menu. + * + * 2.) The menu item command events are connected. A menu item command event is + * generated when the user selects a menu item. + */ +::method makeMenuConnections private + expose lvPopup dlgPopup + + -- Connect a click on a menu item in the short cut menus to this dialog. + -- + -- For the dialog popup menu, we connect all menu items to the same method, + -- onMenuCommand(). onMenuCommand() will recieve the resource ID of the menu + -- item selected, and we use that to decide what action to take. + if \ dlgPopup~connectAllCommandEvents(onMenuCommand, self) then do + say 'Error conecting menu items. SystemErrorCode:' || - + .SystemErrorCode SysGetErrortext(.SystemErrorCode) + end + + -- To understand this explanation, note this point: although menu objects are + -- independent of dialog objects, at the time a menu is shown, the operating + -- system requires that the underlying menu be assigned to an underlying + -- dialog. For menu bars, the assigned dialog is the dialog the menu bar is + -- attached to. For pop up menus, the menu could be assigned to a dialog each + -- time the context menu is shown. But, it is usually more convenient to just + -- assign the menu to a dialog one time. That is what the assignTo() method + -- does. + -- + -- For the list view pop up menu, we connect each menu item to its own method. + -- There are menu methods to connect individual menu items. But there are + -- also a number of convenience methods to connect a number of menu items at + -- one time. + -- + -- The second optional arguement in assignTo() turns on automatic menu item + -- connection. The default is off. The third optional argument is the name + -- of a method to connect all the items to. So, you can either connect each + -- menu item to its own method, (omit the third argument,) or you can connect + -- all menu items to one method. When each menu item is connected to its own + -- method, the method name is constructed by the ooDialog framework using the + -- text of the menu item. + -- + -- For example, if the menu item text is 'Blow your own horn' then the method + -- name will be blowYourOwnHorn(). + -- + -- This is what we do here, assign the list view menu to this dialog, and at + -- the same time connect all the menu item comand events to an individual + -- method. + if \ lvPopup~assignTo(self, .true) then do + say 'Error conecting menu items. SystemErrorCode:' || - + .SystemErrorCode SysGetErrortext(.SystemErrorCode) + end + say + + -- Next we connect the context menu message (right mouse click) with two + -- methods. If you supply a window handle as the second, optional, parameter, + -- then the event notifications are filtered by that window handle. In this + -- way you can easily show a context menu specific to a certain control. If + -- you do not use a window handle to filter the event notifications, you can + -- still do the same thing, you just need to determine the mouse position at + -- the time of the event and relate that position to the context menu you + -- want to show + -- + -- Here we send all right-clicks on the list-view control to one method and + -- all clicks on the dialog to a second method. + if \ lvPopup~connectContextMenu(onListViewContext, self~newListView(IDC_LV)~hwnd) then do + say 'Error conecting context menu. SystemErrorCode:' || - + .SystemErrorCode SysGetErrortext(.SystemErrorCode) + end + + -- If we only use the first connectContextMenu(), then right clicks on the Ok + -- and cancel buttons are ignored. The shift-F10 and VK_APPS events are + -- also ignored when either of the buttons has the focus. + -- + -- That's perfectly fine, but it depends on what you want. Here, we pretend + -- that we don't want that behavior, and show how to prevent it. Simply add + -- filtered connections for the Ok and Cancel push buttons. + -- + -- You can play with this to see it works. Comment out the third and forth + -- connections and then tab to the Ok or Cancel key and use Shift-F10. There + -- will be no context menu. Or right click on one of those buttons, no + -- context menu. Uncomment the connections and try the same thing. + if \ dlgPopup~connectContextMenu(onDialogContext, self~hwnd, self) then do + say 'Error conecting context menu. SystemErrorCode:' || - + .SystemErrorCode SysGetErrortext(.SystemErrorCode) + end + else if \ dlgPopup~connectContextMenu(onDialogContext, self~newPushButton(IDOK)~hwnd, self) then do + say 'Error conecting context menu. SystemErrorCode:' || - + .SystemErrorCode SysGetErrortext(.SystemErrorCode) + end + else if \ dlgPopup~connectContextMenu(onDialogContext, self~newPushButton(IDCANCEL)~hwnd, self) then do + say 'Error conecting context menu. SystemErrorCode:' || - + .SystemErrorCode SysGetErrortext(.SystemErrorCode) + end + + +/** onListViewContext() + * + * This is an event handler for the context menu event. + * + * The context menu event is generated when the user right-clicks the mouse, + * types the shift-F10 key combination, or types the VK_APPS key. In this + * program, onListViewContext() is only generated when the mouse is right + * clicked on the list view control, or if the list view has the input focus and + * shift-F10 or VK_APPS are used. + * + * Look at the makeMenuConnections() method to see how the connection is made. + * + * Three arguments are passed to the event handler for the context menu event: + * the window handle of the window clicked, (or that has the focus if it is a + * keyboard event,) and x / y co-ordinates. For a mouse click, the x / y co- + * ordinates are the position of the mouse, in pixels. For the keyboard keys, x + * and y are both -1. + * + * When the x and y arguments are -1, we need to decide where to place the + * context menu when it is shown. This is a design decision, there is no real + * right answer. A normal thing to do here would be to place it at the selected + * list view item. Instead, I decided to place at the lower right corner of the + * list view. However, the list view has a vertical scroll bar which is within + * the area of the list view and I didn't like the look of that. + * + * So, I decided to move it to the left of the scroll bar. I still didn't like + * that because of the shadowing, so I take that point and shift it up and over + * 15 pixels. + */ +::method onListViewContext + expose lvPopup listView + use arg hwnd, x, y + + if x == -1, y == -1 then do + -- The keyboard was used, not the mouse. Position the context menu as + -- described in the comments above. + rect = listView~windowRect + x = rect~right - .SM~cxVScroll + 15 + y = rect~bottom - 15 + end + + -- pos is the point on the screen, in pixels, to place the context menu. + pos = .Point~new(x, y) + + -- We show the menu. The second optional argument is the dialog to assign the + -- the menu to, but we've already done that in makeMenuConnections(). + ret = lvPopup~show(pos) + if ret == -1 then do + say 'lvPopup~show() failed SystemErrorCode:' || - + .SystemErrorCode SysGetErrortext(.SystemErrorCode) + end + + +/** onDialogContext() + * + * This is an event handler for the context menu event. + * + * The comments for onListViewContext() above apply here. This method is + * invoked when the user rigth clicks anywhere but the list-view, or for the + * keyboard context menu event, whenever the list view does not have the focus. + * + * Here we also need to decide where to position the context menu for the + * keyboard event. I decided to place it in the rectangluar space between the + * rigth edge of the list view and the right edge of the dialog, in the center. + * I don't count the dialog caption bar as part of that space. + */ +::method onDialogContext + expose dlgPopup listView + use arg hwnd, x, y + + if x == -1, y == -1 then do + -- The keyboard was used, not the mouse. Position the context menu as + -- described in the comments above. + lvR = listView~windowRect + dlgR = self~windowRect + + xOffset = (dlgR~right - lvR~right) % 2 + yOffset = (dlgR~bottom - (dlgR~top + .SM~cyCaption)) % 2 + + x = lvR~right + xOffset + y = dlgR~bottom - yOffset + end + + -- This is the point where the context menu is positioned. + pos = .Point~new(x, y) + + -- In contrast to the list view pop up menu, the dialog pop up menu has never + -- been assigned to a dialog. Therefore, each time we show it, we need to + -- specify the dialog owner. Which is done in the second arguemnt. + ret = dlgPopup~show(pos, self) + if ret == -1 then do + say 'dlgPopup~show() failed SystemErrorCode:' || - + .SystemErrorCode SysGetErrortext(.SystemErrorCode) + end + +/** onMenuCommand() + * + * This is the event handler for any menu item selected in the dialog pop up + * menu. We simply determine which menu item was selected through the id + * argument and take the appropriate action. + */ +::method onMenuCommand unguarded + use arg id + + select + when id == .constDir[IDM_RC_SHOW ] then self~showMessage + when id == .constDir[IDM_RC_ENABLE_LV ] then self~enableListView(.true) + when id == .constDir[IDM_RC_DISABLE_LV] then self~enableListView(.false) + when id == .constDir[IDM_RC_BEEP ] then beep(330, 250) + when id == .constDir[IDM_RC_QUIT ] then return self~ok + end + -- End select + + +/** sort() + * + * The event handler when the Sort menu item is selected in the list view pop up + * menu. + */ +::method sort + expose sArray + self~rearrangeItems(sArray) + +/** jumble() + * + * The event handler when the Jumble menu item is selected in the list view pop + * up menu. + * + * Here we re-order the list view items in a somewhat random order. + */ +::method jumble + expose nArray + + tempArray = .array~new(11) + + indexes = .set~new + do while indexes~items < 11 + count = indexes~items + do while indexes~items == count + i = random(1, 11) + if \ indexes~hasItem(i) then do + tempArray~append(nArray[i]) + indexes~put(i) + end + end + end + + self~rearrangeItems(tempArray) + +/** reverseSort() + * + * The event handler when the Reverse Sort menu item is selected in the list + * view pop up menu. + */ +::method reverseSort + expose rsArray + self~rearrangeItems(rsArray) + +/** orderByFirstName() + * + * The event handler when the Order By First Name menu item is selected in the + * list view pop up menu. + */ +::method orderByFirstName + expose fnArray + self~rearrangeItems(fnArray) + +/** orderByLastName() + * + * The event handler when the Order By Last Name menu item is selected in the + * list view pop up menu. + */ +::method orderByLastName + expose lnArray + self~rearrangeItems(lnArray) + +/** orderByProfession() + * + * The event handler when the Order By Profession menu item is selected in the + * list view pop up menu. + */ +::method orderByProfession + expose profArray + self~rearrangeItems(profArray) + +/** restoreOriginalOrder() + * + * The event handler when the Restore Original Order menu item is selected in + * the list view pop up menu. + */ +::method restoreOriginalOrder + expose nArray + self~rearrangeItems(nArray) + +/** rearrangeItems() + * + * Places the list view items in the order specified. As explained elsewhere, + * the purpose of this example program is to show how context menus work, not + * to show how list view controls work. + * + * Therefore we don't actually sort the list view items, we just use some pre- + * ordered arrays of the items. To change the order, we delete all the existing + * items and replace them using the an array of the same items in a different + * order. The array is passed in here as the 'a' argument. + * + * The disable, delete, prepare ... enable redraw sequence seems, to me, to + * reduce flicker in the list view. However, there are not enough items in the + * list view to tell for sure. An interesting experiment would be to try it + * with several hundreds of items. + */ +::method rearrangeItems private + expose listView + use strict arg a + + listView~disable + listView~deleteAll + listView~prepare4nItems(11) + + do r over a + listView~addRow( , , r~fName, r~lName, r~profession) + end + + listView~enable + listView~redrawItems + + +/** showMessage() + * + * Helper method. Shows a simple message to the user in response to the Show + * Message menu item. + */ +::method showMessage private + + msg = "This is a good example of context menus." + z = MessageDialog(msg, self~hwnd, "Context Menu Message", "OK", "INFORMATION") + +/** enableListView() + * + * Helper method. Enables or disables the list view control in response to the + * Enable List View or Disable List View menu items. + * + * When the list view control is enabled, we disable the Enable List View menu + * item and enable the Disable List View menu item. When the list view is + * disabled we do the reverse. Note that when the list view is disabled, it is + * no longer possible for the user to trigger the list view context menu. + */ +::method enableListView private + expose listView dlgPopup + use strict arg enable + + if enable then do + dlgPopup~disable(IDM_RC_ENABLE_LV) + dlgPopup~enable(IDM_RC_DISABLE_LV) + listView~enable + end + else do + dlgPopup~disable(IDM_RC_DISABLE_LV) + dlgPopup~enable(IDM_RC_ENABLE_LV) + listView~disable + end + +/** initListView() + * + * Initializes the list view by adding the columns, setting the extended list + * view style, and adding the list view items. + */ +::method initListView private + expose nArray listView + + listView = self~newListView(IDC_LV) + + listView~addExtendedStyle("FULLROWSELECT DOUBLEBUFFER GRIDLINES") + + listView~insertColumnPX(1, 'First Name', 68) + listView~insertColumnPX(2, 'Last Name', 70) + listView~insertColumnPX(3, 'Profession', 102) + + do r over nArray + listView~addRow( , , r~fName, r~lName, r~profession) + end + +/** createArrays() + * + * The purpose of this example program is to demonstrate how context menus work, + * not how list view controls work. Rather than actually sort the list view + * items, we just produce some pre-sorted arrays to use. + * + * The n, ln, fn, etc., prefixes stand for normal, first name, last name, + * profession, sorted, and reverse sorted. + */ +::method createArrays private + expose nArray lnArray fnArray profArray sArray rsArray + + nArray = .array~new(11) + lnArray = .array~new(11) + fnArray = .array~new(11) + profArray = .array~new(11) + sArray = .array~new(11) + rsArray = .array~new(11) + + nArray[1 ] = .directory~new~~put('Mark', fName)~~put('Thompson', lName)~~put('Mechanic', profession) + nArray[2 ] = .directory~new~~put('Sue', fName)~~put('Lamont', lName)~~put('Nurse', profession) + nArray[3 ] = .directory~new~~put('Mary', fName)~~put('Greensmith', lName)~~put('CEO', profession) + nArray[4 ] = .directory~new~~put('Susan', fName)~~put('Dunn', lName)~~put('Stock broker', profession) + nArray[5 ] = .directory~new~~put('Hank', fName)~~put('Miller', lName)~~put('Librarian', profession) + nArray[6 ] = .directory~new~~put('Larry', fName)~~put('Williams', lName)~~put('Doctor', profession) + nArray[7 ] = .directory~new~~put('Alice', fName)~~put('Toklas', lName)~~put('Dentist', profession) + nArray[8 ] = .directory~new~~put('Bill', fName)~~put('Maher', lName)~~put('Lawyer', profession) + nArray[9 ] = .directory~new~~put('Vail', fName)~~put('Miesfeld', lName)~~put('Software Engineer', profession) + nArray[10] = .directory~new~~put('Eric', fName)~~put('Clapton', lName)~~put('Cook', profession) + nArray[11] = .directory~new~~put('Christin', fName)~~put('Henesy', lName)~~put('Detective', profession) + + lnArray[1 ] = .directory~new~~put('Eric', fName)~~put('Clapton', lName)~~put('Cook', profession) + lnArray[2 ] = .directory~new~~put('Susan', fName)~~put('Dunn', lName)~~put('Stock broker', profession) + lnArray[3 ] = .directory~new~~put('Mary', fName)~~put('Greensmith', lName)~~put('CEO', profession) + lnArray[4 ] = .directory~new~~put('Christin', fName)~~put('Henesy', lName)~~put('Detective', profession) + lnArray[5 ] = .directory~new~~put('Sue', fName)~~put('Lamont', lName)~~put('Nurse', profession) + lnArray[6 ] = .directory~new~~put('Bill', fName)~~put('Maher', lName)~~put('Lawyer', profession) + lnArray[7 ] = .directory~new~~put('Vail', fName)~~put('Miesfeld', lName)~~put('Software Engineer', profession) + lnArray[8 ] = .directory~new~~put('Hank', fName)~~put('Miller', lName)~~put('Librarian', profession) + lnArray[9 ] = .directory~new~~put('Mark', fName)~~put('Thompson', lName)~~put('Mechanic', profession) + lnArray[10] = .directory~new~~put('Alice', fName)~~put('Toklas', lName)~~put('Dentist', profession) + lnArray[11] = .directory~new~~put('Larry', fName)~~put('Williams', lName)~~put('Doctor', profession) + + fnArray[1 ] = .directory~new~~put('Alice', fName)~~put('Toklas', lName)~~put('Dentist', profession) + fnArray[2 ] = .directory~new~~put('Bill', fName)~~put('Maher', lName)~~put('Lawyer', profession) + fnArray[3 ] = .directory~new~~put('Christin', fName)~~put('Henesy', lName)~~put('Detective', profession) + fnArray[4 ] = .directory~new~~put('Eric', fName)~~put('Clapton', lName)~~put('Cook', profession) + fnArray[5 ] = .directory~new~~put('Hank', fName)~~put('Miller', lName)~~put('Librarian', profession) + fnArray[6 ] = .directory~new~~put('Larry', fName)~~put('Williams', lName)~~put('Doctor', profession) + fnArray[7 ] = .directory~new~~put('Mark', fName)~~put('Thompson', lName)~~put('Mechanic', profession) + fnArray[8 ] = .directory~new~~put('Mary', fName)~~put('Greensmith', lName)~~put('CEO', profession) + fnArray[9 ] = .directory~new~~put('Sue', fName)~~put('Lamont', lName)~~put('Nurse', profession) + fnArray[10] = .directory~new~~put('Susan', fName)~~put('Dunn', lName)~~put('Stock broker', profession) + fnArray[11] = .directory~new~~put('Vail', fName)~~put('Miesfeld', lName)~~put('Software Engineer', profession) + + profArray[1 ] = .directory~new~~put('Mary', fName)~~put('Greensmith', lName)~~put('CEO', profession) + profArray[2 ] = .directory~new~~put('Eric', fName)~~put('Clapton', lName)~~put('Cook', profession) + profArray[3 ] = .directory~new~~put('Alice', fName)~~put('Toklas', lName)~~put('Dentist', rprofession) + profArray[4 ] = .directory~new~~put('Christin', fName)~~put('Henesy', lName)~~put('Detective', profession) + profArray[5 ] = .directory~new~~put('Larry', fName)~~put('Williams', lName)~~put('Doctor', profession) + profArray[6 ] = .directory~new~~put('Bill', fName)~~put('Maher', lName)~~put('Lawyer', profession) + profArray[7 ] = .directory~new~~put('Hank', fName)~~put('Miller', lName)~~put('Librarian', profession) + profArray[8 ] = .directory~new~~put('Mark', fName)~~put('Thompson', lName)~~put('Mechanic', profession) + profArray[9 ] = .directory~new~~put('Sue', fName)~~put('Lamont', lName)~~put('Nurse', profession) + profArray[10] = .directory~new~~put('Vail', fName)~~put('Miesfeld', lName)~~put('Software Engineer', profession) + profArray[11] = .directory~new~~put('Susan', fName)~~put('Dunn', lName)~~put('Stock broker', profession) + + -- Sorted array is same as fnArray + sArray[1 ] = .directory~new~~put('Alice', fName)~~put('Toklas', lName)~~put('Dentist', profession) + sArray[2 ] = .directory~new~~put('Bill', fName)~~put('Maher', lName)~~put('Lawyer', profession) + sArray[3 ] = .directory~new~~put('Christin', fName)~~put('Henesy', lName)~~put('Detective', profession) + sArray[4 ] = .directory~new~~put('Eric', fName)~~put('Clapton', lName)~~put('Cook', profession) + sArray[5 ] = .directory~new~~put('Hank', fName)~~put('Miller', lName)~~put('Librarian', profession) + sArray[6 ] = .directory~new~~put('Larry', fName)~~put('Williams', lName)~~put('Doctor', profession) + sArray[7 ] = .directory~new~~put('Mark', fName)~~put('Thompson', lName)~~put('Mechanic', profession) + sArray[8 ] = .directory~new~~put('Mary', fName)~~put('Greensmith', lName)~~put('CEO', profession) + sArray[9 ] = .directory~new~~put('Sue', fName)~~put('Lamont', lName)~~put('Nurse', profession) + sArray[10] = .directory~new~~put('Susan', fName)~~put('Dunn', lName)~~put('Stock broker', profession) + sArray[11] = .directory~new~~put('Vail', fName)~~put('Miesfeld', lName)~~put('Software Engineer', profession) + + -- Just reverse the array indexes + rsArray[11] = .directory~new~~put('Alice', fName)~~put('Toklas', lName)~~put('Dentist', profession) + rsArray[10] = .directory~new~~put('Bill', fName)~~put('Maher', lName)~~put('Lawyer', profession) + rsArray[9 ] = .directory~new~~put('Christin', fName)~~put('Henesy', lName)~~put('Detective', profession) + rsArray[8 ] = .directory~new~~put('Eric', fName)~~put('Clapton', lName)~~put('Cook', profession) + rsArray[7 ] = .directory~new~~put('Hank', fName)~~put('Miller', lName)~~put('Librarian', profession) + rsArray[6 ] = .directory~new~~put('Larry', fName)~~put('Williams', lName)~~put('Doctor', profession) + rsArray[5 ] = .directory~new~~put('Mark', fName)~~put('Thompson', lName)~~put('Mechanic', profession) + rsArray[4 ] = .directory~new~~put('Mary', fName)~~put('Greensmith', lName)~~put('CEO', profession) + rsArray[3 ] = .directory~new~~put('Sue', fName)~~put('Lamont', lName)~~put('Nurse', profession) + rsArray[2 ] = .directory~new~~put('Susan', fName)~~put('Dunn', lName)~~put('Stock broker', profession) + rsArray[1 ] = .directory~new~~put('Vail', fName)~~put('Miesfeld', lName)~~put('Software Engineer', profession) + + +-- The putMenu() method simply provides a convenient way to pass in the menu +-- object created in the program entry code to this dialog. +::method putMenu + expose lvPopup + use strict arg lvPopup + + +/** routine::createListViewMenu() + * + * This routine creates the list view context menu dynamically using methods of + * the .PopupMenu. It is very easy to use. Menu items can be inserted or + * removed from a menu at any time. + * + * The other point that is being made by creating this menu in a routine is that + * menu objects are truely independent of a dialog. A menu object can be + * created without any existing dialogs. The object can then be used with any + * dialog. + */ +::routine createListViewMenu + use strict arg + + -- Create a new empty pop up menu. + m = .PopupMenu~new(IDM_LV_BAR) + + -- Insert the menu items. The first argument is the resource ID of the item + -- before which the inserted item goes. The second argument is the resource + -- ID of the item to insert. + -- + -- For the first item, since there are no items in the menu, the insert before + -- argument does not matter. I ususally just use the same resource ID as the + -- item being inserted. You could use any positive number. + -- + -- For the rest of the items, here they are just sort of in a random order. + -- This is to demonstrate how the 'insert before' works. I usually insert the + -- items in a last comes first order because it makes it a little easy to + -- visualize how the menu will look, if you picture the menu upside down. + m~insertItem(IDM_LV_RESTORE, IDM_LV_RESTORE, "Restore Original Order") + m~insertItem(IDM_LV_RESTORE, IDM_LV_PROFESSION, "Order by Profession") + m~insertItem(IDM_LV_PROFESSION, IDM_LV_FNAME, "Order by First Name") + + m~insertItem(IDM_LV_FNAME, IDM_LV_REVERSE, "Reverse Sort") + m~insertItem(IDM_LV_REVERSE, IDM_LV_SORT, "Sort") + m~insertItem(IDM_LV_REVERSE, IDM_LV_JUMBLE, "Jumble") + + m~insertItem(IDM_LV_PROFESSION, IDM_LV_LNAME, "Order by Last Name") + + m~insertSeparator(IDM_LV_FNAME, IDM_LV_SEP1) + m~insertSeparator(IDM_LV_RESTORE, IDM_LV_SEP2) + + return m + diff --git a/modules/windows/oodialog/menus/ScriptMenuBar.h b/modules/windows/oodialog/menus/ScriptMenuBar.h new file mode 100644 index 0000000..0409167 --- /dev/null +++ b/modules/windows/oodialog/menus/ScriptMenuBar.h @@ -0,0 +1,72 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_SCRIPTMENUBAR_DLG 101 +#define IDR_MENU_LV 103 +#define IDD_ABOUT_DIALOG 113 +#define IDC_ST_BITMAP 1000 +#define IDC_LV 1003 +#define IDC_ST_ABOUT 1039 +#define IDM_ADD_ITEMS 40000 +#define IDM_OPEN_LIST_VIEW 40001 +#define IDM_CLOSE_LIST_VIEW 40002 +#define IDM_GRID_LINES 40003 +#define IDM_CHECKBOXES 40004 +#define IDM_NO_CHECKBOXES 40005 +#define IDM_CONTENTS 40006 +#define IDM_INDEX 40007 +#define IDM_SEARCH 40008 +#define IDM_FULL_ROW_SELECT 40009 +#define IDM_ABOUT 40010 +#define IDM_INSERT_ITEM 40011 +#define IDM_DELETE_ITEM 40012 +#define IDM_UNDERLINE_HOT 40013 +#define IDM_EDIT_ITEM 40014 +#define IDM_CAPITALIZE_ITEM 40015 + +#define IDM_POP_FILE 40021 +#define IDM_POP_STYLE 40022 +#define IDM_POP_OPERATIONS 40023 +#define IDM_POP_HELP 40024 +#define IDM_SEP1 40025 +#define IDM_SEP2 40026 +#define IDM_SEP3 40027 + diff --git a/modules/windows/oodialog/menus/ScriptMenuBar.rc b/modules/windows/oodialog/menus/ScriptMenuBar.rc new file mode 100644 index 0000000..eb537e5 --- /dev/null +++ b/modules/windows/oodialog/menus/ScriptMenuBar.rc @@ -0,0 +1,105 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include "ScriptMenuBar.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_MENU_LV MENUEX +{ + POPUP "File", IDM_POP_FILE, 0, 0 + { + MENUITEM "Add Items from File", IDM_ADD_ITEMS, 0, 0 + MENUITEM "Open List-View", IDM_OPEN_LIST_VIEW, 0, MFS_GRAYED | MFS_CHECKED + MENUITEM "Close List-View", IDM_CLOSE_LIST_VIEW, 0, 0 + MENUITEM "", IDM_SEP1, MFT_SEPARATOR, 0 + MENUITEM "Exit", IDOK, 0, 0 + } + POPUP "Style", IDM_POP_STYLE, 0, 0 + { + MENUITEM "Check Boxes", IDM_CHECKBOXES, 0, 0 + MENUITEM "Grid Lines", IDM_GRID_LINES , 0, 0 + MENUITEM "Full Row Select", IDM_FULL_ROW_SELECT, 0, 0 + MENUITEM "Underline When Hot", IDM_UNDERLINE_HOT, 0, 0 + } + POPUP "Operations", IDM_POP_OPERATIONS, 0, 0 + { + MENUITEM "Insert Item", IDM_INSERT_ITEM, 0, 0 + MENUITEM "Delete Item", IDM_DELETE_ITEM, 0, 0 + MENUITEM "", IDM_SEP2, MFT_SEPARATOR, 0 + MENUITEM "Edit Item", IDM_EDIT_ITEM, 0, 0 + MENUITEM "Capitalize Item", IDM_CAPITALIZE_ITEM, 0, 0 + } + POPUP "Help", IDM_POP_HELP, 0, 0 + { + MENUITEM "Contents", IDM_CONTENTS, 0, 0 + MENUITEM "Index ...", IDM_INDEX, 0, 0 + MENUITEM "Search ...", IDM_SEARCH, 0, 0 + MENUITEM "", IDM_SEP3, MFT_SEPARATOR, 0 + MENUITEM "About", IDM_ABOUT, 0, 0 + } +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ABOUT_DIALOG DIALOGEX 0, 0, 231, 121 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "About Script Menu Bar Example" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + CONTROL "", IDC_ST_BITMAP, WC_STATIC, SS_BITMAP | 0x00000040, 16, 7, 102, 71 + CTEXT "An example of using a script menu bar in ooDialog.", IDC_ST_ABOUT, 141, 10, 76, 82, SS_CENTER + LTEXT "ooDialog an ooRexx Extenstion", IDC_STATIC, 16, 96, 107, 15, SS_LEFT + DEFPUSHBUTTON "OK", IDOK, 170, 97, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_SCRIPTMENUBAR_DLG DIALOG 0, 0, 217, 195 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Example Dialog with a ScriptMenuBar" +FONT 8, "Ms Shell Dlg" +{ + LTEXT "Example List-View Control", IDC_STATIC, 15, 12, 92, 12, SS_LEFT + CONTROL "", IDC_LV, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | LVS_REPORT, 10, 29, 197, 117 + DEFPUSHBUTTON "OK", IDOK, 102, 158, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 157, 158, 50, 14 +} diff --git a/modules/windows/oodialog/menus/ScriptMenuBar.rex b/modules/windows/oodialog/menus/ScriptMenuBar.rex new file mode 100755 index 0000000..55adabd --- /dev/null +++ b/modules/windows/oodialog/menus/ScriptMenuBar.rex @@ -0,0 +1,196 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * A simple dialog to demonstrate a .ScriptMenu. + */ + + sd = locate() + .application~useGlobalConstDir("O", sd"ScriptMenuBar.h") + + dlg = .SimpleDialog~new(sd"ScriptMenuBar.rc", IDD_SCRIPTMENUBAR_DLG) + if dlg~initCode <> 0 then do + return 99 + end + + dlg~execute("SHOWTOP") + +return 0 + +::requires "ooDialog.cls" + +::class 'SimpleDialog' subclass RcDialog + +::method initDialog + expose menuBar lv + + sd = .application~srcDir + menuBar = .ScriptMenuBar~new(sd"ScriptMenuBar.rc", IDR_MENU_LV, , , .true, self) + + lv = self~newListView(IDC_LV) + lv~insertColumnPX(0, "First Name", 70) + lv~insertColumnPX(1, "Last Name", 90) + lv~insertColumnPX(2, "Profession", 120) + + lv~addRow( , , "Bill", "Gates", "Philanthropist") + lv~addRow( , , "Steve", "Jobs", "Salesman") + lv~addRow( , , "Ron", "McCarthy", "Plumber") + lv~addRow( , , "Greg", "Allen", "Truck Driver") + +::method addItemsFromFile + self~notImplemented("File -> Add Items") + +::method 'openList-View' + expose lv menuBar + + lv~show + menuBar~check(IDM_OPEN_LIST_VIEW) + menuBar~disable(IDM_OPEN_LIST_VIEW) + + menuBar~unCheck(IDM_CLOSE_LIST_VIEW) + menuBar~enable(IDM_CLOSE_LIST_VIEW) + +::method 'closeList-View' + expose lv menuBar + + lv~hide + menuBar~enable(IDM_OPEN_LIST_VIEW) + menuBar~unCheck(IDM_OPEN_LIST_VIEW) + + menuBar~check(IDM_CLOSE_LIST_VIEW) + menuBar~disable(IDM_CLOSE_LIST_VIEW) + +::method checkBoxes + expose lv menuBar + + if menuBar~isChecked(IDM_CHECKBOXES) then do + lv~removeExtendedStyle("CHECKBOXES") + menuBar~unCheck(IDM_CHECKBOXES) + end + else do + lv~addExtendedStyle("CHECKBOXES") + menuBar~check(IDM_CHECKBOXES) + end + + +::method gridLines + expose lv menuBar + + if menuBar~isChecked(IDM_GRID_LINES) then do + lv~removeExtendedStyle("GRIDLINES") + menuBar~unCheck(IDM_GRID_LINES) + end + else do + lv~addExtendedStyle("GRIDLINES") + menuBar~check(IDM_GRID_LINES) + end + + +::method fullRowSelect + expose lv menuBar + + if menuBar~isChecked(IDM_FULL_ROW_SELECT) then do + lv~removeExtendedStyle("FULLROWSELECT") + menuBar~unCheck(IDM_FULL_ROW_SELECT) + end + else do + lv~addExtendedStyle("FULLROWSELECT") + menuBar~check(IDM_FULL_ROW_SELECT) + end + + +::method underLineWhenHot + expose lv menuBar + + if menuBar~isChecked(IDM_UNDERLINE_HOT) then do + lv~removeExtendedStyle("ONECLICKACTIVATE UNDERLINEHOT") + menuBar~unCheck(IDM_UNDERLINE_HOT) + end + else do + lv~addExtendedStyle("ONECLICKACTIVATE UNDERLINEHOT") + menuBar~check(IDM_UNDERLINE_HOT) + end + +::method insertItem + self~notImplemented("Operartions -> Insert Item") + +::method deleteItem + self~notImplemented("Operartions -> Delete Item") + +::method EditItem + self~notImplemented("Operartions -> Edit Item") + +::method capitalizeItem + self~notImplemented("Operartions -> Capitalize Item") + +::method contents + self~notImplemented("Help -> Contents") + +::method index + self~notImplemented("Help -> Index ...") + +::method search + self~notImplemented("Help -> Search ...") + +::method about unguarded + + dlg = .AboutDialog~new(.application~srcDir"ScriptMenuBar.rc", IDD_ABOUT_DIALOG) + + dlg~execute("SHOWTOP", IDI_DLG_DEFAULT) + + +::method notImplemented private + use strict arg title + + msg = title "has not been implemented yet." + ret = MessageDialog(msg, self~hwnd, title, "OK", "INFORMATION") + + +::class 'AboutDialog' subclass RcDialog + +::method initDialog + expose font + + bitmap = .Image~getImage(.application~srcDir"UserMenuBar.bmp") + self~newStatic(IDC_ST_BITMAP)~setImage(bitmap) + + font = self~createFontEx("Ariel", 14) + self~newStatic(IDC_ST_ABOUT)~setFont(font) + +::method leaving + expose font + self~deleteFont(font) diff --git a/modules/windows/oodialog/menus/UserMenuBar.bmp b/modules/windows/oodialog/menus/UserMenuBar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1503357c4a34cdf413146cf8059e7bbfbf7fd8f0 GIT binary patch literal 57078 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/menus/UserMenuBar.h b/modules/windows/oodialog/menus/UserMenuBar.h new file mode 100644 index 0000000..3ee14cc --- /dev/null +++ b/modules/windows/oodialog/menus/UserMenuBar.h @@ -0,0 +1,111 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_MAIN_DIALOG 101 +#define IDD_INSERT_DIALOG 103 +#define IDD_SELECT_DIALOG 105 +#define IDD_ACCEL_DIALOG 107 +#define IDD_RANGE_DIALOG 109 +#define IDD_POSITION_DIALOG 111 +#define IDD_ABOUT_DIALOG 113 +#define IDC_ST_BITMAP 1000 +#define IDC_ST_CURRENT_TEXT 1001 +#define IDC_EDIT 1002 +#define IDC_ST_EXPLANATION 1003 +#define IDC_UPD_ACCEL2 1004 +#define IDC_ST_UPD 1005 +#define IDC_UPD_POSITION 1006 +#define IDC_EDIT_ACCEL2 1007 +#define IDC_EDIT_BUDDY 1008 +#define IDC_EDIT_POSITION 1009 +#define IDC_ST_EDIT 1010 +#define IDC_UPD_ACCEL_SECONDS1 1011 +#define IDC_UPD 1012 +#define IDC_UPD_LOW 1013 +#define IDC_RB_WICKED 1014 +#define IDC_UPD_ACCEL_SECONDS2 1015 +#define IDC_UPD_START 1016 +#define IDC_EDIT_ACCEL_SECONDS2 1017 +#define IDC_UPD_HIGH 1018 +#define IDC_EDIT_LOW 1019 +#define IDC_UPD_ACCEL3 1020 +#define IDC_EDIT_ACCEL3 1021 +#define IDC_EDIT_HIGH 1022 +#define IDC_RB_LOTUS 1023 +#define IDC_UPD_ACCEL_SECONDS3 1024 +#define IDC_EDIT_ACCEL_SECONDS3 1025 +#define IDC_RB_IDES 1026 +#define IDC_EDIT_START 1027 +#define IDC_RB_TITANIC 1028 +#define IDC_UPD_ACCEL_SECONDS0 1029 +#define IDC_EDIT_END 1030 +#define IDC_EDIT_ACCEL_SECONDS0 1031 +#define IDC_UPD_END 1032 +#define IDC_EDIT_ACCEL0 1033 +#define IDC_UPD_ACCEL1 1034 +#define IDC_EDIT_ACCEL_SECONDS1 1035 +#define IDC_EDIT_ACCEL1 1036 +#define IDC_UPD_ACCEL0 1037 +#define IDC_ST_ABOUT 1039 + + +#define IDM_MENUBAR 800 +#define IDM_POP_FILES 810 +#define ID_FILES_HIDE_EDIT 811 +#define ID_FILES_HIDE_UPDOWN 812 +#define IDM_SEP_FILES 813 +#define ID_FILES_EXIT 814 +#define IDM_POP_EDITCONTROL 820 +#define ID_EDITCONTROL_LOWER 821 +#define ID_EDITCONTROL_NUMBER 822 +#define ID_EDITCONTROL_UPPER 823 +#define ID_EDITCONTROL_UNRESTRICTED 824 +#define IDM_SEP_EDITCONTROL 825 +#define ID_EDITCONTROL_INSERT 826 +#define ID_EDITCONTROL_SELECT 827 +#define IDM_POP_UPDOWNCONTROL 830 +#define ID_UPDOWNCONTROL_HEXIDECIMAL 831 +#define IDM_SEP_UPDOWNCONTROL 832 +#define ID_UPDOWNCONTROL_SET_ACCELERATION 833 +#define ID_UPDOWNCONTROL_SET_RANGE 834 +#define ID_UPDOWNCONTROL_SET_POSITION 835 +#define IDM_POP_HELP 840 +#define ID_HELP_ABOUT 841 diff --git a/modules/windows/oodialog/menus/UserMenuBar.rc b/modules/windows/oodialog/menus/UserMenuBar.rc new file mode 100644 index 0000000..bcdd7e4 --- /dev/null +++ b/modules/windows/oodialog/menus/UserMenuBar.rc @@ -0,0 +1,184 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include "UserMenuBar.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ABOUT_DIALOG DIALOGEX 0, 0, 231, 105 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "About User Menu Bar Example" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + CONTROL "", IDC_ST_BITMAP, WC_STATIC, SS_BITMAP | SS_REALSIZECONTROL, 16, 7, 102, 71 + CTEXT "An example of using a menu bar in ooDialog.", IDC_ST_ABOUT, 141, 10, 76, 56, SS_CENTER + LTEXT "ooDialog an ooRexx Extenstion", IDC_STATIC, 16, 83, 107, 15, SS_LEFT + DEFPUSHBUTTON "OK", IDOK, 170, 84, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ACCEL_DIALOG DIALOGEX 0, 0, 227, 163 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Set Acceleration" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + CTEXT "Example: After 1 second(s) accelerate 2x.", IDC_STATIC, 9, 9, 224, 8, SS_CENTER + LTEXT "After", IDC_STATIC, 15, 38, 16, 8, SS_LEFT + EDITTEXT IDC_EDIT_ACCEL_SECONDS0, 36, 35, 29, 14, ES_RIGHT | ES_AUTOHSCROLL + CONTROL "", IDC_UPD_ACCEL_SECONDS0, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 53, 35, 12, 14 + LTEXT "second(s) accelerate", IDC_STATIC, 73, 38, 67, 8, SS_LEFT + EDITTEXT IDC_EDIT_ACCEL0, 145, 36, 29, 14, ES_RIGHT | ES_AUTOHSCROLL + CONTROL "", IDC_UPD_ACCEL0, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 163, 36, 12, 14 + LTEXT "X.", IDC_STATIC, 178, 38, 8, 8, SS_LEFT + LTEXT "After", IDC_STATIC, 15, 63, 16, 8, SS_LEFT + EDITTEXT IDC_EDIT_ACCEL_SECONDS1, 36, 60, 29, 14, ES_RIGHT | ES_AUTOHSCROLL + CONTROL "", IDC_UPD_ACCEL_SECONDS1, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 53, 60, 12, 14 + LTEXT "second(s) accelerate", IDC_STATIC, 73, 63, 67, 8, SS_LEFT + EDITTEXT IDC_EDIT_ACCEL1, 145, 61, 29, 14, ES_RIGHT | ES_AUTOHSCROLL + CONTROL "", IDC_UPD_ACCEL1, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 163, 61, 12, 14 + LTEXT "X.", IDC_STATIC, 178, 63, 8, 8, SS_LEFT + LTEXT "After", IDC_STATIC, 15, 89, 16, 8, SS_LEFT + EDITTEXT IDC_EDIT_ACCEL_SECONDS2, 36, 86, 29, 14, ES_RIGHT | ES_AUTOHSCROLL + CONTROL "", IDC_UPD_ACCEL_SECONDS2, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 53, 86, 12, 14 + LTEXT "second(s) accelerate", IDC_STATIC, 73, 89, 67, 8, SS_LEFT + EDITTEXT IDC_EDIT_ACCEL2, 145, 87, 29, 14, ES_RIGHT | ES_AUTOHSCROLL + CONTROL "", IDC_UPD_ACCEL2, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 163, 87, 12, 14 + LTEXT "X.", IDC_STATIC, 178, 117, 8, 8, SS_LEFT + LTEXT "After", IDC_STATIC, 15, 117, 16, 8, SS_LEFT + EDITTEXT IDC_EDIT_ACCEL_SECONDS3, 36, 114, 29, 14, ES_RIGHT | ES_AUTOHSCROLL + CONTROL "", IDC_UPD_ACCEL_SECONDS3, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 53, 114, 12, 14 + LTEXT "second(s) accelerate", IDC_STATIC, 73, 117, 67, 8, SS_LEFT + EDITTEXT IDC_EDIT_ACCEL3, 145, 115, 29, 14, ES_RIGHT | ES_AUTOHSCROLL + CONTROL "", IDC_UPD_ACCEL3, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 163, 115, 12, 14 + LTEXT "X.", IDC_STATIC, 178, 89, 8, 8, SS_LEFT + DEFPUSHBUTTON "OK", IDOK, 115, 142, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 170, 142, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_MAIN_DIALOG DIALOG 0, 0, 223, 150 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "User Menu Bar Example" +FONT 8, "Ms Shell Dlg" +{ + RTEXT "Enter text:", IDC_ST_EDIT, 10, 32, 40, 12, SS_RIGHT + EDITTEXT IDC_EDIT, 52, 30, 160, 12, ES_AUTOHSCROLL + RTEXT "Spin Me:", IDC_ST_UPD, 10, 63, 40, 12, SS_RIGHT + EDITTEXT IDC_EDIT_BUDDY, 52, 60, 65, 14, ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER + CONTROL "", IDC_UPD, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_WRAP | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 257, 66, 12, 16 + DEFPUSHBUTTON "OK", IDOK, 107, 115, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 162, 115, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_INSERT_DIALOG DIALOGEX 0, 0, 283, 149 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Insert Text" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + DEFPUSHBUTTON "OK", IDOK, 171, 128, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 226, 128, 50, 14 + CTEXT "Select the Text to Insert", IDC_STATIC, 7, 11, 269, 8, SS_CENTER + AUTORADIOBUTTON "The wicked flee when none pursueth ...", IDC_RB_WICKED, 11, 33, 141, 8, WS_TABSTOP + AUTORADIOBUTTON "Lotus 123 had its ups and downs.", IDC_RB_LOTUS, 11, 53, 122, 8 + AUTORADIOBUTTON "Ides of March - name of March 15 in Roman calendar.", IDC_RB_IDES, 11, 74, 186, 8, WS_TABSTOP + AUTORADIOBUTTON "472 lifeboat seats not used when 1,503 people died on the Titanic.", IDC_RB_TITANIC, 11, 95, 226, 8, WS_TABSTOP +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_POSITION_DIALOG DIALOGEX 0, 0, 186, 95 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Set New Position" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + DEFPUSHBUTTON "OK", IDOK, 74, 74, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 129, 74, 50, 14 + CTEXT "Pick a new position for the up-down control.", IDC_STATIC, 9, 11, 170, 8, SS_CENTER + LTEXT "New Position:", IDC_STATIC, 11, 41, 44, 8, SS_LEFT + EDITTEXT IDC_EDIT_POSITION, 56, 38, 68, 14, ES_RIGHT | ES_AUTOHSCROLL + CONTROL "", IDC_UPD_POSITION, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 112, 38, 12, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_RANGE_DIALOG DIALOGEX 0, 0, 203, 164 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Set UpDown Range" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + CTEXT "Set the start and end values for the range.", IDC_STATIC, 11, 9, 185, 13, SS_CENTER + LTEXT "The complete possible range for an UpDown control is -2147,483,648 to 2,147,483,647. The start value does not have to be lower than the end value. 5 to -5 is a valid range.", IDC_ST_EXPLANATION, 11, 36, 180, 35, SS_LEFT + RTEXT "Start value:", IDC_STATIC, 8, 85, 41, 8, SS_RIGHT + EDITTEXT IDC_EDIT_LOW, 51, 84, 70, 12, ES_AUTOHSCROLL + CONTROL "", IDC_UPD_LOW, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 109, 84, 12, 12 + RTEXT "End value:", IDC_STATIC, 8, 117, 41, 8, SS_RIGHT + EDITTEXT IDC_EDIT_HIGH, 51, 116, 70, 12, ES_AUTOHSCROLL + CONTROL "", IDC_UPD_HIGH, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 109, 116, 12, 12 + DEFPUSHBUTTON "OK", IDOK, 91, 143, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 146, 143, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_SELECT_DIALOG DIALOGEX 0, 0, 277, 122 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Select Text" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + GROUPBOX "The current text in the edit control available for selection is:", IDC_STATIC, 7, 10, 261, 34 + DEFPUSHBUTTON "OK", IDOK, 165, 101, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 220, 101, 50, 14 + LTEXT "Static", IDC_ST_CURRENT_TEXT, 11, 26, 256, 10, SS_LEFT | SS_WORDELLIPSIS + LTEXT "Selection start position", IDC_STATIC, 11, 58, 86, 8, SS_LEFT + LTEXT "Selection end position", IDC_STATIC, 120, 58, 70, 8, SS_LEFT + EDITTEXT IDC_EDIT_START, 11, 72, 40, 14, ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER + CONTROL "", IDC_UPD_START, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_WRAP | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 39, 72, 12, 14 + EDITTEXT IDC_EDIT_END, 120, 72, 40, 14, ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER + CONTROL "", IDC_UPD_END, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_WRAP | UDS_AUTOBUDDY | UDS_HOTTRACK | UDS_SETBUDDYINT, 148, 72, 12, 14 +} diff --git a/modules/windows/oodialog/menus/UserMenuBar.rex b/modules/windows/oodialog/menus/UserMenuBar.rex new file mode 100755 index 0000000..05ee7ab --- /dev/null +++ b/modules/windows/oodialog/menus/UserMenuBar.rex @@ -0,0 +1,575 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * A simple application that shows how to create an UserMenuBar menu. The + * dialog contains an Edit control and an UpDown control. The menu is used to + * change styles or behaviour of the two controls. + * + * About half of the menu items pop up a dialog to collect user input needed to + * carry out the menu item action. + * + * This example uses a number of up-down controls in the different dialogs, + * making it a good example of how to use up-down controls in addition, to being + * a menu bar example. + */ + + sd = locate() + .application~setDefaults("O", sd"UserMenuBar.h", .false) + + dlg = .SimpleDialog~new(sd"UserMenuBar.rc", IDD_MAIN_DIALOG) + if dlg~initCode <> 0 then do + return 99 + end + + dlg~execute("SHOWTOP") + +return 0 + +::requires "ooDialog.cls" + +-- We need 10 digits to work with the numbers in the full range of an up-down +-- control (-2147,483,648 to 2,147,483,647) +::options digits 10 + +::class 'SimpleDialog' subclass RcDialog + +::constant DEFAULT_TEXT "1, 2, 3, the Edit control Menu actions work better with text in the 1st edit control." +::constant WICKED_TEXT "The wicked flee when none pursueth ..." +::constant LOTUS_TEXT "Lotus 123 had its ups and downs." +::constant IDES_TEXT "Ides of March - name of March 15 in Roman calendar." +::constant TITANIC_TEXT "472 lifeboat seats not used when 1,503 people died on the Titanic." + +::method init + expose srcDir + + forward class (super) continue + + -- Grab the source dir value here and save it in an instance variable for + -- convenience. + srcDir = .application~srcDir + + if \ self~createMenuBar then do + self~initCode = 1 + return + end + + +::method initDialog + expose menuBar edit upDown + + upDown = self~newUpDown(IDC_UPD) + upDown~setRange(1, 20000) + upDown~setPosition(1000) + + if \ menuBar~attachTo(self) then do + msg = "Failed to attach menu bar System Error Code:" .SystemErrorCode + z = MessageDialog(msg, self~hwnd, "Menu Error", "OK", "WARNING") + end + + edit = self~newEdit(IDC_EDIT) + edit~setText(.SimpleDialog~DEFAULT_TEXT) + + self~setRadioChecks(ID_EDITCONTROL_UNRESTRICTED) + + +-- Creates a UserMenuBar +::method createMenuBar private + expose menuBar + + -- Create a menu bar that has a symbolic resource ID of IDM_MENUBAR, has no + -- help ID, uses the default menu item count, and autoconnects all command + -- menu items when it is attached to a dialog. + menuBar = .UserMenuBar~new(IDM_MENUBAR, , , .true) + + -- Create the menu bar template. + menuBar~addPopup(IDM_POP_FILES, "Files") + menuBar~addItem(ID_FILES_HIDE_EDIT, "Hide Edit Control", "DEFAULT CHECK") + menuBar~addItem(ID_FILES_HIDE_UPDOWN, "Hide UpDown Control", " CHECK") + menuBar~addSeparator(IDM_SEP_FILES) + menuBar~addItem(ID_FILES_EXIT, "Exit", "END") + + menuBar~addPopup(IDM_POP_EDITCONTROL, "Edit Control") + menuBar~addItem(ID_EDITCONTROL_LOWER, "Lower Case Only", "CHECK RADIO") + menuBar~addItem(ID_EDITCONTROL_NUMBER, "Numbers Only", "CHECK RADIO") + menuBar~addItem(ID_EDITCONTROL_UPPER, "Upper Case Only", "CHECK RADIO") + menuBar~addItem(ID_EDITCONTROL_UNRESTRICTED, "No Restriction", "CHECK RADIO DEFAULT") + menuBar~addSeparator(IDM_SEP_EDITCONTROL) + menuBar~addItem(ID_EDITCONTROL_INSERT, "Insert Text ...") + menuBar~addItem(ID_EDITCONTROL_SELECT, "Select Text ...", "END") + + menuBar~addPopup(IDM_POP_UPDOWNCONTROL, "UpDown Control") + menuBar~addItem(ID_UPDOWNCONTROL_HEXIDECIMAL, "Hexidecimal", "CHECK") + menuBar~addSeparator(IDM_SEP_UPDOWNCONTROL) + menuBar~addItem(ID_UPDOWNCONTROL_SET_ACCELERATION, "Set Acceleration ...") + menuBar~addItem(ID_UPDOWNCONTROL_SET_RANGE, "Set Range ...") + menuBar~addItem(ID_UPDOWNCONTROL_SET_POSITION, "Set Position ...", "END") + + menuBar~addPopup( IDM_POP_HELP, "Help", "END") + menuBar~addItem(ID_HELP_ABOUT, "About User Menu Bar", "END") + + if \ menuBar~complete then do + say 'User menu bar completion error:' .SystemErrorCode SysGetErrortext(.SystemErrorCode) + return .false + end + + return .true + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +-- The methods below, up to the next dividing lines, are the implementation +-- for each of the menu item command events. +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::method hideEditControl unguarded + expose menuBar edit + + if menuBar~isChecked(ID_FILES_HIDE_EDIT) then do + menuBar~uncheck(ID_FILES_HIDE_EDIT) + self~newStatic(IDC_ST_EDIT)~show + edit~show + end + else do + menuBar~check(ID_FILES_HIDE_EDIT) + self~newStatic(IDC_ST_EDIT)~hide + edit~hide + end + +::method hideUpDownControl unguarded + expose menuBar upDown + + if menuBar~isChecked(ID_FILES_HIDE_UPDOWN) then do + menuBar~uncheck(ID_FILES_HIDE_UPDOWN) + self~newStatic(IDC_ST_UPD)~show + self~newEdit(IDC_EDIT_BUDDY)~show + upDown~show + end + else do + menuBar~check(ID_FILES_HIDE_UPDOWN) + self~newStatic(IDC_ST_UPD)~hide + self~newEdit(IDC_EDIT_BUDDY)~hide + upDown~hide + end + +::method exit unguarded + self~cancel + + +::method lowerCaseOnly unguarded + expose menuBar edit + + alreadyChecked = menuBar~isChecked(ID_EDITCONTROL_LOWER) + + self~setRadioChecks(ID_EDITCONTROL_LOWER) + edit~replaceStyle("UPPER NUMBER", "LOWER") + + text = edit~getText + edit~setText(text~lower) + + if \ alreadyChecked then do + edit~assignFocus + edit~select(1, 1) + + msg = "You can only enter lower case letters in" || .endOfLine || - + "the edit control now. Try it." + z = MessageDialog(msg, self~hwnd, 'Edit Control Style Change', "OK", "INFORMATION") + end + + +::method numbersOnly unguarded + expose menuBar edit + + alreadyChecked = menuBar~isChecked(ID_EDITCONTROL_NUMBER) + + self~setRadioChecks(ID_EDITCONTROL_NUMBER) + edit~replaceStyle("LOWER UPPER", "NUMBER") + + text = edit~getText + edit~setText(text~translate("", xrange("00"X, "/") || xrange(":", "FF"X))~space(0)) + + if \ alreadyChecked then do + edit~assignFocus + edit~select(1, 1) + + msg = "You can only enter numbers in the" || .endOfLine || - + "edit control now. Try it." + z = MessageDialog(msg, self~hwnd, 'Edit Control Style Change', "OK", "INFORMATION") + end + + +::method upperCaseOnly unguarded + expose menuBar edit + + alreadyChecked = menuBar~isChecked(ID_EDITCONTROL_UPPER) + + self~setRadioChecks(ID_EDITCONTROL_UPPER) + edit~replaceStyle("LOWER NUMBER", "UPPER") + + text = edit~getText + edit~setText(text~upper) + + if \ alreadyChecked then do + edit~assignFocus + edit~select(1, 1) + + msg = "You can only enter upper case letters in" || .endOfLine || - + "the edit control now. Try it." + z = MessageDialog(msg, self~hwnd, 'Edit Control Style Change', "OK", "INFORMATION") + end + + +::method noRestriction unguarded + expose menuBar edit + + alreadyChecked = menuBar~isChecked(ID_EDITCONTROL_UNRESTRICTED) + + self~setRadioChecks(ID_EDITCONTROL_UNRESTRICTED) + edit~removeStyle("LOWER NUMBER UPPER") + + text = edit~getText + edit~setText(.SimpleDialog~DEFAULT_TEXT) + + if \ alreadyChecked then do + edit~assignFocus + edit~select(1, 1) + + msg = "You can now enter unrestricted text in" || .endOfLine || - + "the edit control. Try it." + z = MessageDialog(msg, self~hwnd, 'Edit Control Style Change', "OK", "INFORMATION") + end + + +::method insertText unguarded + expose edit srcDir + + dlg = .InsertDialog~new(srcDir"UserMenuBar.rc", IDD_INSERT_DIALOG, , srcDir"UserMenuBar.h") + + if dlg~execute("SHOWTOP", IDI_DLG_OODIALOG) == .PlainBaseDialog~IDOK then do + edit~setText(dlg~selectedText) + end + + +::method selectText unguarded + expose edit srcDir + + dlg = .SelectDialog~new(srcDir"UserMenuBar.rc", IDD_SELECT_DIALOG, , srcDir"UserMenuBar.h") + dlg~currentText = edit~getText + edit~select(1, 1) + + if dlg~execute("SHOWTOP", IDI_DLG_APPICON) == .PlainBaseDialog~IDOK then do + s = dlg~selection + edit~select(s~x, s~y) + end + + +::method hexidecimal unguarded + expose menuBar upDown + + if menuBar~isChecked(ID_UPDOWNCONTROL_HEXIDECIMAL) then do + menuBar~uncheck(ID_UPDOWNCONTROL_HEXIDECIMAL) + upDown~setBase(10) + end + else do + menuBar~check(ID_UPDOWNCONTROL_HEXIDECIMAL) + upDown~setBase(16) + end + + +::method setAcceleration unguarded + expose upDown srcDir + + dlg = .AccelDialog~new(srcDir"UserMenuBar.rc", IDD_ACCEL_DIALOG, , srcDir"UserMenuBar.h") + + if dlg~execute("SHOWTOP", IDI_DLG_APPICON2) == .PlainBaseDialog~IDOK then do + accel = dlg~acceleration + upDown~setAcceleration(accel) + end + + +::method setRange unguarded + expose upDown srcDir + + dlg = .RangeDialog~new(srcDir"UserMenuBar.rc", IDD_RANGE_DIALOG, , srcDir"UserMenuBar.h") + + if dlg~execute("SHOWTOP", IDI_DLG_OOREXX) == .PlainBaseDialog~IDOK then do + r = dlg~range + upDown~setRange(r~x, r~y) + + -- If the current position was no longer within the new range, the up-down + -- control will have internally reset its position so that it is within the + -- new range. But, the value displayed will still be the old value. This + -- forces the value displayed to match the current position. + upDown~setPosition(upDown~getPosition) + end + + +::method setPosition unguarded + expose upDown srcDir + + dlg = .PositionDialog~new(srcDir"UserMenuBar.rc", IDD_POSITION_DIALOG, , srcDir"UserMenuBar.h") + dlg~upDown = upDown + + if dlg~execute("SHOWTOP", IDI_DLG_DEFAULT) == .PlainBaseDialog~IDOK then do + p = dlg~position + upDown~setPosition(p) + end + + +::method aboutUserMenuBar unguarded + expose srcDir + + dlg = .AboutDialog~new(srcDir"UserMenuBar.rc", IDD_ABOUT_DIALOG, , srcDir"UserMenuBar.h") + + dlg~execute("SHOWTOP", IDI_DLG_DEFAULT) + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +-- End of the implementation methods for each of the menu item command events. +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + + + +-- Convenience method to set the radio button menu items. The checkRadio() +-- method takes a start resource ID and an end resource, and the resource ID for +-- a single menu item within that range of IDs. It removes the radio button +-- check mark from all the menu items in the range and adds the radio button +-- check mark to item specified by the third argument. +::method setRadioChecks private + expose menuBar + use strict arg item + + menuBar~checkRadio(ID_EDITCONTROL_LOWER, ID_EDITCONTROL_UNRESTRICTED, item) + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +-- The following classes all implement a single dialog that is used to collect +-- information, from the user, needed to carry out one of the menu item +-- commands. +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + +::class 'InsertDialog' subclass RcDialog + +::attribute selectedText + +::method initDialog + self~newRadioButton(IDC_RB_WICKED)~check + +::method ok unguarded + + select + when self~newRadioButton(IDC_RB_WICKED)~checked then self~selectedText = .SimpleDialog~WICKED_TEXT + when self~newRadioButton(IDC_RB_LOTUS)~checked then self~selectedText = .SimpleDialog~LOTUS_TEXT + when self~newRadioButton(IDC_RB_IDES)~checked then self~selectedText = .SimpleDialog~IDES_TEXT + when self~newRadioButton(IDC_RB_TITANIC)~checked then self~selectedText = .SimpleDialog~TITANIC_TEXT + otherwise self~selectedText = "" + end + -- End select + + self~ok:super + + +::class 'SelectDialog' subclass RcDialog + +::attribute selection +::attribute currentText + +::method initDialog + expose updStart updEnd currentText + + self~newStatic(IDC_ST_CURRENT_TEXT)~setText(currentText) + + updStart = self~newUpDown(IDC_UPD_START) + updStart~setRange(0, currentText~length) + updStart~setPosition(1) + + updEnd = self~newUpDown(IDC_UPD_END) + updEnd~setRange(0, currentText~length) + updEnd~setPosition(1) + +::method ok unguarded + expose updStart updEnd + + self~selection = .Point~new(updStart~getPosition, updEnd~getPosition) + self~ok:super + + + +::class 'AccelDialog' subclass RcDialog + +::attribute acceleration + +::method initDialog + + upd = self~newUpDown(IDC_UPD_ACCEL_SECONDS0) + upd~setPosition(0) + upd~disable + self~newEdit(IDC_EDIT_ACCEL_SECONDS0)~disable + + upd = self~newUpDown(IDC_UPD_ACCEL0) + upd~setPosition(1) + upd~disable + self~newEdit(IDC_EDIT_ACCEL0)~disable + + do i = 1 to 3 + upd = self~newUpDown(IDC_UPD_ACCEL_SECONDS || i) + upd~setRange(i, 32) + upd~setPosition(i) + + upd = self~newUpDown(IDC_UPD_ACCEL || i) + upd~setRange(2 ** i, 256) + upd~setPosition(2 ** i) + end + + self~newUpDown(IDC_UPD_ACCEL_SECONDS1)~assignFocus + + +::method ok unguarded + + a = .array~new(3) + + do i = 1 to 3 + d = .directory~new + + updS = self~newUpDown(IDC_UPD_ACCEL_SECONDS || i) + updA = self~newUpDown(IDC_UPD_ACCEL || i) + + d~seconds = updS~getPosition + d~increment = updA~getPosition + a[i] = d + end + + -- Check that the user has an unique value for each acceleration entry. + check = .set~of(a[1]~seconds, a[2]~seconds, a[3]~seconds) + if check~items <> 3 then do + msg = "For each of the 3 acceleration input" || .endOfLine || - + "lines, you must use a unique value for" || .endOfLine || - + "seconds. Found:" a[1]~seconds',' a[2]~seconds', and' a[3]~seconds'.' + + z = MessageDialog(msg, self~hwnd, "Acceleration Input Error", "OK", "STOP") + return .false + end + + -- Sort the entries by seconds, ascending, using brute force. + max = 0; min = 4 + do i = 1 to 3 + if a[i]~seconds > max then max = i + if a[i]~seconds < min then min = i + end + + -- The user only has 3 up-down pairs she can set. But, we also have the + -- first disabled up-down pair for seconds == 0, increment == 1 + aa = .array~new(4) + aa[1] = .directory~new~~setEntry("SECONDS", 0)~~setEntry("INCREMENT", 1) + + aa[2] = a[min] + aa[4] = a[max] + + do i = 1 to 3 + if i \== min, i \== max then do + aa[3] = a[i] + leave + end + end + + self~acceleration = aa + self~ok:super + + +::class 'RangeDialog' subclass RcDialog + +::attribute range + +::method initDialog + expose updLow updHigh + + -- Set an acceleration that goes very fast if the user hold down the arrow + -- keys, or holds down the mouse on the up / down arrows. + accel = .array~new(4) + accel[1] = .directory~new~~setEntry("SECONDS", 0)~~setEntry("INCREMENT", 1) + accel[2] = .directory~new~~setEntry("SECONDS", 1)~~setEntry("INCREMENT", 32) + accel[3] = .directory~new~~setEntry("SECONDS", 2)~~setEntry("INCREMENT", 64) + accel[4] = .directory~new~~setEntry("SECONDS", 3)~~setEntry("INCREMENT", 256) + + updLow = self~newUpDown(IDC_UPD_LOW) + updLow~setRange(-2147483648, 2147483647) + updLow~setPosition(0) + updLow~setAcceleration(accel) + + updHigh = self~newUpDown(IDC_UPD_HIGH) + updHigh~setRange(-2147483648, 2147483647) + updHigh~setPosition(0) + updHigh~setAcceleration(accel) + +::method ok unguarded + expose updLow updHigh + + self~range = .Point~new(updLow~getPosition, updHigh~getPosition) + self~ok:super + + +::class 'PositionDialog' subclass RcDialog + +::attribute position +::attribute upDown + +::method initDialog + expose upDown upd + + upd = self~newUpDown(IDC_UPD_POSITION) + + upd~setRange(upDown~getRange) + upd~setPosition(upDown~getPosition) + +::method ok unguarded + expose upd + + self~position = upd~getPosition + self~ok:super + + +::class 'AboutDialog' subclass RcDialog + +::method initDialog + expose font + + bitmap = .Image~getImage(.application~srcDir"UserMenuBar.bmp") + self~newStatic(IDC_ST_BITMAP)~setImage(bitmap) + + font = self~createFontEx("Ariel", 14) + self~newStatic(IDC_ST_ABOUT)~setFont(font) + +::method leaving + expose font + self~deleteFont(font) diff --git a/modules/windows/oodialog/mouse/dragNdrop.h b/modules/windows/oodialog/mouse/dragNdrop.h new file mode 100644 index 0000000..0ea61dd --- /dev/null +++ b/modules/windows/oodialog/mouse/dragNdrop.h @@ -0,0 +1,45 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_NFL_DLG 100 +#define IDC_LV_WEST 1005 +#define IDC_LV_EAST 1007 +#define IDC_LV_NFL 1008 diff --git a/modules/windows/oodialog/mouse/dragNdrop.rc b/modules/windows/oodialog/mouse/dragNdrop.rc new file mode 100644 index 0000000..382c717 --- /dev/null +++ b/modules/windows/oodialog/mouse/dragNdrop.rc @@ -0,0 +1,59 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "dragNdrop.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_NFL_DLG DIALOGEX 0, 0, 526, 345 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "NFL Dream Teams West vs East" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + LTEXT "Top NFL Players:", IDC_STATIC, 14, 10, 82, 13, SS_LEFT | SS_CENTERIMAGE + CONTROL "", IDC_LV_NFL, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | LVS_REPORT, 10, 25, 242, 275 + LTEXT "A Team Players (West):", IDC_STATIC, 278, 10, 103, 13, SS_LEFT | SS_CENTERIMAGE + CONTROL "", IDC_LV_WEST, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | LVS_REPORT, 274, 25, 242, 123 + LTEXT "B Team Players (East):", IDC_STATIC, 278, 162, 82, 13, SS_LEFT | SS_CENTERIMAGE + CONTROL "", IDC_LV_EAST, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | LVS_REPORT, 274, 177, 242, 123 + LTEXT "Pick your A team and B team by dragging Top NFL Players to the West or East team.", IDC_STATIC, 11, 310, 237, 19, SS_LEFT + DEFPUSHBUTTON "OK", IDOK, 411, 321, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 466, 321, 50, 14 +} diff --git a/modules/windows/oodialog/mouse/dragNdrop.rex b/modules/windows/oodialog/mouse/dragNdrop.rex new file mode 100755 index 0000000..4669683 --- /dev/null +++ b/modules/windows/oodialog/mouse/dragNdrop.rex @@ -0,0 +1,515 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * This example program demonstrates one approach to adding drag-and-drop to an + * ooDialog program using the .Mouse class. + */ + + sd = locate() + .application~setDefaults('O', sd'dragNdrop.h', .false) + + dlg = .DreamTeamDlg~new(sd'dragNdrop.rc', IDD_NFL_DLG) + + if dlg~initCode == 0 then do + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + end + +::requires "ooDialog.cls" + +::class 'DreamTeamDlg' subclass RcDialog + +::method init + expose dropOkCursor noDropCursor cursorIsNoDrop dragging + forward class (super) continue + + -- This will load a cursor from a file. The file has to actually be a cursor + -- or the method will fail. The operating system will refuse to load anything + -- but an actual cursor. The return is an .Image object. + dropOkCursor = .Mouse~loadCursorFromFile(.application~srcDir"dragging.cur") + if dropOkCursor == 0 then do + say 'Error loading Drop Ok Cursor system error code:' .SystemErrorCode + self~initCode = 1 + return self~initCode + end + + -- This loads the system's predefined NO cursor. Again the return is a .Image + -- object. + noDropCursor = .Mouse~loadCursor("NO") + if noDropCursor == 0 then do + say 'Error loading No Drop Cursor, system error code:' .SystemErrorCode + self~initCode = 1 + return self~initCode + end + + cursorIsNoDrop = .false + dragging = .false + + return 0 + +::method initDialog + expose lvNFL lvWest lvEast noDropCursor dragItem nfl2west nfl2east + + lvNFL = self~newListView(IDC_LV_NFL) + self~setUpListView(lvNFL) + + lvWest = self~newListView(IDC_LV_WEST) + self~setUpListView(lvWest) + + lvEast = self~newListView(IDC_LV_EAST) + self~setUpListView(lvEast) + + self~setMice + + self~mapDropTargets + + dragItem = .nil + + +/** mapDropTargets() + * + */ +::method mapDropTargets private + expose lvNFL lvWest lvEast nfl2west nfl2east west2nfl west2east east2nfl east2west + + nfl2west = lvWest~clientRect + lvWest~mapWindowPoints(lvNFL~hwnd, nfl2west) + + nfl2east = lvEast~clientRect + lvEast~mapWindowPoints(lvNFL~hwnd, nfl2east) + + west2nfl = lvNFL~clientRect + lvNFL~mapWindowPoints(lvWest~hwnd, west2nfl) + + west2east = lvEast~clientRect + lvEast~mapWindowPoints(lvWest~hwnd, west2east) + + east2nfl = lvNFL~clientRect + lvNFL~mapWindowPoints(lvEast~hwnd, east2nfl) + + east2west = lvWest~clientRect + lvWest~mapWindowPoints(lvEast~hwnd, east2west) + + +::method doDrag private + expose oldCursor noDropCursor cursorIsNoDrop dragging + use arg lv, index, p, mouse + + mouse~capture + oldCursor = mouse~setCursor(noDropCursor) + + di = .DragItem~new(lv, index, p, mouse) + + cursorIsNoDrop = .true + dragging = .true + + return di + + +::method nflOnLBdown unguarded + expose lvNFL dragItem + use arg keyState, p, mouse + + index = lvNFL~hitTestInfo(p) + + if keyState \== 'lButton' | index = -1 then return .false + + lvNFL~assignFocus + lvNFL~focus(index) + lvNFL~select(index) + + if mouse~dragDetect(p) then do + dragItem = self~doDrag(lvNFL, index, p, mouse) + return .true + end + + return .false + +::method nflOnLBup unguarded + expose oldCursor cursorIsNoDrop dragging lvNFL lvWest lvEast dragItem nfl2west nfl2east + use arg keyState, p, mouse + + if dragging then do + okayToDrop = (cusorIsNoDrop \== .true) + + dragging = .false + cursorIsNoDrop = .false + mouse~releaseCapture + mouse~setCursor(oldCursor) + + if okayToDrop & dragItem \== .nil then do + if p~inRect(nfl2west) then do + dragItem~target = lvWest + end + else if p~inRect(nfl2east) then do + dragItem~target = lvEast + end + else do + -- Theoretically this can not happen, but just to be sure... + dragItem = .nil + return 0 + end + + -- The point p is in client coordinates of the NFL list view. We are + -- going to map that point back to the client coordinates of the list view + -- where the row is being dropped. Then the drag item can determine where + -- the insertion poing for the row should be in the target list view. + lvNFL~mapWindowPoints(dragItem~target~hwnd, p) + + dragItem~drop(p) + dragItem = .nil + end + end + + return 0 + + +::method nflOnMove unguarded + expose dragging dropOkCursor noDropCursor cursorIsNoDrop nfl2west nfl2east + use arg keyState, p, mouse + + if dragging then do + if p~inRect(nfl2west) then do + if cursorIsNoDrop then do + mouse~setCursor(dropOkCursor) + cursorIsNoDrop = .false + end + end + else if p~inRect(nfl2east) then do + if cursorIsNoDrop then do + mouse~setCursor(dropOkCursor) + cursorIsNoDrop = .false + end + end + else do + if \ cursorIsNoDrop then do + mouse~setCursor(noDropCursor) + cursorIsNoDrop = .true + end + end + end + + return 0 + +::method westOnLBdown unguarded + expose lvWest dragItem + use arg keyState, p, mouse + + index = lvWest~hitTestInfo(p) + + if keyState \== 'lButton' | index = -1 then return .false + + lvWest~assignFocus + lvWest~focus(index) + lvWest~select(index) + + if mouse~dragDetect(p) then do + dragItem = self~doDrag(lvWest, index, p, mouse) + return .true + end + + return .false + + +::method westOnLBup unguarded + expose oldCursor cursorIsNoDrop dragging lvNFL lvWest lvEast dragItem west2nfl west2east + use arg keyState, p, mouse + + if dragging then do + okayToDrop = (cusorIsNoDrop \== .true) + + dragging = .false + cursorIsNoDrop = .false + mouse~releaseCapture + mouse~setCursor(oldCursor) + + if okayToDrop & dragItem \== .nil then do + if p~inRect(west2nfl) then do + dragItem~target = lvNFL + end + else if p~inRect(west2east) then do + dragItem~target = lvEast + end + else do + -- Theoretically this can not happen, but just to be sure... + dragItem = .nil + return 0 + end + + -- The point p is in client coordinates of the West list view. We are + -- going to map that point back to the client coordinates of the list view + -- where the row is being dropped. Then the drag item can determine where + -- the insertion poing for the row should be in the target list view. + lvWest~mapWindowPoints(dragItem~target~hwnd, p) + + dragItem~drop(p) + dragItem = .nil + end + end + + return 0 + + +::method westOnMove unguarded + expose dragging dropOkCursor noDropCursor cursorIsNoDrop west2nfl west2east + use arg keyState, p, mouse + + if dragging then do + if p~inRect(west2nfl) then do + if cursorIsNoDrop then do + mouse~setCursor(dropOkCursor) + cursorIsNoDrop = .false + end + end + else if p~inRect(west2east) then do + if cursorIsNoDrop then do + mouse~setCursor(dropOkCursor) + cursorIsNoDrop = .false + end + end + else do + if \ cursorIsNoDrop then do + mouse~setCursor(noDropCursor) + cursorIsNoDrop = .true + end + end + end + + return 0 + +::method eastOnLBdown unguarded + expose lvEast dragItem + use arg keyState, p, mouse + + index = lvEast~hitTestInfo(p) + + if keyState \== 'lButton' | index = -1 then return .false + + lvEast~assignFocus + lvEast~focus(index) + lvEast~select(index) + + if mouse~dragDetect(p) then do + dragItem = self~doDrag(lvEast, index, p, mouse) + return .true + end + + return .false + + +::method eastOnLBup unguarded + expose oldCursor cursorIsNoDrop dragging lvNFL lvWest lvEast dragItem east2nfl east2west + use arg keyState, p, mouse + + if dragging then do + okayToDrop = (cusorIsNoDrop \== .true) + + dragging = .false + cursorIsNoDrop = .false + mouse~releaseCapture + mouse~setCursor(oldCursor) + + if okayToDrop & dragItem \== .nil then do + if p~inRect(east2nfl) then do + dragItem~target = lvNFL + end + else if p~inRect(east2west) then do + dragItem~target = lvWest + end + else do + -- Theoretically this can not happen, but just to be sure... + dragItem = .nil + return 0 + end + + -- The point p is in client coordinates of the East list view. We are + -- going to map that point back to the client coordinates of the list view + -- where the row is being dropped. Then the drag item can determine where + -- the insertion poing for the row should be in the target list view. + lvEast~mapWindowPoints(dragItem~target~hwnd, p) + + dragItem~drop(p) + dragItem = .nil + end + end + + return 0 + + +::method eastOnMove unguarded + expose dragging dropOkCursor noDropCursor cursorIsNoDrop east2nfl east2west + use arg keyState, p, mouse + + if dragging then do + if p~inRect(east2nfl) then do + if cursorIsNoDrop then do + mouse~setCursor(dropOkCursor) + cursorIsNoDrop = .false + end + end + else if p~inRect(east2west) then do + if cursorIsNoDrop then do + mouse~setCursor(dropOkCursor) + cursorIsNoDrop = .false + end + end + else do + if \ cursorIsNoDrop then do + mouse~setCursor(noDropCursor) + cursorIsNoDrop = .true + end + end + end + + return 0 + + + +::method setMice private + expose mLVnfl mLVwest mLVeast lvNFL lvWest lvEast + + mLVnfl = .Mouse~new(lvNFL) + mLVwest = .Mouse~new(lvWest) + mLVeast = .Mouse~new(lvEast) + + mLVnfl~connectEvent('LBUTTONDOWN', nflOnLBdown) + mLVnfl~connectEvent('LBUTTONUP', nflOnLBup) + mLVnfl~connectEvent('MOUSEMOVE', nflOnMove) + + mLVwest~connectEvent('LBUTTONDOWN', westOnLBdown) + mLVwest~connectEvent('LBUTTONUP', westOnLBup) + mLVwest~connectEvent('MOUSEMOVE', westOnMove) + + mLVeast~connectEvent('LBUTTONDOWN', eastOnLBdown) + mLVeast~connectEvent('LBUTTONUP', eastOnLBup) + mLVeast~connectEvent('MOUSEMOVE', eastOnMove) + +::method setUpListView private + use strict arg lv + + lv~addExtendedStyle("GRIDLINES DOUBLEBUFFER FULLROWSELECT") + lv~insertColumnPX(0, 'Player', 105, 'LEFT') + lv~insertColumnPX(1, 'Team', 115, 'CENTER') + lv~insertColumnPX(2, 'Position', 65, 'CENTER') + lv~insertColumnPX(3, 'Rating', 65, 'CENTER') + + if lv~id == .constDir[IDC_LV_NFL] then do + playerRows = self~getPlayers + do l over playerRows + lv~addRow( , , l~player, l~team, l~pos, l~rating) + end + end + +::method getPlayers private + + rows = .Array~new + + fileObj = .stream~new(.application~srcDir"nflPlayers.txt") + players = fileObj~makeArray + + do line over players + line = line~strip + if line~length == 0 | line~abbrev("#") | line~abbrev("/*") then iterate + + parse var line name', 'team', 'p', 'rating . + + r = .Directory~new + r~player = name + r~team = team + r~pos = p + r~rating = rating + rows~append(r) + end + + fileObj~close + + return rows + + +/* Class: DragItem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + + Drag items are an encapsulation of the data needed to drag and drop one row + of a list view to another. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'DragItem' + +::attribute target + +::method init + expose lv index row target + use arg lv, index, p, mouse + + row = .Directory~new + lv~getItemInfo(index, row) + row~player = row~text + + lv~getItemInfo(index, row, 1) + row~team = row~text + + lv~getItemInfo(index, row, 2) + row~pos = row~text + + lv~getItemInfo(index, row, 3) + row~rating = row~text + + target = .nil + +::method drop + expose lv index row target + use strict arg pt = 0 + + if target \== .nil then do + -- Drop the row at the end of the list by default. + targetIndex = target~items + + if pt~isA(.Point) then do + i = target~hitTestInfo(pt) + if i <> -1 then targetIndex = i + end + + target~addRow(targetIndex, , row~player, row~team, row~pos, row~rating) + + lv~delete(index) + + count = lv~items + if count <> 0 then do + if index == count then lv~select(index - 1) + else lv~select(index) + end + end + + diff --git a/modules/windows/oodialog/mouse/dragging.cur b/modules/windows/oodialog/mouse/dragging.cur new file mode 100644 index 0000000000000000000000000000000000000000..064623d07b05fce47b1e6e4f7ee46863a8f11b1f GIT binary patch literal 4286 zcmdUy+fEx-6oxk;K*%I9aT3lku` zF-jd!6{@{msalM8>y)ZjO1%njOI-$dil0hd#k2qGH9bAuF)=YQK0G`;9twpzg2CX0 zfq{YE{{H?n=DkBhLl?@qHxcQ`=kw#MtE*GX%gc%R`T4@^?5xCMF&P;diHF1CF=z_3 zWpHp%Fdr+kejFaeaU3ZYi;~ObB$LUkEiEnO5{X1E9*<|~Wps2@B9RC^ZD2khjYjWH zO-%*%>V^9UGqeD_%bgbr1zA~Hk%fhY^<*;XKu_RDCMPG|ab{*Fv{!xpemY%Dc*6fQ zdU;8uQuHEob8`Ye9Lu1uTawA8=k~to!?EqHN49NCHk)OA>`*A02e0jY|92;D+!(}u z@?Z`7Tl-ruk;vGQ$l`M;35VxJsgKr`(r@ieU*q`ba+I1uyx+j6T)7gH#l{9=2rFxv&T9G41M2;O3IeOI0d9S8Mq_UDeJZ#MA<4-^ztV;~AN7)0PpodDmbPakY zWmya2^NE}|AyQv&;QaV;m|=lP5(Q8%3I$ zL|R%znwvM=v7y0uqBrKnvP2FYGG2@a_DB|Zd0No}mX%jh#N-u~GK)c5;&9%;w2`W&Axg`Vs~zjdKz<-CkO_r9(E zHuq~;z3h(2;npFGIh%+2|iW{BrcY+W+_a*R?o +#include +#include +#include "mouseWheel.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_HELP DIALOGEX 0, 0, 409, 305 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Help for the Mouse Wheel Demonstration" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + EDITTEXT IDC_HELP_TEXT, 10, 10, 389, 271, WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY | ES_WANTRETURN + DEFPUSHBUTTON "Close", IDOK, 350, 281, 49, 14 +} + + + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +IDD_MOUSE_DLG DIALOGEX 0, 0, 485, 303 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Mouse Wheel Demonstration" +FONT 8, "Ms Shell Dlg 2", 400, 0, 1 +{ + EDITTEXT IDC_EDIT_DATA, 10, 10, 465, 208, WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE + GROUPBOX "When To Scroll With Mouse Wheel", IDC_STATIC, 10, 223, 319, 70 + AUTORADIOBUTTON "Mouse is anywhere", IDC_RB_ANYWHERE, 19, 237, 131, 10 + AUTORADIOBUTTON "Mouse is over dialog", IDC_RB_DIALOG, 19, 256, 131, 10 + AUTORADIOBUTTON "Mouse over edit controls / Ok button", IDC_RB_ON_EDIT_OK, 19, 275, 131, 10 + AUTORADIOBUTTON "Multi-line edit focused / mouse anywhere", IDC_RB_FOCUSED_ANYWHERE, 161, 237, 165, 10 + AUTORADIOBUTTON "Multi-line edit focused / mouse over dialog", IDC_RB_FOCUSED_DIALOG, 161, 256, 165, 10 + AUTORADIOBUTTON "Multi-line edit focused / mouse over edit control", IDC_RB_FOCUSED_EDIT, 161, 275, 165, 10 + LTEXT "Command:", IDC_STATIC, 340, 233, 33, 14, SS_LEFT | SS_CENTERIMAGE + EDITTEXT IDC_EDIT_COMMAND, 377, 233, 98, 14, ES_AUTOHSCROLL + DEFPUSHBUTTON "OK", IDOK, 371, 279, 50, 14 + PUSHBUTTON "Help", IDHELP, 426, 279, 50, 14 +} diff --git a/modules/windows/oodialog/mouse/mouseWheel.rex b/modules/windows/oodialog/mouse/mouseWheel.rex new file mode 100755 index 0000000..f6a620e --- /dev/null +++ b/modules/windows/oodialog/mouse/mouseWheel.rex @@ -0,0 +1,761 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * An example program showing how to work with the mouse wheel. + * + * The ooDialog programmer can capture mouse wheel event by using the + * connectEvent() method of the .Mouse class. The event handler for the + * connection will be invoked each time the user turns the scroll wheel on the + * mouse. The event handler can then use the arguments passed to it to do + * custom scrolling. + * + * Read throught the code comments to understand how this works. + * + * The dialog for this program contains a large multi-line edit control with a + * number of lines in it. For each turn of the mouse scroll wheel, the text in + * the edit control is scrolled 1 line. If the shift key is held down while + * turning the mouse scroll wheel, the text is scrolled 3 lines instead of 1. + * If the control key is down, the text is scrolled 1 page and if both the + * shift and control keys are down, the text is scrolled 3 pages. + * + * The Help button in the dialog displays text explaining the dialog. Use the + * help button to see the expected behavior of the dialog and compare the + * behavior with the implementing code in this file. + */ + + -- First we locate the direcotry our source code is in. This allows us to + -- build complete path names to our resource files, which in turn allows this + -- program to be run from anywhwere on the computer. For instance the program + -- file can be dragged and dropped on ooDialog.exe and it will run correctly. + srcDir = locate() + + -- When programmers wish to use symbolic resource IDs in their programs, as + -- this program does, it is much easier to use the global constant directory, + -- (.constDir,) rather than the constDir attribute of a dialog. Using the + -- .constDir Only is by far the most efficient way to use symbolic IDs. + -- + -- The use of the global constant directory is controlled by the .Application + -- object. The .Application object is also used to set other application-wide + -- defaults or values. In this program, we also want to make the default for + -- automatic data detection to be off. Both of these requirements can be done + -- with one method call to the .Application object. As a convenience, the + -- setDefaults() method will also populate the .constDir with symbols. + -- + -- In this invokcation, the application is set to use the .constDir only, "O", + -- symbols are loaded into the .constDir from the file: ContextMenu.h, and the + -- default for automatic data detection is set to off (.false.) +.application~setDefaults('O', srcDir'mouseWheel.h', .false) + +dlg = .MouseDemo~new(srcDir"mouseWheel.rc", IDD_MOUSE_DLG) + +if dlg~initCode <> 0 then do + msg = "Error initializing the Mouse Wheel Demonstration dialog." || '0d0a0d0a'x || - + "This example will have to quit." + j = MessageDialog(msg, 0, "Application Error", "OK", "ERROR") + return 99 +end + +dlg~execute("SHOWTOP") +return 0 + +::requires 'ooDialog.cls' + +::class 'MouseDemo' subclass RcDialog + +/** initDialog() + * + * The ooDialog framework automatically invokes the initDialog() method + * immediately after the underlying Windows dialog is created. This makes it + * the correct place to do any initialization that requires the underlying + * dialog and dialog controls to exist. + * + * This is a typical initDialog(), but take note of these points. The mouse + * wheel event notification is sent by the operating system to the window with + * the current input focus. If the window does not process the message, then + * the OS sends the message to the parent window of that window. This continues + * on up the parent / child window chain until either a window does process the + * notification or the top of the chain is reached. + * + * Multi-line edit controls *do* process the notification and normally handle + * their own scrolling. Because of this, we need to get two mouse objects. One + * for this dialog and one for the edit control. We then connect the mouse + * wheel event in both mouse objects to a method in this dialog. + */ +::method initDialog + expose eData pbOk eCommand process + + -- Connect the help key event to our onHelp() method. + self~connectHelp(onHelp) + + eData = self~newEdit(IDC_EDIT_DATA) + + -- Get a mouse object for the edit control and connect the mouse wheel event. + -- There are several options of how to handle this. We could, using options + -- to connectEvent(), either have the edit control's mouse wheel events + -- connect to the same method as we connect the the dialog's mouse wheel + -- events to, or have them connect to a separate method. + -- + -- In this case we choose the later, and specify the onEditMouseWheel() + -- method. + -- + -- Note that onEditMouseWheel() method will only be invoked when the + -- IDC_EDIT_DATA edit control has the focus. + mouse = .Mouse~new(eData) + mouse~connectEvent('MOUSEWHEEL', onEditMouseWheel) + + -- Connect all mouse wheel events that reach the dialog to a method in this + -- dialog. The default method name is onMouseWheel, so we omit the method + -- name arugment and name our method in this dialog: 'onMousWheel'. + -- + -- Note that this onMouseWheel() method will never be invoked if the + -- IDC_EDIT_DATA edit control has the focus. + mouse = .Mouse~new(self) + mouse~connectEvent('MOUSEWHEEL') + + -- Set up the radio buttons, connect a click event on any of them to our + -- single onRbSelect() method. + self~connectButtonEvent(IDC_RB_ANYWHERE , 'CLICKED', onRbSelect) + self~connectButtonEvent(IDC_RB_DIALOG , 'CLICKED', onRbSelect) + self~connectButtonEvent(IDC_RB_ON_EDIT_OK , 'CLICKED', onRbSelect) + self~connectButtonEvent(IDC_RB_FOCUSED_ANYWHERE, 'CLICKED', onRbSelect) + self~connectButtonEvent(IDC_RB_FOCUSED_DIALOG , 'CLICKED', onRbSelect) + self~connectButtonEvent(IDC_RB_FOCUSED_EDIT , 'CLICKED', onRbSelect) + + -- Set the initial checked state to the 'Mouse is anywhere' radio button. + self~newRadioButton(IDC_RB_ANYWHERE)~check + process = "ANYWHERE" + + -- Save a reference to the ok push button and the single-line edit control. + pbOk = self~newPushButton(IDOK) + eCommand = self~newEdit(IDC_EDIT_COMMAND) + + -- Fill the edit control with data so we can see the scrolling. + text = '' + do i = 1 to 300 + text ||= 'Line number' || '09'x || i || '09'x || 'Mouse Wheel Demonstation' || .endOfLine + end + eData~setText(text) + + +/** onMouseWheel() + * + * This is an event handler for the mouse wheel event. Three arguments are + * sent to the event handler by the ooDialog framework. + * + * @param state A list of keywords that indicate the keyboard and mouse button + * modifiers. The list of possible words is exactly: + * + * None Control lButton mButton rButton Shift xButton1 xButton2 + * + * The none keyword will always be by itself, otherwise, the list + * can consist of one or more of the keywords. + * + * @param pos A .Point object that represents the position of the mouse + * pointer on the screen. This is in screen co-ordinates, in + * pixels. + * + * @param mouse The mouse object that connected this event. For our purposes + * we don't need the mouse so we just ignore this argument. + * + * @param delta A whole number that represents the amount the scroll wheel was + * turned. The number will always be a multiple of 120 because + * that is what the operating system sends. If the number is + * positive, the user turned the wheel away from herself and + * indicates to scroll up. When negative the user turned the + * wheel towards himself, and indicates to scroll down. + * + * At this point in time (c. 2011) the OS sends the event + * notification for each notch of the scroll wheel and so delta + * will always be 120 or -120. + * + * Because of the 2 mouse~connectEvent() calls in initDialog() the method will + * only be called when the dialog is the active window and the multi-line edit + * control does *not* have the focus. We simply delegate to the maybeScroll() + * method, passing on 3 of the arguments and .false to indicate the edit control + * does not have the focus. + */ +::method onMouseWheel unguarded + use arg state, pos, mouse, delta + + return self~maybeScroll(delta, state, pos, .false) + + +/** onEditMouseWheel + * + * This is an event handler for the mouse wheel event. The arguments are + * explained in the comment header for onMouseWheel(). + * + * Because of the 2 mouse~connectEvent() calls in initDialog() this method will + * *only* be called when the edit control has the focus. + * + * We simply delegate to the maybeScroll() method, passing on the 3 arguments + * and .true to indicate the edit control has the focus. + */ +::method onEditMouseWheel unguarded + use arg state, pos, mouse, delta + + return self~maybeScroll(delta, state, pos, .true) + + +/** maybeScroll + * Based on the arguments, we determine whether to scroll or not. + * + * In all cases .true is returned, which is eventually returned by the + * event handler. This indicates that the event message was processed. + */ +::method maybeScroll private + expose process eData + use strict arg delta, state, pos, focused + + -- Eliminate some easy stuff + if process~abbrev("FOCUSED"), \ focused then return 0 + + select + when process~right(8) == "ANYWHERE" then return self~scroll(delta, state) + when process~right(6) == "DIALOG" then return self~scrollOnDialog(delta, state, pos) + when process == "ON_EDIT_OK" then return self~scrollOnControls(delta, state, pos) + when process == "FOCUSED_EDIT", focused then return self~scrollOnEdit(delta, state, pos) + otherwise do + return .true + end + end + -- End select + + +/** scrollOnDialog() + * + * Determines if the position of the cursor (pos) is over the dialog window. If + * it is, we scroll, otherwise we do not scroll. + * + * In all cases .true is returned, which is eventually returned by the + * event handler. This indicates that the event message was processed. + */ +::method scrollOnDialog private + use strict arg delta, state, pos + + if pos~inRect(self~windowRect) then return self~scroll(delta, state) + + return .true + +/** scrollOnEdit() + * + * Determines if the position of the cursor (pos) is over the multi-line edit + * control. If it is, we scroll, otherwise we do not scroll. + * + * In all cases .true is returned, which is eventually returned by the + * event handler. This indicates that the event message was processed. + */ +::method scrollOnEdit private + expose eData + use strict arg delta, state, pos + + if pos~inRect(eData~windowRect) then return self~scroll(delta, state) + + return .true + + +/** scrollOnControls() + * + * Determines if the position of the cursor (pos) is over one of the edit + * controls, or over the Ok button. If it is, we scroll, otherwise we do not + * scroll. + * + * In all cases .true is returned, which is eventually returned by the + * event handler. This indicates that the event message was processed. + */ +::method scrollOnControls private + expose eData pbOk eCommand + use strict arg delta, state, pos + + if pos~inRect(eData~windowRect) | pos~inRect(eCommand~windowRect) | - + pos~inRect(pbOk~windowRect) then do + return self~scroll(delta, state) + end + + return .true + + +/** scroll() + * + * This private method is where the scrolling is actually done. It is called + * by other methods that have determined the mouse is in the correct place for + * scrolling to happen. delta and state are the orignal arguments sent to the + * mouse wheel event handler. See onMouseWheel() and onEditMouseWheel() for + * the explanation of the arguments. + * + * Based on the arguments, we have the edit control scroll the appropriate + * amount. In all cases we return .true which is eventually returned by the + * event handler. This indicates that the event message was processed. + */ +::method scroll private + expose eData + use strict arg delta, state + + if delta < 0 then do + select + when state == 'None' then eData~scrollCommand("DOWN") + + when state~wordPos('Control') <> 0, state~wordPos('Shift') <> 0 then do + -- Scroll 3 pages down. + eData~scrollCommand('PAGEDOWN', 3) + end + + when state~wordPos('Control') <> 0 then do + -- Scroll page down. + eData~scrollCommand('PAGEDOWN') + end + + when state~wordPos('Shift') <> 0 then do + -- Scroll 3 lines down. + eData~scrollCommand('DOWN', 3) + end + + otherwise do + -- Ignore all others and scroll 1 line. + eData~scrollCommand("DOWN") + end + end + -- End select + end + else do + -- Same as above, but scroll up. + select + when state == 'None' then eData~scrollCommand("UP") + + when state~wordPos('Control') <> 0, state~wordPos('Shift') <> 0 then do + -- Scroll 3 pages down. + eData~scrollCommand('PAGEUP', 3) + end + + when state~wordPos('Control') <> 0 then do + -- Scroll page down. + eData~scrollCommand('PAGEUP') + end + + when state~wordPos('Shift') <> 0 then do + -- Scroll 3 lines down. + eData~scrollCommand('UP', 3) + end + + otherwise do + -- Ignore all others and scroll 1 line. + eData~scrollCommand("UP") + end + end + -- End select + end + + return .true + + +/** onRbSelect() + * + * This is the event handler for a button click on one of the radio buttons. + * + * With auto radio buttons, (which the radio buttons in this program are,) when + * a radio button is clicked, it is automatically set to the selected state. + * + * Each time a radio button becomes the selected button, we update the process + * variable. That way 'process' always reflects which radio button is currently + * selected. + * + * The event handler is sent five arguments. However the first two are left + * over from the old IBM ooDialog implementation and we ignore them. We only + * need the third 'id' argument, so we ignore the last two args also. + */ +::method onRbSelect + expose process + use arg , , id + + select + when id == .ConstDir[IDC_RB_ANYWHERE ] then process = "ANYWHERE" + when id == .ConstDir[IDC_RB_DIALOG ] then process = "DIALOG" + when id == .ConstDir[IDC_RB_ON_EDIT_OK ] then process = "ON_EDIT_OK" + when id == .ConstDir[IDC_RB_FOCUSED_ANYWHERE] then process = "FOCUSED_ANYWHERE" + when id == .ConstDir[IDC_RB_FOCUSED_DIALOG ] then process = "FOCUSED_DIALOG" + when id == .ConstDir[IDC_RB_FOCUSED_EDIT ] then process = "FOCUSED_EDIT" + otherwise + nop + end + -- End select + + +/** help() + * + * This is the event handler for the IDHELP command. Any button or menu item + * with the resource ID of IDHELP will generate the HELP command event. The + * ooDialog framework automatically connects the IDOK, IDCANCEL, and IDHELP + * commands to the ok(), cancel(), and help() methods in the dialog object. + * + * The default help() method does nothing. To do something the programmer over- + * rides the method in her subclass. Here we simply invoke the onHelp() method + * to do the work. + * + * Do not confuse the HELP command event with the help key (F1) event. + */ +::method help + self~onHelp + +/** onHelp() + * + * This is the event handler for the help key (F1) event. The event is + * generated when the user presses the F1 key. + * + * The programmer connects this event to a method in the Rexx dialog by using + * the connectHelp() method. Here in this event handler, we show a modal dialog + * with some help text. + * + * Do not confuse the help key (F1) event with the HELP command event. + */ +::method onHelp + .MouseDemoHelp~new(.application~srcDir'mouseWheel.rc', IDD_HELP)~execute("SHOWTOP") + + +/** class::MouseDemoHelp + * + * This is a very simple dialog subclass whose purpose is to display the help + * text for the Mouse Wheel Demonstration program. + * + * Note that we set up our own handlers for the mouse wheel event for the help + * text simply to provide more example code. There is really not much need to + * do this. The edit control by default handles the scrolling for the mouse + * wheel itself. There is not a compelling reason in this dialog to not simply + * let the edit control handle the scrolling for us. (Other than the reason + * mentioned, to provide more code example.) + */ +::class 'MouseDemoHelp' subclass RcDialog + +::method initDialog + expose newFont e visibleLines + + -- Connect the mouse wheel event to a method in this dialog. We don't specify + -- a method name, we'll just accept the default name of onMouseWheel. + .Mouse~new(self)~connectEvent('MOUSEWHEEL') + + e = self~newEdit(IDC_HELP_TEXT) + + -- In this case we have the edit control not process the mouse wheel, but + -- rather pass the message on to the dialog. The fourth optional parameter of + -- SENDTODLG is a keyword that causes the mouse wheel notfication to be + -- passed on up the parent / child window chain and not sent to the edit + -- control. + -- + -- The effect of this is that the edit control never even sees the + -- notification, allowing our onMouseWheel() method to handle all mouse wheel + -- notifications, not matter where the mouse is over our dialog. + .Mouse~new(e)~connectEvent('MOUSEWHEEL', 'NOOP', , "SENDTODLG") + + -- Create a mono-spaced font for the edit control that displays the help text. + newFont = self~createFontEx('Courier New', 9) + + -- Set the font of the edit control to our custom font, set the text of the + -- edit control to our help text. + e~setFont(newFont) + e~setText(getHelpText()) + + -- visibleLines is the number of visible lines in the edit control. It is + -- only used if the user scrolls the help text using the mouse wheel. So, we + -- use lazy evaluation. It is only calculated if needed. + visibleLines = 0 + + +/** onMouseWheel + * + * This is the event handler for the mouse wheel event. We connected the event + * to this method through the Mouse connectEvent() method in initDialog(). + * + * The comment header for the onMouseWheel() event handler in the maid dialog + * explains the arguments in detail. + * + * The system-wide wheelScrollLines parameter is used to indicate how much to + * scroll for 1 notch of a turn of the mouse wheel. The system default is 3, + * but the user can set this to what they want. + * + * Microsoft says this about the wheel scroll lines parameter: it is the + * suggested number of lines to scroll when there are no modifier keys; if the + * value is 0, no scrolling should be done; if the value is greater than the + * number of visible lines, or its value is WHEEL_PAGESCROLL, it should be + * interpreted as clicking once in the page down or page up area of the scroll + * bar. + */ +::method onMouseWheel unguarded + expose e visibleLines + use arg state, pos, mouse, delta + + if visibleLines == 0 then visibleLines = self~calcVisibleLines(e) + + if delta > 0 then direction = 'up' + else direction = 'down' + + scrollLines = .SPI~wheelScrollLines + + -- scrollLines is only meant to indicate the number of lines to scroll when + -- there are no modifier keys or mouse buttons. + if state \== 'None' then do + select + when state~wordPos("Shift") <> 0, state~wordPos('Control') <> 0 then do + if direction == 'up' then e~scrollCommand('PAGEUP', 3) + else e~scrollCommand('PAGEDOWN', 3) + return .true + end + + when state~wordPos('Shift') then do + if direction == 'up' then e~scrollCommand('UP', 3) + else e~scrollCommand('DOWN', 3) + return .true + end + + when state~wordPos('Control') then do + if direction == 'up' then e~scrollCommand('PAGEUP') + else e~scrollCommand('PAGEDOWN') + return .true + end + + otherwise do + -- Some other modifier, key or mouse, is active. There are a lot of + -- things we could do, but for simplicity we are going to just ignore + -- this. + return .false + end + end + -- End select + end + + -- No modifiers, we use the system scroll lines value to decide how much to + -- scroll. + select + when scrollLines == 0 then do + -- Indicates to not scroll + end + + when scrollLines == .SPI~WHEEL_PAGESCROLL then do + -- This setting indicates to scroll 1 page. + if direction == 'up' then e~scrollCommand('PAGEUP') + else e~scrollCommand('PAGEDOWN') + end + + when scrollLines > visibleLines then do + -- Scroll 1 page. + if direction == 'up' then e~scrollCommand('PAGEUP') + else e~scrollCommand('PAGEDOWN') + end + + otherwise do + -- Scroll the number of lines specified by wheel scroll lines parameter. + if direction == 'up' then e~scrollCommand('UP', scrollLines) + else e~scrollCommand('DOWN', scrollLines) + end + end + -- End select + + return .true + + +/** caclVisibleLines() + * + * Calculates the number of visible lines in the edit control. This is done + * by gettting the size of the edit control formatting rectangle in pixels and + * the size of a string in the edit controls in pixels. The height of the + * formatting rectangle is then divided by the height of a line of text. + * + * When getting the height of a line in the edit control, any string can be used + * because we only need the height of the string. The length does not matter. + * + * On my first try at this, I used the client rect of the edit control for the + * calculation. But, it was off by 1. The proper way to calculate the height + * is to use the formatting rectangle. The edit control does all its drawing + * within that rectangle. + */ +::method calcVisibleLines private + use strict arg editCtrl + + fRect = editCtrl~getRect + + height = fRect~bottom - fRect~top + lineHeight = editCtrl~getTextSizePX("Any string will do for this")~height + + -- Note that we return a whole number here, not a fraction. The number is + -- exactly the number of *whole* lines in the edit control. Quite often in a + -- dialog, a multi-line edit control will contain a partial line, (as does + -- this dialog.) + return height % lineHeight + +/** leaving() + * + * The leaving method is invoked automatically by the ooDialog framework + * immediately before the dialog is destroyed. + * + * At this point, the underlying Windows dialog still exists. This makes the + * leaving method the proper place to do clean up. Especially if some of the + * clean up, as does deleteFont(), requires the underlying dialog to exist. + * + * Here we delete the mono-spaced font created for the help text display. + */ +::method leaving + expose newFont + + self~deleteFont(newFont) + + +/** routine::getHelpText() + * + * This is convenience routine that returns the help text for the Mouse Wheel + * demonstration program. The help text is constructed here as a single string. + * + * The text could be contained in a file and read in when needed. To reduce the + * nubmer of files needed for the program, the text was just typed into the + * program file. + */ +::routine getHelpText + + txt = - +'' || .endOfLine || - +'' || .endOfLine || - +' The Mouse Wheel Demonstration' || .endOfLine || - +' =============================' || .endOfLine || - +'' || .endOfLine || - +' This demonstration program allows you to scroll the lines of text in the' || .endOfLine || - +' main edit control using the mouse wheel.' || .endOfLine || - +'' || .endOfLine || - +'' || .endOfLine || - +' Scrolling' || .endOfLine || - +' =========' || .endOfLine || - +'' || .endOfLine || - +' When the mouse wheel is rotated one notch, the text is scrolled one line.' || .endOfLine || - +' Rotating the mouse wheel away from yourself scrolls the text up, while' || .endOfLine || - +' rotating the wheel towards yourself scrolls the text down. When the text' || .endOfLine || - +' is scrolled to line 1, scrolling up stops. Likewise when the lines of' || .endOfLine || - +' text are scrolled all the way to the bottom, scrolling down stops.' || .endOfLine || - +'' || .endOfLine || - +' Holding down the control and or the shift keys while rotating the mouse' || .endOfLine || - +' wheel changes the amount of text scrolled by rotating one notch of the' || .endOfLine || - +' mouse wheel. This is summarized in the following table:' || .endOfLine || - +'' || .endOfLine || - +' Notches Key Lines' || .endOfLine || - +' Rotated Down Scrolled' || .endOfLine || - +' =======================================' || .endOfLine || - +' 1 None 1' || .endOfLine || - +' ---------------------------------------' || .endOfLine || - +' 1 Shift 3' || .endOfLine || - +' ---------------------------------------' || .endOfLine || - +' 1 Control 1 page' || .endOfLine || - +' ---------------------------------------' || .endOfLine || - +' 1 Control' || .endOfLine || - +' & 3 pages' || .endOfLine || - +' Shift' || .endOfLine || - +' ---------------------------------------' || .endOfLine || - +'' || .endOfLine || - +'' || .endOfLine || - +' Radio Buttons' || .endOfLine || - +' =============' || .endOfLine || - +'' || .endOfLine || - +' The radio buttons at the bottom of the dialog change how the position of' || .endOfLine || - +' the mouse pointer affects whether the text is scrolled, or not.' || .endOfLine || - +'' || .endOfLine || - +' Text is never scrolled unless the dialog has the input focus. This' || .endOfLine || - +' essentially means when the dialog is the active window.' || .endOfLine || - +'' || .endOfLine || - +' The following table assigns a number to each radio button according to' || .endOfLine || - +' the text of the radio button. The next table uses the radio button' || .endOfLine || - +' number to describe its function.' || .endOfLine || - +'' || .endOfLine || - +' Radio Radio' || .endOfLine || - +' Button Button' || .endOfLine || - +' # Text' || .endOfLine || - +' =========================================================================' || .endOfLine || - +' 1 Mouse is anywhere' || .endOfLine || - +' -------------------------------------------------------------------------' || .endOfLine || - +' 2 Mouse is over dialog' || .endOfLine || - +' -------------------------------------------------------------------------' || .endOfLine || - +' 3 Mouse over edit controls / Ok button' || .endOfLine || - +' -------------------------------------------------------------------------' || .endOfLine || - +' 4 Multi-line edit focused / mouse anywhere' || .endOfLine || - +' -------------------------------------------------------------------------' || .endOfLine || - +' 5 Multi-line edit focused / mouse over dialog' || .endOfLine || - +' -------------------------------------------------------------------------' || .endOfLine || - +' 6 Multi-line edit focused / mouse over edit control' || .endOfLine || - +' -------------------------------------------------------------------------' || .endOfLine || - +'' || .endOfLine || - +'' || .endOfLine || - +' Radio Text is' || .endOfLine || - +' Button scrolled' || .endOfLine || - +' # when:' || .endOfLine || - +' =========================================================================' || .endOfLine || - +' 1 The mouse pointer is anywhere on the screen. It does not have' || .endOfLine || - +' to be over the dialog at all.' || .endOfLine || - +' -------------------------------------------------------------------------' || .endOfLine || - +' 2 Only when the mouse pointer is over dialog. If the pointer is' || .endOfLine || - +' moved outside of the dialog, the scrolling stops.' || .endOfLine || - +' -------------------------------------------------------------------------' || .endOfLine || - +' 3 Only when the mouse pointer is directly over one of the two' || .endOfLine || - +' edit controls, or directly over the Ok button.' || .endOfLine || - +' -------------------------------------------------------------------------' || .endOfLine || - +' 4 First the multi-line edit control must have the focus. If any' || .endOfLine || - +' other control has the focus, text is not scrolled. The mouse' || .endOfLine || - +' pointer can be anywhere on the screen.' || .endOfLine || - +' -------------------------------------------------------------------------' || .endOfLine || - +' 5 The multi-line edit control must have the focus. The mouse' || .endOfLine || - +' pointer must be directly over the dialog.' || .endOfLine || - +' -------------------------------------------------------------------------' || .endOfLine || - +' 6 The multi-line edit control must have the focus. The mouse' || .endOfLine || - +' pointer must be directly over the multi-line edit control.' || .endOfLine || - +' -------------------------------------------------------------------------' || .endOfLine || - +'' || .endOfLine || - +'' || .endOfLine || - +' Edit Controls' || .endOfLine || - +' =============' || .endOfLine || - +'' || .endOfLine || - +' Large, top, edit control:' || .endOfLine || - +' -------------------------' || .endOfLine || - +' This contains the text that is scrolled. You can type into this control' || .endOfLine || - +' to add or remove lines.' || .endOfLine || - +'' || .endOfLine || - +' Small, bottom, edit control labeled Command:' || .endOfLine || - +' --------------------------------------------' || .endOfLine || - +' This control serves no purpose, other than to take up real estate in the' || .endOfLine || - +' dialog. You can typ in this control, but it does nothing.' || .endOfLine || - +'' || .endOfLine || - +'' || .endOfLine || - +' Push Buttons' || .endOfLine || - +' ============' || .endOfLine || - +'' || .endOfLine || - +' Ok button -> Closes the dialog' || .endOfLine || - +'' || .endOfLine || - +' Help button -> Shows this help.' || .endOfLine + + return txt diff --git a/modules/windows/oodialog/mouse/nflPlayers.txt b/modules/windows/oodialog/mouse/nflPlayers.txt new file mode 100644 index 0000000..1041a0e --- /dev/null +++ b/modules/windows/oodialog/mouse/nflPlayers.txt @@ -0,0 +1,113 @@ +# This list of top NFL players was compiled by Berkeley Miesfeld. +# +# +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +Tom Brady, New England Patriots, QB, ***** +Cam Newton, Carolina Panthers, QB, ***+ +Matt Hasselbeck, Tennessee Titans, QB, **+ +Tim Tebow, Denver Broncos, QB, *** +Chris Johnson, Tennessee Titans, RB, ***+ +Maurice Jones-Drew, Jacksonville Jaguars, RB, ***** +Frank Gore, San Francisco 49ers, RB, **** +Marshawn Lynch, Seattle Seahawks, RB, *** +Vonta Leach, Baltimore Ravens, FB, ***** +Ovie Mughelli, Atlanta Falcons, FB, ***** +Leonard Weaver, Philadelphia Eagles, FB, ***** +Tony Richardson, New York Jets, FB, ***** +Rob Gronkowski, New England Patriots, TE, ****+ +Vernon Davis, San Francisco 49ers, TE, *** +Kellen Winslow, Tampa Bay Buccaneers, TE, **+ +Brent Celek, Philadelphia Eagles, TE, ***- +Wes Welker, New England Patriots, WR, ***** +Percy Harvin, Minnesota Vikings, WR, *** +Dwayne Bowe, Kansas City Chiefs, WR, ****- +Hakeem Nicks, New York Giants, WR, ***- +Kris Dielman, San Diego Chargers, G, ***** +Carl Nicks, New York Giants, G, ***** +Steve Hutchinson, Minnesota Vikings, G, **** +Michael Roos, Tennessee Titans, T, ***+ +Tyson Clabo, Atlanta Falcons, T, *** +Ryan Clady, Denver Broncos, T, *** +Nick Mangold, New York Jets, C, ***** +Andre Gurode, Dallas Cowboys, C, **** +Maurkice Pouncey, Steelers, C, ***+ +Johnathan Babineax, Tennessee Titans, DT, ***+ +Vince Wilfork, New England Patriots, DT, ****+ +Richard Seymour, Oakland Raiders, DT, **** +Domata Peko, Cincinnati Bengals, DT, ***+ +Ndamukong Suh, Detriot Lions, DT, ****- +Jay Ratliff, Dallas Cowboys, DT, **** +Antonio Garay, San Diego Chargers, DT, *** +Jared Allen, Minnesota Vikings, DE, ***** +Jason Babin, Philadelphia Eagles, DE, ***** +Haloti Ngata, Baltimore Ravens, DE, **** +Jason Pierre-Paul, New York Giants, DE, ***+ +Osi Umemyiora, New York Giants, DE, **** +Julius Peppers, Chicago Bears, DE, ***** +James Laurinitis, Saint Louis Rams, LB, *** +Daryl Smith, Jacksonvile Jaguars, LB, **** +Clay Matthews, Green Bay Packers, LB, ***** +Jon Beason, Carolina Panthers, LB, ***** +Takeo Spikes, San Diego Chargers, LB, ***- +Brian Urlacher, Chicago Bears, LB, **** +David Harris, New York Jets, LB, ***+ +Rolando McClain, Oakland Raiders, LB, ****- +Jerod Mayo, New England Patriots, LB, ****- +London Fletcher, Washington Redskins, LB, *****- +Michael Griffin, Tennessee Titans, S, ****+ +Oj Atogwe, Washington Redskins, S, ****+ +Laron Landry, Washington Redskins, S, ****+ +Adrian Wilson, Arizona Cardinals, S, ***** +Bob Sanders, San Diego Chargers, S, *** +Tyvon Branch, Oakland Raiders, S, ***+ +Nnamdi Asumogha, Philadelphia Eagles, CB, ***** +Darrelle Revis, New York Jets, CB, ***** +Asante Samuel, Philadelphia Eagles, CB, ****+ +Charles Woodson, Green Bay Packers, CB, ****+ +Chris Gamble, Carolina Panthers, CB, ***+ +Cortland Finnegan, Tennessee Titans, CB, **** +Antoine Winfield, Minnesota Vikings, CB, ****+ +Mike Nugent, Cincinnati Bengals, K, **** +David Akers, San Francisco 49ers, K, ***** +Billy Cundiff, Baltimore Ravens, K, ****+ +Adam Vinateri, Indianapolis Colts, K, *** +Shane Lechler, Oakland Raiders, P, ***** +Andy Lee, San Francisco 49ers, P, ***** +Pat McAfee, Indianapolis Colts, P, ***+ +Britton Colquitt, Denver Broncos, P, **** diff --git a/modules/windows/oodialog/oleinfo/help.txt b/modules/windows/oodialog/oleinfo/help.txt new file mode 100644 index 0000000..d68792f --- /dev/null +++ b/modules/windows/oodialog/oleinfo/help.txt @@ -0,0 +1,164 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + *** OLEINFO Help File *** + + Contents: + + 1. What is OLEINFO? + + 2. Using OLEINFO + 2.1 ProgID + 2.2 Look up + 2.3 Selecting a method + 2.4 Invoking a method + + 3. Disclaimer + + +1. What is OLEINFO? + +This REXX script helps you to gather information about the methods of an OLE +object. This is done through the use of the GetKnownMethods method of the +REXX OLE object. A comprehensive introduction to OLE can be found in the +Open Object REXX online documentation. + +GetKnownMethods retrieves information from the so-called "Type Library" of the +OLE object, which should be - but is not always - installed together with the +OLE object. + +To execute this sample the ooDialog extension of Open Object REXX is needed. +ooDialog is part of Open Object REXX for Windows + +2. Using OLEINFO + +First you have to specify the ProgID of the OLE object you want to +instantiate. If necessary, consult the documentation to find out what the +ProgID is. To specify the ProgID, either enter it into the ProgID text field +and press Enter, or look it up from the registry by using the Look Up button. +Instructions follow on how to do this. After the object has been created +successfully, a list with all its methods, properties, and events is displayed +in the main list window. The icons that are shown to the left of the item +names signify the following: + +Green down arrow: This is a method. +Yellow right arrow: This is a 'property get.' +Red left arrow: This is a 'property put.' +Blue waves: This is an event. + +For more information see your documentation of the OLE object. + + +2.1 ProgID + +If you already know the ProgID of the object you want to instantiate, simply +type it into the ProgID text field, and press Enter. + +Example: Enter "InternetExplorer.Application" and press Enter to start + Microsoft Internet Explorer, if it is installed on your system. + + +2.2 Look Up + +To search the registry for OLE objects, click the Look Up button. All entries +in HKEY_CLASSES_ROOT\CLSID with a VersionIndependentProgID (or ProgID) will be +put into the objects list. To instantiate an object, select it and click OK. +You can use the Search button to look for a specific entry; it searches the +list for entries beginning with the string you specify. The search is not +case-sensitive. + +Note: Not all entries in this list are useful. You can only instantiate OLE + objects that support the automation interface. + + +2.3 Selecting a method + +All the methods that are returned will be displayed in alphabetical order in +the "List of methods". Click a selected item to get detailed information. +This information is shown in the "Details" section, as follows: + +* Method signature + This displays the name of the method and the argument that it takes. What is + displayed depends on the options chosen in the check boxes in the "Show" line. + In the default setting, only the method name and the names of the parameters + are displayed. + The check boxes have the following functionality: + + - Types + Shows the OLE types of the method, its return type and argument types. + Conversion to and from these types is normally done automatically by the + REXX OLEObject. The types may give you an indication of what kind of object + to expect. + + Examples: + VT_BOOL <=> .TRUE or .FALSE in REXX + VT_BSTR <=> A REXX string. + VT_Ix <=> A whole number (x=1, x=2, x=4, or x=8). + VT_Rx <=> A real number (x=1, x=2, x=4, or x=8). + VT_VARIANT <=> This can be any REXX object representable as a VARIANT. + VT_DISPATCH <=> Another OLE object. + + - Flags + Shows the flags for the method arguments. These can be: + + in: This argument is the input to the method. + out: This argument creates output. See the documentation on 'out' + parameters. + opt: This argument is optional. + + Any combination of these flags can be used. + + - Member ID + Displays the so-called MemID of a method. It is used internally only. + +* Documentation + If a textual description of what the method does is available, it will be + displayed in this line. (Use the cursor to scroll to parts of the text that + do not fit into the visible area.) + + +2.4 Invoking a method + +To invoke a method of the OLE object, double-click the desired method in the +list of methods. An invocation window will appear, and here you can enter data. +If there are 'out' parameters you will not be able to change these fields. +Note that if you try to invoke a method by using wrong data, the entire +program may stop and give you an error message. The results of an invocation +will be displayed in another window. This will include one line showing the +result object, and also a list giving the output of possible 'out' parameters. +If an OLE object is returned, you can use this as the new object that the +viewer displays for you. diff --git a/modules/windows/oodialog/oleinfo/icons.bmp b/modules/windows/oodialog/oleinfo/icons.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a75daf95503513376d9a7c091358a39dc4ba5b3b GIT binary patch literal 601 zcmbtQF%p6>5L_H*R1p1!@342q%BPq%9h9_m)K>O16qd~73;u$JnYbZ9Bw*zwdzaj8 zE_Zjn+*au1PJJS-#GVMSrUu>t@H$v@j!{W~8&X + +#define BITMAP_2 2 +#define DIALOG_5 5 +#define DIALOG_4 4 +#define HelpDialog 4714 +#define DIALOG_3 3 +#define ResultDialog 4713 +#define DIALOG_2 2 +#define RegistryDialog 4712 +#define DIALOG_1 1 +#define MainDialog 4711 + +MainDialog DIALOG 6, 15, 294, 318 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Open Object Rexx OLE/ActiveX Object Viewer" +FONT 10, "MS Shell Dlg" +{ + PUSHBUTTON "Exit", 200, 8, 296, 50, 14 + PUSHBUTTON "Help", IDHELP, 236, 296, 50, 14 + LTEXT "ProgID", -1, 8, 8, 52, 9 + LTEXT "Name", -1, 8, 22, 52, 8 + LTEXT "Documentation", -1, 8, 36, 52, 9 + EDITTEXT 101, 68, 22, 162, 11, ES_AUTOHSCROLL | ES_READONLY | WS_BORDER | WS_TABSTOP + EDITTEXT 102, 68, 36, 162, 11, ES_AUTOHSCROLL | ES_READONLY | WS_BORDER | WS_TABSTOP + PUSHBUTTON "Look up", 103, 236, 6, 50, 14 + GROUPBOX "List of methods, properties and events", 200, 8, 84, 278, 136, BS_GROUPBOX + GROUPBOX "Details", 201, 8, 224, 278, 60, BS_GROUPBOX + EDITTEXT 105, 72, 236, 208, 11, ES_AUTOHSCROLL | ES_READONLY | WS_BORDER | WS_TABSTOP + EDITTEXT 106, 72, 250, 208, 11, ES_AUTOHSCROLL | ES_READONLY | WS_BORDER | WS_TABSTOP + LTEXT "Method signature", -1, 12, 236, 58, 9 + LTEXT "Documentation", -1, 12, 250, 58, 9 + LTEXT "Show:", -1, 12, 268, 58, 9 + AUTOCHECKBOX "Types", 107, 72, 268, 32, 9 + AUTOCHECKBOX "Flags", 108, 116, 268, 36, 9 + AUTOCHECKBOX "Member ID", 109, 160, 268, 48, 9 + GROUPBOX "Progress", 202, 8, 52, 278, 28, BS_GROUPBOX + CONTROL "Progress", 110, "msctls_progress32", WS_CHILD | WS_VISIBLE, 12, 62, 270, 12 + CONTROL "", 104, "SysListView32", LVS_LIST | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 13, 95, 268, 121 + COMBOBOX 100, 67, 8, 164, 284, CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP +} + +RegistryDialog DIALOG 6, 15, 198, 219 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Registry Information" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 8, 196, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 140, 196, 50, 14 + LTEXT "ProgIDs from the registry", -1, 8, 8, 96, 12 + LISTBOX 200, 8, 24, 180, 164, LBS_STANDARD + PUSHBUTTON "Search", 201, 74, 196, 50, 14 +} +ResultDialog DIALOG 6, 15, 251, 219 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Result of method invocation" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 100, 196, 50, 14 + LTEXT "Return Value", -1, 8, 8, 48, 9 + EDITTEXT 400, 64, 8, 174, 11, ES_AUTOHSCROLL | ES_READONLY | WS_BORDER | WS_TABSTOP + GROUPBOX "Out Parameters", 402, 8, 24, 232, 160, BS_GROUPBOX + LISTBOX 401, 16, 36, 216, 144, LBS_NOTIFY | WS_BORDER | LBS_USETABSTOPS | WS_BORDER | WS_VSCROLL +} +HelpDialog DIALOG 6, 15, 345, 208 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Help" +FONT 10, "Fixedsys" +{ + DEFPUSHBUTTON "OK", IDOK, 290, 188, 50, 14 + EDITTEXT 500, 4, 7, 336, 176, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_BORDER | WS_VSCROLL | WS_TABSTOP +} + + diff --git a/modules/windows/oodialog/oleinfo/oleinfo.rex b/modules/windows/oodialog/oleinfo/oleinfo.rex new file mode 100755 index 0000000..e2b1a10 --- /dev/null +++ b/modules/windows/oodialog/oleinfo/oleinfo.rex @@ -0,0 +1,654 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: OLEINFO.REX */ +/* Type: Open Object Rexx Script using ooDialog */ +/* Resource: OLEINFO.RC */ +/* */ +/* Description: */ +/* A "small" browser for OLE objects */ +/* */ +/****************************************************************************/ + +discard = locate() + +/* start the main dialog */ +MainDialog = .OLEINFO~new +if MainDialog~InitCode = 0 then do + rc = MainDialog~Execute("SHOWTOP") +end + +exit /* leave program */ + +::requires "ooDialog.cls" /* contains the ooDialog classes */ +::requires "WINSYSTM.CLS" /* used for registry lookup */ + +/*****************************************/ +/* This routine creates the OLE object */ +/* the code has been placed outside the */ +/* object code to safely catch any error */ +/* during creation of the OLE object */ +/*****************************************/ +::routine createObject + use arg target, name + target~currentObject=.nil + signal on syntax name returnToObject + target~currentObject=.OLEObject~new(name,"NOEVENTS") + signal on syntax + return +returnToObject: + signal on syntax + call RxMessageBox "Error" rc":" errortext(rc)||'0a'x||condition('o')~message, "Error", "OK", "EXCLAMATION" + return + +/*******************************************/ +/* This routine calls a method of the OLE */ +/* object. The code has been placed */ +/* outside the object code to safely catch */ +/* any error during the invocation */ +/*******************************************/ +::routine callMethod + use arg target, method, self + resultOfCall = "" + signal on syntax name callFailed + interpret "resultOfCall = target~"method + signal on syntax + return resultOfCall +callFailed: + call RxMessageBox "Error" rc":" errortext(rc)||'0a'x||condition('o')~message, "Error", "OK", "EXCLAMATION" + self~lastError=rc + signal on syntax + return resultOfCall + + +/**************************/ +/* Main Dialog of OLEINFO */ +/**************************/ +::class OLEINFO subclass UserDialog + +::method Init + expose cache + forward class (super) continue /* call parent constructor */ + InitRet = Result + + cache = .nil + /* load main dialog */ + if self~Load(.application~srcDir"OLEINFO.rc", 4711 ) \= 0 then do + self~InitCode = 1 + return 1 + end + + /* Connect dialog control items to class methods */ + self~connectButtonEvent(200, "CLICKED", "MyOk") + self~connectButtonEvent(103, "CLICKED", "Lookup") + + self~connectComboBoxEvent(100,"SELCHANGE","Ok") + self~connectListViewEvent(104,"ACTIVATE","selectDoubleClick") + self~connectListViewEvent(104,"CHANGED","selectionChange") + + self~connectButtonEvent(107, "CLICKED", "selectionChange") + self~connectButtonEvent(108, "CLICKED", "selectionChange") + self~connectButtonEvent(109, "CLICKED", "selectionChange") + + self~currentObject = .nil + self~currentObjectName = "" + return InitRet + +::method InitDialog + self~newListView(104)~setImageList(self~getImages, SMALL) + cb = self~newComboBox(100) + default = .array~of("InternetExplorer.Application","Excel.Application","Freelance.Application",, + "Notes.NotesSession","Lotus123.Workbook","Outlook.Application",, + "Word.Application","WordPro.Application","Access.Application") + do i over default + cb~add(i) + end + + /* Method Ok will be called if enter is pressed in dialog */ +::method Ok + cb = self~newComboBox(100) + if cb \= .nil then do + OLEID = cb~Title /* get ProgID or ClassID of OLE Object */ + if OLEID \= self~currentObjectName then do + call createObject self, OLEID + if self~currentObject \= .nil then do + self~currentObjectName=OLEID + self~updateView + end + else do + call RxMessageBox "Could not create OLE object", "Error", "OK", "EXCLAMATION" + cb~title = self~currentObjectName + end + end + end + return 0 /* don't leave dialog, this is done via method MyOk */ + + /* Method MyOk is connected to item 200 */ +::method MyOk + return self~OK:super /* make sure self~Validate is called and self~InitCode is set to 1 */ + + /* Method Help is connected to item 9 */ +::method Help + self~Help:super + file = .stream~new(.application~srcDir"help.txt") + data.500 = file~charin(,file~chars) + file~close + temp = .HelpDialog~new(data.) + if temp~InitCode = 0 then do + rc = temp~execute("SHOWTOP") + end + + /* Method Lookup is connected to item 103 */ +::method Lookup + expose cache + + self~Cursor_Wait + + progressBar = self~newProgressBar(110) + if cache == .nil then do + cache = .list~new + registry = .WindowsRegistry~new + if registry~InitCode \= 0 then return /* no access to registry? return */ + handle = registry~open(registry~classes_root, "CLSID", "READ") + + clslist. = registry~query(handle) + + registry~list(handle,info.) + + if progressBar \= .nil then do + progressBar~SetStep(1) + progressBar~SetRange(0,clslist.subkeys) + end + + do i =1 to clslist.subkeys + temphandle = registry~open(handle, info.i, "READ") + if temphandle \= 0 then do + templist. = registry~query(temphandle) + value = self~getProgID(registry,temphandle,progressBar) + registry~close(temphandle) + if value \= .nil then cache~insert(value) + end + end + registry~close(handle) + end + + if progressBar \= .nil then progressBar~SetPos(0) + self~Cursor_Arrow + + + picked = "" + temp = .RegistryDialog~new(,cache) + if temp~InitCode = 0 then do + rc = temp~execute("SHOWTOP") + if rc =1 then do + combo = self~newComboBox(100) + combo~title = temp~data200 + picked = combo~title + self~ok + end + end + cb = self~newComboBox(100) + if cb \= .nil then do + cb~DeleteAll + do i over cache + cb~add(i) + end + if picked \== "" then cb~title = picked + end + + /* extract ProgID from registry */ +::method getProgID + use arg registry, handle, progressBar + res = .nil + + /* try to get a version independent ProgID first */ + temphandle = registry~open(handle, "VersionIndependentProgID", "READ") + + if progressBar \= .nil then progressBar~step + + if temphandle \= 0 then do + registry~listvalues(temphandle,info.) + + res = info.1.data + + registry~close(temphandle) + end + else do + /* this failed, so maybe there's a "normal" ProgID? */ + temphandle = registry~open(handle, "ProgID", "READ") + + if temphandle \= 0 then do + registry~listvalues(temphandle,info.) + + res = info.1.data + + registry~close(temphandle) + end + end + + return res + + +::method currentObject ATTRIBUTE /* store the current object */ +::method currentObjectName ATTRIBUTE /* store object's name */ + + /* update the list of methods and events */ +::method updateView + expose indexStem. methods. events. + lc = self~newListView(104) + if lc \= .nil then do + methods. = self~currentObject~GetKnownMethods /* retrieve info on methods */ + if methods. = .nil then do + temp = RxMessageBox("OLE Object did not return any information on known methods.","Information","OK","INFORMATION") + lc~DeleteAll /* remove all items from list */ + return + end + events. = self~currentObject~GetKnownEvents /* retrieve info on events */ + if events. = .nil then events.0 = 0 + + lc~DeleteAll /* remove all items from list */ + if var("methods.!LIBNAME") = 1 then + self~newEdit(101)~title = methods.!LIBNAME + else + self~newEdit(101)~title = "unavailable" + if var("methods.!LIBDOC") = 1 then + self~newEdit(102)~title = methods.!LIBDOC + else + self~newEdit(102)~title = "unavailable" + + /* collect the indices of the info stem ordered according to their method names */ + indexStem.0 = 0 + + self~Cursor_Wait + pbc = self~newProgressBar(110) + if pbc \= .nil then do + pbc~SetStep(1) + pbc~SetRange(0,methods.0 + events.0) + end + + do i = 1 to methods.0 + events.0 + if i <= methods.0 then do + /* add method name to list box */ + if methods.i.!INVKIND \= 4 then + j = lc~add(methods.i.!NAME, (methods.i.!INVKIND)%2) + else /* this is a property put, symbolize with "=" */ + j = lc~add(methods.i.!NAME||"=",2) + end + else do + k = i - methods.0 + j = lc~add(events.k.!NAME, 3) + end + + j=j+1 + if i \= j then do + do k = indexStem.0 to j by -1 + t = k + 1 + indexStem.t = indexStem.k + end + indexStem.j = i + end + else + indexStem.i = i + indexStem.0 = indexStem.0 + 1 + if pbc \= .nil then pbc~Step + end + self~Cursor_Arrow + if pbc \= .nil then pbc~SetPos(0) + end + + + /* displays information on the selected method */ +::method selectionChange + expose indexStem. methods. events. + + listbox=self~newListView(104) + + j = 1 + listbox~Selected + if j < 1 then return /* return if nothing was selected */ + i = indexStem.j + + types = self~getCheckBoxData(107) + flags = self~getCheckBoxData(108) + + if i > methods.0 then do + workstem. = events. + i = i - methods.0 + infostring = "" + end + else do + workstem. = methods. + memberID = self~getCheckBoxData(109) + /* show member ID? */ + if memberID \= 0 then + infostring = "['"||workstem.i.!MEMID||"'x] " + else + infostring = "" + /* show return type? */ + if types \= 0 then + infostring = infostring||workstem.i.!RETTYPE||" " + end + + if methods.i.!INVKIND = 4 then /* property put */ + infostring = infostring||workstem.i.!NAME||"=" + else /* normal method or property get */ + do + /* build method signature with name(...) */ + infostring = infostring||workstem.i.!NAME + do j = 1 to workstem.i.!PARAMS.0 + if j = 1 then infostring = infostring||"(" + /* show flags? */ + if flags \= 0 then + infostring = infostring||workstem.i.!PARAMS.j.!FLAGS||" " + /* show types? */ + if types \= 0 then + infostring = infostring||workstem.i.!PARAMS.j.!TYPE||" " + /* show name of argument */ + infostring = infostring||workstem.i.!PARAMS.j.!NAME + if j < workstem.i.!PARAMS.0 then + infostring = infostring||", " + else infostring = infostring||")" + end + end + + /* set string to dialog */ + signature = self~newEdit(105) + if signature \= .nil then + signature~title = infostring + desc = self~newEdit(106) + /* show documentation if available */ + if desc \= .nil then do + interpret 'exists = var("workstem.'i'.!DOC")' + if exists = 1 then + desc~title = workstem.i.!DOC + else + desc~title="unavailable" + end + + /* invoke method */ +::method selectDoubleClick + expose indexStem. methods. + + listbox=self~newListView(104) + + j = 1 + listbox~Selected + i = indexStem.j + + if i > methods.0 then do + call RxMessageBox "This is an event!"||'0a'x||"Build a subclass of OLEObject and add a method with", + "this name if you wish REXX to call it when this event occurs.", "Information", "OK", "EXCLAMATION" + return + end + + params.0 = methods.i.!PARAMS.0 + do j = 1 to params.0 + params.j.!NAME = methods.i.!PARAMS.j.!NAME + params.j.!FLAGS = methods.i.!PARAMS.j.!FLAGS + params.j.!TYPE = methods.i.!PARAMS.j.!TYPE + end + + aDialog=.invokeDialog~new(,params.) + aDialog~create(100,100,200,26+13*params.0,"Method invocation:" methods.i.!NAME) + rc = aDialog~execute("showtop") + if rc = 1 then do + execString = methods.i.!name + usesOutParms = .FALSE + self~LastError = 0 + /* method call? */ + if methods.i.!INVKIND = 1 then do + if params.0 > 0 then execString = execString"(" + do i = 1 to params.0 + interpret "value = aDialog~param"i + execString = execString || value + if i < params.0 then execString = execString", " + if params.i.!FLAGS~pos("out") > 0 then usesOutParms = .TRUE + end + if params.0 > 0 then execString = execString")" + resultOfCall = callMethod(self~currentObject, execstring, self) + end + /* property put? */ + if methods.i.!INVKIND = 4 then do + value = aDialog~param1 /* can only have one argument */ + interpret "self~currentObject~"execString "=" value + resultOfCall = "" + end + /* property get? */ + if methods.i.!INVKIND = 2 then do + interpret "resultOfCall = self~currentObject~"execString + end + + if usesOutParms = .TRUE then + outp = self~currentObject~GetOutParameters + else + outp = .nil + + if self~LastError \= 0 then call RxMessageBox ERRORTEXT(self~LastError), "Error", "OK", "EXCLAMATION" + else do + temp = .ResultDialog~new(resultOfCall,outp) + if temp~initcode = 0 then do + temp~execute("showtop") + /* if useOLEobject attribute is filled in, change browser to this object */ + if temp~useoleobject \= .nil then do + self~currentObject = temp~useOLEobject + self~currentObjectName = "??? (from execution)" + self~newComboBox(100)~title = self~currentObjectName + self~updateView + end + end + end + + end + +::method getImages private + image = .Image~getImage(.application~srcDir"icons.bmp") + imageList = .ImageList~create(.Size~new(16, 12), COLOR4, 6, 0) + if \image~isNull, \imageList~isNull then do + imageList~add(image) + image~release + return imageList + end + return .nil + +::method LastError ATTRIBUTE + + + +/*************************************/ +/* Dialog for invoking an OLE method */ +/*************************************/ +::CLASS invokeDialog SUBCLASS UserDialog + +::METHOD resultObject ATTRIBUTE /* takes the result of the invocation */ + +::METHOD init + expose params. + use arg initstem., params. + self~init:super + +::METHOD DefineDialog + expose params. + + self~DefineDialog:super + + do i = 1 to params.0 + self~createEdit(300+i, 64, -5+(13*i), 128, 11, "AUTOSCROLLH", "Param"i) + self~createStaticText(-1, 8, -5+(13*i), 56, 11, , params.i.!NAME) + end + self~createOkCancelRightBottom + +::METHOD InitDialog + expose params. + self~resultObject = .nil + do i = 1 to params.0 + /* plain out parameters can not be edited */ + if params.i.!FLAGS = "[out]" then do + interpret "self~Param"i"='.NIL'" + self~newEdit(300+i)~disable + end + /* set .true if BOOL expected */ + if params.i.!TYPE = "VT_BOOL" then interpret "self~param"i"='.TRUE'" + /* set empty string if string expected */ + if params.i.!TYPE = "VT_BSTR" then interpret "self~param"i"='""""'" + end + + +::METHOD ok + return self~OK:super /* make sure self~Validate is called and self~InitCode is set to 1 */ + + + + + +/*******************************************************/ +/* Dialog that shows the result of a method invocation */ +/*******************************************************/ +::class ResultDialog subclass UserDialog + +::method Init + expose outarray + use arg rvalue, outarray + InitRet = self~init:super + + if self~Load(.application~srcDir"OLEINFO.rc", 4713 ) \= 0 then do + self~InitCode = 1 + return 1 + end + + self~data400=rvalue~string + if self~data400 = "an OLEOBJECT" then self~useOLEobject = rvalue + else self~useOLEobject = .nil + return InitRet + +::method InitDialog + expose outarray + + lc = self~newListBox(401) + + if outarray \= .nil then do + if lc \= .nil then do + i = 1 + do j over outarray + lc~add(i||'09'x||j~string) + i = i + 1 + end + end + end + else + if lc \= .nil then do lc~add("object did not return out parameters") + end + +::METHOD ok + if self~useOLEobject \= .nil then do + keep = RxMessageBox("An OLE object was returned from the method invocation. Do you want to use it as the active object?","Question","OKCANCEL","QUESTION") + if keep \= 1 then self~useOLEobject = .nil + end + return self~ok:super + +::method useOLEobject ATTRIBUTE + + + + + + +/********************************************************/ +/* Dialog that shows all ProgIDs obtained from Registry */ +/********************************************************/ +::class RegistryDialog subclass UserDialog + +::method Init + expose cache + use arg stem., cache + forward class (super) continue /* call parent constructor */ + InitRet = Result + + if self~Load(.application~srcDir"OLEINFO.rc", 4712 ) \= 0 then do + self~InitCode = 1 + return 1 + end + self~connectListBoxEvent(200, "DBLCLK", "selectDoubleClick") + self~connectButtonEvent(201, "CLICKED", "search") + + return InitRet + +::method GetCache + expose cache + return cache + +::method InitDialog + expose cache + lc = self~newListBox(200) + if lc \= .nil then do + do item over cache + lc~add(item) + end + end + +::method OK + res = self~OK:super + return res + + /* double clicking in the list closes this dialog window */ +::method selectDoubleClick + self~OK /* make sure self~Validate is called and self~InitCode is set to 1 */ + +::method search + dlg = .InputBox~new("String:", "String search", "", 150) + value = dlg~Execute + drop dlg + + lb = self~newListBox(200) + startindex = lb~selectedindex + lb~selectindex(lb~find(value,startindex,0)) + + + +/******************************/ +/* Dialog that shows the help */ +/******************************/ +::class HelpDialog subclass UserDialog + +::method Init + forward class (super) continue /* call parent constructor */ + InitRet = Result + + if self~Load(.application~srcDir"OLEINFO.rc", 4714 ) \= 0 then do + self~InitCode = 1 + return 1 + end + + return InitRet diff --git a/modules/windows/oodialog/ooDraw.h b/modules/windows/oodialog/ooDraw.h new file mode 100644 index 0000000..4cc9c8b --- /dev/null +++ b/modules/windows/oodialog/ooDraw.h @@ -0,0 +1,50 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2010-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* Symbolic resource IDs for the ooDraw (oodraw.rex) program. */ + +#define IDC_PB_DRAW 100 +#define IDC_PB_INTERRUPT 101 + +#define IDC_PB_BRUSH_RECTANGLES 110 +#define IDC_PB_PEN_RECTANGLES 120 +#define IDC_PB_PIXELS 130 +#define IDC_PB_STAR_LINES 140 +#define IDC_PB_RANDOM_LINES 150 +#define IDC_PB_RANDOM_SQUARES 160 +#define IDC_PB_ELLIPSES 170 + diff --git a/modules/windows/oodialog/ooRexxTry/doc/ooRexxTry.pdf b/modules/windows/oodialog/ooRexxTry/doc/ooRexxTry.pdf new file mode 100644 index 0000000000000000000000000000000000000000..afac7f0689effeef8ed5e369d8583aa8d89ccc54 GIT binary patch literal 20963 zcmeHv1yodB*DwNtAfbYY5(5k{)F2&#g@AMlNF&nHAky7RBi$g< zA|)9A9neR8p6C7E@BM16f30^|mwWC$=bn9boOAcyCz#b_skmkpjpn}ANkncaJ0O&Xcvik!D=i~be41?m& z<%FPrDF=n{^ZvOU6bgs^1t!S*m-+yD{stxl`SZKHd{F3LVQ|4e!}#HU#R22x0~n3@ z{iGMhFYuT4!36n){#*{u5BbZxZ~=b)pXHn!5GWg@12G{WL`^_`AU+sa%>n6x5fwiS ztbs;50dfKatpQfBGe?7f&gTRH%;czovGhS13 z6R5bTppcNMnIKHa49=5j2FDkeONb zx*Rd#Z^}SS$P2I(qiYydL)uw5S%RQYL9iUk#tG>Fma{=PA!U%JXfq_Bdr*EpuqH@I zKwR9>$pMM51(aya#Ms!_+}K#SslKtk-n^y0>mFA1Rp_~ek@|Xj(Z(3(P%brl57a67 z5N1oc@?7)rC!li#Q5NJVW8)btMgFVu6&_6W_$@?4ibSG$^bU)HRuIUVxn3Mc?F>jF zMzH6>SvBj+G%h$O7En3f83@*RFXbg-LO`#-x8S>mAM^2q2sMNS(h&p&ga|NG%iSIc zmPR-sY|s{9OpY?b1Ze|g1G)-it00{aWU!E!*;0GO5*FNpVqAT2F^5HFyE zn09IbB~R2#OA8L-!%zfJ2&f?1R1@i>4+h2@uolwI$p9?t=5$RH(|Vw?Yno6H@3AI| z1HT_5$Z_>2%{gW%1~XXJ4$upfodsA2WhZIpi2CDM3gL)6E+OfFLfEKi0ovr?=p=24 zZ~*b~f|U{9(@+=$tm$mxgprY!gER7vnq`oVrVc23C$s|y(`f->bWmnamX7+of*2X_ z!7vPf0HdD}NI*ak=tNKuA23Q`E(iz)2Uq}xps5c-?%+Ru-f{Nn_jaR=(Q^ImN_-I`Y648ESzkEZkdqcu7sXvma1 zW#1u+D9@R$pB_C+u)voPRrfa2!n|NcHhc#wVr2cjxYyxM+-lvF@LH;2^*C3)Aa#t8 zO^Felr{n`Yy&Yvy`));>z^A!GuycFAo|i?5FgFEf{CGKSp-N@p=n@JMy?A}jX-vz) z@G+Ubowq^W9lDvv(M`0X`%~3(**aU1)LHx9=N^1vYgVOLbKT3nL;guytJ^@+$G^bT zIqk6F?C`{%?gH+F3p?k<9(oN+lAV6F2bb_@WJj#&dgl-Cyp)*M0UJQymNO<6Qs0)K zLfViP4dKK~)TuR>y6Kjr8y}*vawFP&VSecd_OI0!^Io)shy|>4ZwrVODtn*j5FMLY z6{xVLJ35t>30oWXA{o*y$Ca+H*yoQ#pB@B~9!Lse&8>k9|YL zXgifDZxVCxkS3~Y6Ox^~8ab4y##byXW|b768$~>J<4n0&?sf8Sj-$n*LM2SOO4={m zOnsAc{RFP*mJzNCi*C2oY*l5w(VOp&TDw&q?TeGT`b>WDD_06i&X^;L zRG+%wP>{U#VVLfrWU_a9e?cF=F7{GQKvATEw)j@a7`WIgq;cuq#=SaN%VCQ{#h0!K z6Ozf?<~n`d$9l8_!-S_jQ+8b&2=f9*Pc2jLiXmj;abd0Ne#IV>tCl`-IU-unozF*8+gTF7; zB$g~~E~mBLwci--tM*m1-vle|ektRiNuoQ!$U>8()`b7aQ_rtDL;PMy7p=vuA&?e7*MMSzA-Q?A1HYIqPXxAxZiKuP zheUN9;&kVDv~h$DzX&%Eit` zM6Zl#3D>S{RLhdL^d;UnR}!DYk$V{6#dc2MI#o82w(hMWiH5D%_MD@u96>CcFN|oC zMip5YA1Gh;VYmCD=K$7r4UL|sMsu1upZfT%to5CKFcx@rsoi{VTf&6uy1VrK0@oBm z>(CJ=tFbFWwO%N0?y_ZBS-n_oY`XKSb=`W~)CpcukGjXJ$AfWG^lk_b2j;i*_iQ+UE3p9G8l^;RF%r?1} z9+OsEA;J%SPlVh<(GIPb`*JhzQ^!RL^5!LsJaCWM;6~?Fi z=oi;jjE93?m1ah5ynIv;7?mMv22mhXQVu4)@kTj3T#(@6eniTBKYVbYfrk3!qDP#@ zx?$mJbh6hk^Kv$4Uv@JOs-dqoajWdouzY_$m2FbJ=}O{#O%w?qf`$#Y;Sa@;EognX z#UyEzw`QuVL}*toQ{cteawXrIWIZzA#@6$h2NSzvX|OM&Mak&A4LMY6@|Glt0jiX3 z=A~+}oJ8FUwyBrIt7rsuTVjJt!tE}twv88|u1a}&i(J|vrncr^8yAcAJAHJcY+OrZ z`^(@g7byyOg-VC3W?hq}ng-+g-HRb4e%=qk9j=~|&)of(4`2xLp^*s(bfy2&E4nI+TFD9dxl3yD{*yU7K zoL_0#sN~O($iBE^UF)6d7qW-oLJ#1)zBrk{`$?9p>;h+Hr*qf z4rMo~l*54gZC0;K%UD8DdxO1^XIv{T`D%1ge6Xk>oZV3C`g|rPy@?}8G%vuy>p|79 z_$fmyW9#W_b?3OQRzK<+{#v^7{&HmrLi^KB7HF*8ma1C%Wqfi_K>i028~;dcLMcj%ZL z$y?vvMhDo^N8G3ovl$B|nKZDaPEXYiZ%$otQ|M?Q>U z{wMG8@9h5*AMWJ;4_p4HJ^y!aoLKP3o*v*C{qXNjpeN-q9^$XwAdm<6V?R7VOzw~L z-_?JD9rGVk5_89R5STRP`q5I%{n!is4*!wQ2YAN6zJp0)umksByp3b-{7E){?@Iuo z4{km|Af9mIOF$ui_9gxh)$a}kl<)uEqY(Vnqd1Ow{E5W>Y~13QroVAd0Wacb2m>nc z&)w6Lc+B?@#z|1%SCJnFSOGo#t~TF;3mE120sH-q5hg~^7$_$FdoCvAbdm=IN&qzg z{`2wuD)gU$r5}C~Oc3@rei0B?<^xM&qJVZlWC-y2Tu`P+jcZcB`AbjSwKQER+U}w| zlER`3n@oxI?-k;O!E6xWw7BYL6waKwASFL?T2kgTxvY#&PBibZt&`k!*+iav(-$Pe zUMu}LyO5P-cqzr(ki<*yYl*5B83UX2oBKlhuA7^a(>42vAF)zcpXZbfLC#_Y52y4f z2DMOJBsWPXz``K}VV}q1b$`LbEpi2aCZbiTP;Y|Zb6}Doei*8TLAkRYvi0pT_uKcx zSXVE@@!6uv91=us=jRA6EAL%SaDN`n;;T-!`T_TLIe(E=Qq8+NOG0DKgu&YPOV}+E zrJg}Ppb~W6UXF${X2V^FvZHt5MlGYyJG0d1KTnY7s&`tQy851_N|GJiHcDzyDbA|& z;3GCxyVH=!twR#(C}O;U=S)MDay5E4?CK{L>0;UVwSt)0S97EA9zvv93ZmX$j7`^j z7Kx%h6Mnhs$fLu8_&T+WsW$_W-LH})Kc7Y0O1#q%BfRHE zQSkckWqCh0R!{+M{q~Z6eAf{c(I`*T4LLmLRT zuG!PwA;`b4Z+t=dp`S6H=;;E`83sur|FgQ1Bw?Hjr$0%Xuw4l7(@5pY!s58E6-L1; z#obGog}>tGn@Zbjx4hr0zKrWcQiUc-|a z*)xpt1c7Hbq{LDKA@U;%2mbcH_Q4PpH$|okpJYx!ePU&}K-%ZxAJ;U$XvS%tZ&qrq zYSz8**i3etK{l*kfj8p*pzN5`*tNqTr#OBU57mrt+V-ytxDHozl{P@65&K~h%tkEJ zjCE;+Z23_TMPXS$N;Y|}D%Aj1;8OjF5fAO%jNe!sd*-yb?qmnMOLP}&7q%3W!yzu7kO8s2j7 z^ut7u^^z$IOf$ADE;yD}pvq=1Rsm7TYZ|K*r_wFCbY)3)iIL*bVrxX9S)TUrnN_w` zJnJW~k%1%cZHTL4YW%!HyppBoDsImS5vsDj!+FF0#(<~Mc}cOtVS{jka-Ycc>9qv{ zHx0wn1%CVbQ@H5X1XDW8B#S9yag(o)KQYnIR(*K>nZuj@8|a(xx95)%WrH5|n*_Ib z2X;~PaM^M_me##|wd*!TOU$axcVQ@V!`l@lrRr$lI)`gy3cP zxYIaI=_}OPagQ}A~dWtMnVJ$4vE4EB=E`G8Nz{yT?zOJ*M)m3 z;1%hwN-Nf!U%gkneX;6Em7R;&>S4Fa%#+RXPTPs~+IkJpMSg-kLc1!yiDwhm6W1mS zJkE(V(?!$ii`DMeT61ye}_GmC{FtjRoVHi_QFqJx`x2e8KEmaATyU9AinXo;3 zlz!-R5OgHE=lp?tXL81Kc)!dj%qV&~cAESAwJ5HYbF^e$?>66q_vt^>QPrQ3KVx|o zeqqZtMJI*VUVkR}VTB}0GWUTh-WNtV(@pwni33T0C3%H*&ntq>qPKl3bUwSYUEvof z<=&a^y@Y5$_!d4y+$Fu_tK+*#P*-=g@aijLn}*3VnP+sHL;O4Bxr&*#zqEG%I;cBn zIVjlorY~SQv2Wi*)P%!iuSGOuH*l!UoBT-m0*fw-5S?E$bE|WkO0(mfGGTtCB^8bVLkuvTACkSte2Doye8AoaS)hE3j!YlHx@mb&@=8W0*5=m4Mz1@XI37CK zEmppxa=g9-{TQ(A@=mNPv}>~``PM>}(-id{h!Re+jK8YCx_v zc*Du-v9Ur^grm}n7;Ww^>9M+8oZ?ziY#rcH&FzO=1_B)MfC|>?2s6gC3wF_Sq+P@b z!0$YRtlKu!mC?OB>UG1%>e-5>Qe$&|K_X=iK*sxAJ;l$h@e?=gvMPapH5Y3_YYA(8YQNQa z)a};W*RM5LG|V>|HI6skY#MA^$tP1ZQ)$!e(*-jEGc~g^v)yx=bK~=-^Q#Mv3!fK#mWY?0 zyrX}Yz0A8@{a)^U?~4A);;Q}X(VFl2`SpYiwvE!wtDD_hH@6l)IDGiF9rW??$IKo6 zoyJ|Y-Kjm>y`%krgUbh5pWvU`4s{OS9l3tS{~Y^;{Y&LnrLPm;Y`=ZOCc@hH`FQkq z-rw=e%%9Bfzx6O+z~uMwYy}ho=LHD~!T;i5{4~UmT?`?>?mn5bfbqZu_#hC$|K`*M zH!#KV-}C*Bkk3IirD0hj78#9|!Ze?%~p51^P&NC@D-e{Ztpze4eE z&K1VZI3f6tIr8tb(3lzB|M@9$0Nt-s^uJ*LS0>1R%!>b4r@}ELo>2W`xdaUUck3m7 z^OJyirE!6CUT<|~!dJBTv9Lj-F9)4H;soLz@AP-<+z(%lqJ26TrbY8kFoAS~#}3!I zD0YN2O~tY&NzCF>{p$j2Iq|)~WWm7r*K+6O1oqFi5O@p z$83CcKWb;(yeJL&oc~JvI(BjeQ+%83j?O4e`}h~NGL`F3;=e(J1^aZkLgOOLT1;4s zcfn_K>hkK|4UZ{j88YwYEW>K6#ujos-tmgm{4u>;ITxVkk*xA z_-_5>)@m(P0@Ne3;0?y{ti1g;MOI#OE-jBdHJK@0Au}`}1S+g49#q>sx+|=As zn?htg4b6zt!M3D_lYAfzmqBi9_ouuWmKOq+L7E z?_@6=wxcLavACzJR^*~H)~_LNmX~L^yb8)IYM-=-c?k20Xi-a#p^3j7oI1Opu5Yz# z^C`gTbR4}%PW_zPgiR!EFMtI93>T7~TZ=~PuSlIIR zyP@46FU!;lQeH=@*Qir##85N8&BPgLaJUu#H4mY3CDUe^idJbr&Cj8ZtThbYy6BV% zv9yHBcicM7cSOh@_s+aqMZShNe?fiyU1rB<>(W~)n)-($8R+05tLxw{^FFe+onl;z zZe@?&b1gX7{8(Tci`>x6fl8X~-CQ<^F2fe$t*K(59 zR!z>{YcbxJqjmPkp-11Gm?(rq7LUG4cY5NN!ERd z&0UhNi*AD0(F)^(*V94vAER#*vf9C!uEmNmy+VuJijk9NmI-~qOw_N1<=NLHljY6a zU6noR#Lzc3)N$ICF{#0v0DoQPgIoX9yP!sUmj(^EOm5%XMrn3pXRM$a-~KtYwP+Ig zYqC+-#mt=3nri{6pc@a}cglkT;(0abgQ{30V|JdYJYgTBt==YcH@tM+=q^*wW;X>+ zsCQ*Y?~AWDXD58RR8tZIku2`XYgq9T&0sced0|^Wu-M zEhhH&zqKIk`x>(!>rTEeOu?)``L5Fss!s&XV z#g!!Nyt1`~CS@ND(wWZBx6{rINH^Pci#BJvFLBVG!(>R2{$?A_*>2_P>?o+6e))s9 zRBJ|^;vAC#Z?V-DAx~04+FhuSLtmswA1Avoul|>uCJUC&q6W>*>Jjc#nOjAN_R%w| z2OQ$@Gh)@Swu9%PMyr|LA#~)?0cBP4#wkggK2-OC!|WxyN$=q;_MDpGW%H2HNPJXB9=oPsWO z;XI*|OWt(6);odH0zC>~W-gnI>E*#3k*jbqYdbd&gMiYUEECEC&9C1;Eii^woRPi! zKB)V8Mcyk>u8rG@yLR@AqBlP=+LrIpR?&WZq$sCyk7!DlW;VjJnK)TcIk+K7CCP_G zx@|ZAUXdg9f-SE2hfAULpq5Hgk)!oE&X_A)JH7I)hxn1B42E1PCXc~4%pYt|V>SDS z8>LwY?-_AQC9`d^H8TsRjBqZrNPQ%?HhZ8#mAf6w{ood<|8(7*vHf5kor{vh>jhGJ z3)^t;6!YK{aTG(*rQz78o6c|h4eKxTZ?DG0b)9Qc;qAWT+d_ROZSP~gsn(QBh{|e> zMlVx{GRrJSJ_Vw&_GR~1#{OlHj}*B|Sh)W+nI?67rC`ZBPc=VO$~fd?`$S#yikG1` z!t0RxvLjD5=9#9Q&CF3eFr0U($Lw{xH?BNgs(_Z=-c_xcHJXTbjD=66X#A^hMS%!N z?8xjM?0@3X(9gLuU$IOvwnb4Ahiz0WoyMZY&p}{z&uQ-&L-O4N1=iP|4qv8g)NHED zm*;XL(cyJ)h|EkJ8o6=^Wp%7ao_i-zHn(siQ+sTF-)9 z*fkMB4#qiCd5Kq^xZigFFcexyG}@<=_CAA}N-xg8*7K1&O{YmlnVDIv@w)}LNMxxoR)0%U7ew87YyH_jTNVi`i zYnPn6xFl|soPkRH@Sxx0d}sa|JRrig^^%DFnSXYF<= z6TR~KW9WMqt971oI5XW70nG>>hJJDFeJqxuMQ<*OmxL8{B**!%+m%RJO5}ZqMDX*L z2K%DKD@QO&l{UXJh)ltKieSnEgoM(>b=00CeyI1^(DH%7H_0Rc`yu!Z>0%#72h@+S zA_O?*!>)9+=(0n5WwoGuhsvvBWFovNMujtB271l!)rsy3C=w1(4{OEaso%*I2||Sr zUWm&4Q2bP@mlK(E`gAiQP@mU?=ry)TbT6cvger(mRc(g0oMt z7ZV%rVP&^MFh^gVa=$+)gYm+qQ;({}$j7HvcX2prdPE8p(#9DRDYU6(wCr0>c#WWtFq8SIA67-6)e-1YST#%7c1lTWhnx9@j-yPFPr6Ou~;b2FA!+uclcS)lslta5AU*sy2r3QSN%!zZ?tOW0b1A`yH^zJJ z`SczR*3nU(|J4_~y;k|cJ9PJ|7Fu=h%XUsd@p`|!N#Hl;#G*7Md%b)wHj}1Dlr-?3 zA9aTIT8nxQ(ZqLX%oq%!k>|V8SnXi&bNmQ=IO*2uX8o zycs1Lk%j{fNLj0AF+|NS7Lhg>2SapEZ4UE_{oPfC1?_;Zt?Stibp~{Dr;S&bw_`D6vxOzq5;e zt{MHqF8aRe{eLA2al8rO=Q7iut4#j|yXe0fdce^2d+0$B#{W-^p^gY3^iZ?PspcrJ z&K@WohRaSn&#e^A>8HN-Fwp_QB>zDAJO|IS%k0(> z&K|Z=E0(V>d~$H8xs~A)v1l%(8Bs5B$Luuw0N0y#2Z>kSeH3OxD>?)yon5mh%?c6Z zX0M*ka3n@9-rg4X;C!l`^OWg>Xoi`h5=HoXF75%Qw5SPx9EHeqpKDx?4RdP^$qaMt zggNKkOUa1CoyS$~8hzz$h;)Qof9j`e*~;2KU!e0Ki}+JXwg0N5Jq zq-xkDEAIZc1G*#yOx4o#+f1j7diT01llx+e2Ton4!z%BOio1E{>$>bqP3sc$r!P!> zr{+Bi%Rc*rKA03HTN5RF&qg-NMh0ds7<|H?HXnx7-`O*F`8JA;FVeR;Ic()4X-+h4 z!d8%t*5uF~QqNjO>K&`|V9K+R?`o865{>bbu=S}m0*^@eN@F$UV^q|iw6r87I;4~G z*qGSRgn9{hso2q{K#Hd#L=1PaO;)u`SJI7d-<^h$7UeC@6YzK)1b)P|2xX%DaJ9MS zW`m%AQCsz?Z5x9D(Tv3wr&lKV_TLoONuzu9ku^^^rx4qN;dw~UtOMz@3S8GI2js3% zDv7mjW0{5pW$#g^T5A_Pm4mJC_Q1$3dv@cNTJ)ru_dXFGs*NY&yCk2zZMk0ibw*{` zc%t8rpC9gex&5Y^W2OISq>e=1TN&EYbyZ3Fp&GgI8)u1iU3C^JB6DfqAL5-W5TI_% z4Va(`#m|S(>tAjz-^uQ;Z-gPwpL^&|8Lzn}h$^mUkV$5Dho;3mB8|1$O02-`dnI|{ zK0whLza9Umy$yB!a`#Q@A>n=ROZTTUFRYgHDamBCnu)IA)QAwfNUP4?DtW&mJI$X- ziI#aQnQS1$#(v2n&iD2bkLpVCr^qal3{k%Rjlm*jPHRf*jtC}0H)U&U998)&*C@P@ z@>c3qqTxyM8JQa!!B-geC!@H%6G&pwecK5n+vjN)7=_)QrFbt95w3}TliS33-C5bx zF?hjpdx+o?=lz~O_NOfh4RTzG6_ux0c6(A+#XApsaqdwyTzSRcB|5Hwb*>5?E=A?R z@qs~VmvSv$8%95U`zrSV+MQ79-c)X>5}aW`eg;2yOYkLj7oP8S?^?>0OZjuUH*dG) zpEcGg@+N9;EkSrT)}M0`g%efLD=TejgdXx2e-10INLf?9;?t`gJkj}72g};~oDaG% z_rugnXcdFDVwL3y*4#SMo83x1wU z>Yx~B5O#t0QN00VGN6)8Qj_W-qpQ;9#++36#2KfJ%goRuj+o0_3n?UoE>lZkc++oo z%N=yLxkQLlIPV)R)Ala*JUMO*{%0DzQQ?|q{wx2fP6wH!A!nlfe zqOcf3n4Zesc-}oH5AXExtxzX&r^c3$u>J-PzL_o3cV~!XoTh_#3rlGGiI&O38H`A_TbJz5F1V z`H-%FX^-+Vk0LbR%eo8Q4N1PLhFa-0yA9XM>f>&ED}`m-;x@pA{n*f_`_ptYo~Mk> z=V2 z_5G<4>8^sr5Eq%RzSHw(`S?U@KFf+mzq=GCT6PZ){0LWqdgh#L;Rtsf-~0Nr7M*fb zrsm2X$z{)Uvp5?%tlKz}lGjbH)_l{ErU;GNEvpv9zEFCXf~CPotE7LD$?k~TUgjmE z964O!@oT57(g)r1{ZyA(BF5OU8a1zr%d`1uH;<>9`<)k3-u`m0?W0~CKxi{>?W&Tly(%cb{Vw@vVaQ>7A4}#sQP1C50#M9K zs6S0e0Nd~W_hKZ+3$1>ck~n_;(SZNUIf-K`f42;H1^=04kf5#Ncx)NytYu4=omYNf z)bHdWKajzfIFgh-dh02j@r4V0YPe@L=r^w1W%$%!fQ75v(FuR-bxuYh@FjY>b~1N* zgJEQ+Bsp;OhPv4~$)Y4#a;eX4F>E0Ua#u2;sRZQXqeHpk4~qqp{d!~8ZO%tPh&0(c z+X38S;DXsb*&UyBo9c|RhX}WV>Jpy0(2KZ{{r|Fi>61FQJ2p?Xo3o5!m z&pA-^K;q!TnKM}F5A}}>t?RJ&^ zsOvE+^;CBY{fgILy7<8-hAyekvk#W|i7ZK6t8u7&g~Sz`W_ptL@ov4WLdy_zF8EMh zsJ;^s#me?(oz_9n|4EZUHXOa#eD|}#mL17a63Ck7;Py-ol6Zz&{prZjvx~JWTY=Ep zo~CsFW(`GKr{25N;-bE+dzmf!njBk`xJd+I*RiYfI1C#m%xV|c?L<56de=q->Cqxn z-c-{xR`FjW%=%($XPt>SI;kpsqvbDKQ?Vgi5VnsRoip5H4~cC3OB5IBmaMQ#@{m2W zNoAH5;&Ld^1Rw2GQg`%TJGlihO*AQyp#2uF>V+50Jz%p80|@fgj&1Lc;*}4d#DgY=3>wl9IoenRnF~G zEj|>~XT{eePrkO~FQ;=pnfL-7YPjf4m_{gn9Owny${|I=MA1ZTpLYUN_KdQBt!GDkWLDIe3i?-Loa}s2pAC;5&_C<=BV5>c*$>p(%6n z6oVOe)x8z`i8oJMN_(0Ut=K$xx>a6jPzSvu8naL4ciVe=g0tNIzTu2kadh;}v$&xb z2Ny~|-#e|n*5EbExLQb?dp%ZF#(*!eA8pKJg#U0o&T>S|g<>ztTI0_Bc8_W}23ar{0MC1TDRrKSxDYhga>v>HABQet8GdUrW-`z>|7D4ToT zUS{c5eIRjjpv`&I+;BVOeB@Q5FQ3ce>Rg0g?X_B1CM--8@{c|%LPV}beG6E&#a|%H z-Cd;3tS_@{p{S{QuxW2*STawea$A*vculjr9R~BjC9e2zW|R1n1^39U;zMEL%b_$Q z^{3)L^<6u4ltgd9Gd1!CS0o?X1k%Y@VwoT{#(tZH6s{r&7fr-@7jtL57-xEmIBn&+ z)kbOi=ZdW+CMKnbwBBboDDkFy4J$WXFe7n40d@#LXC&y(Af)fCsbG|?s0lk|55 zVc(!RgLH4T*(Sv_8%sG>Z%a#tV+*j};@hRmKkriB&rHW@W0Gih{yN2TGb!VxNL_Ii z-y~K?#(kbRBG#%&7B_2S)Bc4RcZ(n^(H$E!uE_3de*4uYhJ7rNCVI2roeP}IwtHhF{&Uxq)$Pc~ zS7c=LH#Tpcvm$r;g88MIN6$xnIw1orLw<-yMe{K z0w+a(>{b6`z41*I<)2Y+Q3*F-hqyJ;31ot_K-r10ZdTQ?f>35+tU53ih>E>5(h?=_ z;egciP}MT^ur?JkW0epm6qP^#2Sgyb-4OQN=Epn!9YMg}PB8{)4P`k73E%_)Q8!^X zTYFnzpFGIT*2d0J*iDS}_#I&&jRAvMLB~a$ti@Pws;GgS&}bWLloN=TM~DZ?4dvqk znL7YmPF>Ls)*vX404t_W2QzbF4H>!bH3Cm!td>qr_QGJWtE(%ID<2Qq!2%2gmNSe>0wX2QTKYZFsAQjl8^0z+`~o0*$)1LrL8a|@aa!TDhVFhNsO_z!&c zzqIo=gg^#>kq_VmkP-&=*PA(;A|1q7B~2aBCI}~x49d|7Wdj@q0TSSW@IXOqzFdsiR1SSlD zoD@B-75UGK{+}>GMdd$cgRLz_krDPPD#9{oQ)gRXd$WSfcO~I9hw%am!OzXhkL2U# zHxV-BHZd23a|7o(m_p6qP*VXxAy)AJwB*c8|7fwjvxCiXpD;58BW;kF#yJAQg91%9 zGZi++Y^nwn8ewk_?4(CH0n!2kiU=qdkm-bSvO$U;_c&lJ|4G6Ih3P@UHV8WlF;+Kj zGo(4f*~W=gTm=OvtRvdo38aH|FavRe&}a>$o12z{JC7OK^h8x{P~XLMTpRc&1|Vg6 zqC_W1G?BM|U=vqHB0*|M;8+a1KUH#E2vf-)ul`+sIEDe^1%|`mKgJ{A>9>&ySPvwA9@cs-F5ES@Jn+4#1 seOCaEIq~fG`UHd^f3A-g!iUkNALagXz8@402;|o@_W-j0ICby;0iXK5kpKVy literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/ooRexxTry/ooRexxTry.rex b/modules/windows/oodialog/ooRexxTry/ooRexxTry.rex new file mode 100755 index 0000000..acb54d7 --- /dev/null +++ b/modules/windows/oodialog/ooRexxTry/ooRexxTry.rex @@ -0,0 +1,983 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2007-2019 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* oorexxtry.rex */ +/* +What: 21st Century version of Rexxtry +Who: Lee Peedin +See documentation for version control + +10/04/07 Extended fileNameDialog mask for open (*.*) +10/05/07 Added charout method to sayCatcher class + Added lineout method to sayCatcher class + +10/15/07 Directives now work - return values aren't captured +10/16/07 Added header to copy all + +11/29/07 Modified ~getText for occasions when lines should not be stripped. + Place in the incubator + +04/19/09 Removed deprecated createFont() and replaced it with createFontEx(). +04/19/09 Enhanced the menu to use check marks for font name, size, and silent. +*/ + + -- Capture the location of our source code program + discard = locate() + + parse arg isDefault + .local~useDefault = .false + if isDefault~translate = 'DEFAULT' then + .local~useDefault = .true + + call LoadEnvironment -- Set up the environment to work with + code = .oort_dialog~new() -- Create the dialog + if code~initCode \= 0 then + do + call errorDialog 'Error creating code dialog. initCode:' code~initCode + exit + end + say + say "This console will receive the output of your system commands." + say "Try 'dir' for example." + say + code~execute('ShowTop') -- Execute the dialog +exit + +::requires "ooDialog.cls" -- Needed for the dialog +::requires 'winsystm.cls' -- Needed for the Windows clipboard + +::class oort_dialog subclass userdialog +::method init + self~init:super + rc = self~create(.dx,.dy,.dwidth,.dheight,.title,'ThickFrame MinimizeBox MaximizeBox') + self~initCode = (rc=0) + self~fontMenuHelper + +::method defineDialog + expose u menuBar + u = .dlgAreaU~new(self) + if .nil \= u~lastError then + call errorDialog u~lastError + +---------- Arguments title & dialog area + at = .dlgArea~new(0,0,u~w,10) + self~createStaticText(17,at~x,at~y,at~w,at~h,'CENTER','Arguments') + ad = .dlgArea~new(0,at~y + 10,u~w,u~h('15%')) + self~createEdit(12,ad~x,ad~y,ad~w,ad~h,'multiline hscroll vscroll','args_data') + +---------- Code title & dialog area + ct = .dlgArea~new(0,ad~y + ad~h,u~w,10) + self~addText(ct~x,ct~y,ct~w,ct~h,'Code','CENTER',18) + cd = .dlgArea~new(0,ct~y + ct~h,u~w,u~h('40%')) + self~addEntryLine(13,'code_data',cd~x,cd~y,cd~w,cd~h,'multiline hscroll vscroll') + +---------- Says title & dialog area + st = .dlgArea~new(0,cd~y + cd~h,u~w('50%'),10) + self~createStaticText(19,st~x,st~y,st~w,st~h,'CENTER','Says') + sd = .dlgArea~new(0,st~y + st~h,u~w('50%'),u~h('43%')) + self~createEdit(14,sd~x,sd~y,sd~w,sd~h,'notab readonly multiline hscroll vscroll','say_data') + +---------- Returns title & dialog area + rt = .dlgArea~new(sd~x + sd~w,cd~y + cd~h,u~w('50%'),10) + self~createStaticText(20,rt~x,rt~y,rt~w,rt~h,'CENTER','Returns') + rd = .dlgArea~new(rt~x,st~y + st~h,u~w('50%'),u~h('15%')) + self~createEdit(15,rd~x,rd~y,rd~w,rd~h,'notab readonly multiline hscroll vscroll','results_data') + +---------- Errors/Information title & dialog area + et = .dlgArea~new(rt~x,rd~y + rd~h,u~w('50%'),10) + self~createStaticText(21,et~x,et~y,et~w,et~h,'CENTER','Errors / Information') + ed = .dlgArea~new(rt~x,et~y + et~h,u~w('50%'),u~h('17%')) + self~createEdit(16,ed~x,ed~y,ed~w,ed~h,'notab readonly multiline hscroll vscroll','error_data') + +---------- Run & Exit buttons for easier execution + self~createPushButton(80,ed~x ,ed~y + ed~h + 2,35,10,,'&Run','RunIt') + self~createPushButton(IDCANCEL,ed~x + 40,ed~y + ed~h + 2,35,10,,'E&xit') + +---------- + menuBar = .UserMenuBar~new(500,0,65) + + menuBar~addPopup(510, '&File') + menuBar~addItem(22,'&Run' , ,'RunIt') + menuBar~addItem(23,'&SaveAs', ,'FileDialog') + menuBar~addItem(25,'&Open' , ,'FileDialog') + menuBar~addItem(24,'E&xit' ,'END','Cancel') + + menuBar~addPopup(520,'&Edit') + menuBar~addPopup(530,'Font&Name') + menuBar~addItem(30,'&Lucida Console', ,'onFontMenuClick') + menuBar~addItem(31,'&Courier New' ,'END','onFontMenuClick') + menuBar~addSeparator(535) + menuBar~addPopup(540,'Font&Size','END') + menuBar~addItem(40,'&8' , ,'onFontMenuClick') + menuBar~addItem(41,'1&0', ,'onFontMenuClick') + menuBar~addItem(42,'1&2', ,'onFontMenuClick') + menuBar~addItem(43,'1&4', ,'onFontMenuClick') + menuBar~addItem(44,'1&6', ,'onFontMenuClick') + menuBar~addItem(45,'1&8','END','onFontMenuClick') + menuBar~addPopup(550,'&Tools') + menuBar~addPopup(560,'&Copy') + menuBar~addItem(50,'&Args' , ,'Clipboard') + menuBar~addItem(51,'&Code' , ,'Clipboard') + menuBar~addItem(52,'&Says' , ,'ClipBoard') + menuBar~addItem(53,'&Returns', ,'ClipBoard') + menuBar~addItem(54,'&Errors' , ,'ClipBoard') + menuBar~addItem(55,'A&ll' ,'END','ClipBoard') + menuBar~addSeparator(565) + menuBar~addPopup(570,'C&lear') + menuBar~addItem(60,'&Args' , ,'ClearAll') + menuBar~addItem(61,'&Code' , ,'ClearAll') + menuBar~addItem(62,'&Says' , ,'ClearAll') + menuBar~addItem(63,'&Returns', ,'ClearAll') + menuBar~addItem(64,'&Errors' , ,'ClearAll') + menuBar~addItem(65,'A&ll' ,'END','ClearAll') + menuBar~addSeparator(575) + menuBar~addPopup(580,'&Silent') + menuBar~addItem(66,'&No' , ,'Silent') + menuBar~addItem(67,'&Yes' ,'END','Silent') + menuBar~addSeparator(585) + menuBar~addPopup(590,'Sa&ve Settings','END') + menuBar~addItem(72,'Sa&ve' ,'END','SaveSettings') + menuBar~addPopup(600,'&Help','END') + menuBar~addItem(71,'Current &Settings', ,'Settings') + menuBar~addItem(70,'&About' ,'END','Help') + + if \ menuBar~complete then + statusText = 'User menu bar completion error:' .SystemErrorCode SysGetErrortext(.SystemErrorCode) + +::method initDialog unguarded + expose args_input code_input result_input say_input errors_input menuBar + -- Use font data from .ini file or defaults if .ini not present yet + + -- FW_EXTRALIGHT == 200 + d = .Directory~new + d~weight = 200 + hfont = self~createFontEx(.fontname,.fontsize,d) + + if menuBar \== .nil then menuBar~attachTo(self) + + -- Set the font and silent menu item check marks. + self~setFontMenuChecks + if .silent then menuBar~check(67) + else menuBar~check(66) + + -- Get the controls for all dialog elements that will need to be adjusted + args_input = self~newEdit(12) + code_input = self~newEdit(13) + say_input = self~newEdit(14) + result_input = self~newEdit(15) + errors_input = self~newEdit(16) + args_title = self~newStatic(17) + code_title = self~newStatic(18) + say_title = self~newStatic(19) + result_title = self~newStatic(20) + errors_title = self~newStatic(21) + + -- Set the color of the titles + args_title ~setColor(5,10) + code_title ~setColor(16,10) + say_title ~setColor(15,0) + result_title~setColor(14,0) + errors_title~setColor(13,10) + + -- Set the font name/size to the default values + self~reDraw + + if \.useDefault then + do + -- Read oorexxtry.ini position & size the dialog based on its values + sd = .application~srcDir + k1 = SysIni(sd'oorexxtry.ini','oorexxtry','k1') + k2 = SysIni(sd'oorexxtry.ini','oorexxtry','k2') + k3 = SysIni(sd'oorexxtry.ini','oorexxtry','k3') + k4 = SysIni(sd'oorexxtry.ini','oorexxtry','k4') + if k1 = 'ERROR:' | k2 = 'ERROR:' | k3 = 'ERROR:' | k4 = 'ERROR:' then + nop -- First exection will not find the ini file + else + do + r = .Rect~new(k1,k2,k3-k1,k4-k2) + self~setWindowPos(TOP,r) + self~ensureVisible + end + end + + self~connectResize('onResize', 'sync') + +-- Run menu option +::method RunIt + expose args_input code_input result_input say_input errors_input + + -- Calculate the center point of the code_input edit control, in screen + -- co-ordinates. + r = code_input~clientRect + centerPoint = .Point~new((r~right - r~left) % 2, (r~bottom - r~top) % 2) + code_input~client2screen(centerPoint) + + -- Get and save the current mouse position. + mouse = .Mouse~new(code_input) + oldCursorPos = mouse~getCursorPos + + -- Set the cursor to the busy symbol / move the cursor to our center point + oldCursor = mouse~wait + mouse~setCursorPos(centerPoint) + + arg_array = self~getText(args_input,.true) + .local~si = say_input + w1 = code_input~selected~word(1) + w2 = code_input~selected~word(2) + code_array = self~getText(code_input,.true) + if (w1 = .max_length & w2 = .max_length) | (w1 = w2) then + nop -- we've already loaded our code_array + else + do + code_string = code_array~makeString + code_array = code_string~substr(w1,w2-w1)~makearray + end + + -- Clear any previous error data + self~error_data = '' + errors_input~title = self~error_data + + -- Clear any previous say data + self~say_data = '' + say_input~title = self~say_data + + -- Clear any previous returns data + self~results_data = '' + result_input~title = self~results_data + + .local~emsg = '' + .local~imsg = '' + + self~error_data = 'Code Is Executing' + errors_input~title = self~error_data + + .local~Error? = .false + .local~badarg = '' + -- Interpret each argument so that expressions can be used + signal on syntax name ArgSyntax + do i = 1 to arg_array~items + .local~badarg = i arg_array[i] + interpret 'arg_array['i'] =' arg_array[i] + end + signal off syntax + + exec = .executor~new('oorexxtry.code',code_array) + exec~run(arg_array) + + if .emsg \= '' then + do + if \.silent then + call beep 600,100 + self~error_data = .emsg + errors_input~title = self~error_data + self~results_data = '' + result_input~title = self~results_data + end + else + do + self~error_data = 'Code Execution Complete' + errors_input~title = self~error_data + end + + if .nil \= .run_results['returns'] then + do + self~results_data = .run_results['returns'] + result_input~title = self~results_data + end + if \.silent then -- Let the user know when code execution is complete + call beep 150,150 + + mouse~restoreCursor(oldCursor) + mouse~setCursorPos(oldCursorPos) + + self~returnFocus +return + +ArgSyntax: + msg = 'Trapped In'~right(11)'..: ArgSyntax' + obj = condition('o') + msg = msg||.endOfLine||'Message'~right(11)'..:' obj['MESSAGE'] + msg = msg||.endOfLine||'ErrorText'~right(11)'..:' obj['ERRORTEXT'] + msg = msg||.endOfLine||'Code'~right(11)'..:' obj['CODE'] + msg = msg||.endOfLine||('Argument' .badarg~word(1))~right(11)'..:' .badarg~subword(2) + .local~emsg = msg + if \.silent then + call beep 600,100 + self~error_data = .emsg + errors_input~title = self~error_data + self~results_data = '' + result_input~title = self~results_data + .local~emsg = '' + self~focusItem(12) + args_input~select(1,1) + + mouse~restoreCursor(oldCursor) + mouse~setCursorPos(oldCursorPos) +return + +::method cancel + + r = self~windowRect + -- Write out the size,position,fontname,fontsize, & silent to the .ini file + sd = .application~srcDir + if \self~isMinimized & \self~isMaximized then + do + rv = SysIni(sd'oorexxtry.ini','oorexxtry','k1',r~left) + rv = SysIni(sd'oorexxtry.ini','oorexxtry','k2',r~top) + rv = SysIni(sd'oorexxtry.ini','oorexxtry','k3',r~right) + rv = SysIni(sd'oorexxtry.ini','oorexxtry','k4',r~bottom) + end + rv = SysIni(sd'oorexxtry.ini','oorexxtry','fn',.fontname) + rv = SysIni(sd'oorexxtry.ini','oorexxtry','fs',.fontsize) + rv = SysIni(sd'oorexxtry.ini','oorexxtry','sl',.silent) +return self~ok:super + +-- Clipboard menu option +::method ClipBoard + expose args_input errors_input code_input say_input result_input + use arg msg, args + cp = .WindowsClipBoard~new + select + when msg = 50 then + do + cp_array = self~getText(args_input,.false) + cp_string = cp_array~makestring + cp~copy(cp_string) + .local~imsg = 'Arguments Are On ClipBoard' + end + when msg = 51 then + do + cp_array = self~getText(code_input,.false) + cp_string = cp_array~makestring + cp~Copy(cp_string) + .local~imsg = 'Code Is On ClipBoard' + end + when msg = 52 then + do + cp_array = self~getText(say_input,.false) + cp_string = cp_array~makestring + cp~copy(cp_string) + .local~imsg = 'Says Are On The ClipBoard' + end + when msg = 53 then + do + cp_array = self~getText(result_input,.false) + cp_string = cp_array~makestring + cp~Copy(cp_string) + .local~imsg = 'Returns Are On ClipBoard' + end + when msg = 54 then + do + cp_array = self~getText(errors_input,.false) + cp_string = cp_array~makestring + cp~copy(cp_string) + .local~imsg = 'Errors Are On ClipBoard' + end + when msg = 55 then + do + allData = 'The Following Output Was Generated With ooRexxTry'.endOfLine||.endOfLine + cp_array = self~getText(args_input,.false) + cp_string = cp_array~makestring + allData = alldata||'Arguments'||.endOfLine||cp_string||.endOfLine||'-'~copies(20)||.endOfLine + + cp_array = self~getText(code_input,.false) + cp_string = cp_array~makestring + allData = allData||'Code'||.endOfLine||cp_string||.endOfLine||'-'~copies(20)||.endOfLine + + cp_array = self~getText(say_input,.false) + cp_string = cp_array~makestring + allData = allData||'Says'||.endOfLine||cp_string||.endOfLine||'-'~copies(20)||.endOfLine + + cp_array = self~getText(result_input,.false) + cp_string = cp_array~makestring + allData = allData||'Results'||.endOfLine||cp_string||.endOfLine||'-'~copies(20)||.endOfLine + + cp_array = self~getText(errors_input,.false) + cp_string = cp_array~makestring + allData = allData||'Errors/Information'||.endOfLine||cp_string||.endOfLine||'-'~copies(20)||.endOfLine + + cp~copy(allData) + .local~imsg = 'All Data Is On ClipBoard' + end + otherwise + nop + end + self~error_data = .imsg + errors_input~title = self~error_data + self~returnFocus + +-- Code2File menu option +::method FileDialog + expose code_input errors_input + use arg msg, args + if msg = 23 then + do + c_array = self~getText(code_input,.false) + c_string = c_array~makestring + action = 'S' + dtitle = 'ooRexxTry File Save' + end + else + do + action = 'L' + dtitle = 'ooRexxTry File Open' + end + + delimiter = '0'x + filemask = 'ooRexx Files (*.rex)'delimiter'*.rex'delimiter||- + 'All Files (*.*)'delimiter'*.*'delimiter + handle = self~getSelf + a_file = FileNameDialog(.preferred_path,handle,filemask,action,dtitle,'.rex') + if a_file \= 0 then + do + ostream = .stream~new(a_file) + if msg = 23 then + do + ostream~open('Write Replace') + ostream~lineout(c_string) + ostream~close + .local~imsg = 'Code Saved As' a_file + self~error_data = .imsg + errors_input~title = self~error_data + end + else + do + oarray = ostream~charin(,ostream~chars)~makearray + ostream~close + mycode = '' + do i = 1 to oarray~items + mycode = mycode||oarray[i] + if i < oarray~items then + mycode = mycode||.endOfLine + end + self~code_data = mycode + code_input~title = self~code_data + + .local~imsg = 'Code From' a_file 'In Code Dialog' + self~error_data = .imsg + errors_input~title = self~error_data + end + end + self~returnFocus + +-- ClearAll menu option +::method ClearAll + expose args_input code_input result_input say_input errors_input + use arg msg, args + select + when msg = 60 then + do + self~args_data = '' + args_input~title = self~args_data + end + when msg = 61 then + do + self~code_data = '' + code_input~title = self~code_data + end + when msg = 62 then + do + self~say_data = '' + say_input~title = self~say_data + end + when msg = 63 then + do + self~results_data = '' + result_input~title = self~results_data + end + when msg = 64 then + do + self~error_data = '' + errors_input~title = self~error_data + end + when msg = 65 then + do + self~args_data = '' + args_input~title = self~args_data + + self~code_data = '' + code_input~title = self~code_data + + self~results_data = '' + result_input~title = self~results_data + + self~say_data = '' + say_input~title = self~say_data + + self~error_data = '' + errors_input~title = self~error_data + end + otherwise + nop + end + self~returnFocus + +::method Silent + expose menuBar + use arg msg, args + select + when msg = 66 then do + .local~silent = .false + menuBar~check(66) + menuBar~unCheck(67) + end + when msg = 67 then do + .local~silent = .true + menuBar~check(67) + menuBar~unCheck(66) + end + otherwise + nop + end + self~returnFocus + +::method SaveSettings + use arg msg, args + + r = self~windowRect + select + when msg = 72 then + do + sd = .application~srcDir + if \self~isMinimized & \self~isMaximized then + do + rv = SysIni(sd'oorexxtry.ini','oorexxtry','k1',r~left) + rv = SysIni(sd'oorexxtry.ini','oorexxtry','k2',r~top) + rv = SysIni(sd'oorexxtry.ini','oorexxtry','k3',r~right) + rv = SysIni(sd'oorexxtry.ini','oorexxtry','k4',r~bottom) + end + rv = SysIni(sd'oorexxtry.ini','oorexxtry','fn',.fontname) + rv = SysIni(sd'oorexxtry.ini','oorexxtry','fs',.fontsize) + rv = SysIni(sd'oorexxtry.ini','oorexxtry','sl',.silent) + end + otherwise + nop + end + self~returnFocus + +::method ReturnFocus + expose code_input + w1 = code_input~selected~word(1) + w2 = code_input~selected~word(2) + code_array = self~getText(code_input,.true) + if w1 = .max_length & w2 = .max_length then + do + sel_start = .max_length + sel_end = .max_length + end + else + do + sel_start = w1 + sel_end = w2 + end + self~focusItem(13) + code_input~select(sel_start,sel_end) + +-- Method to handle all the resizing +::method onResize + expose u + use arg dummy,sizeinfo + u~resize(self,sizeinfo) + +::method Help + expose code_input u + handle = self~getSelf + parse value self~GetWindowRect(handle) with var1 var2 var3 var4 + .local~dw = (var3 - var1) / self~factorX + .local~dh = (var4 - var2) / self~factorY + + parse value self~GetPos with dx dy + .local~dx = dx + .local~dy = dy + + help = .help_dialog~new() + if help~initCode \= 0 then + do + call errorDialog 'Error creating help dialog. initCode:' help~initCode + exit + end + help~execute('ShowTop') + +::method Settings + expose code_input u + handle = self~getSelf + parse value self~getWindowRect(handle) with var1 var2 var3 var4 + .local~dw = (var3 - var1) / self~factorX + .local~dh = (var4 - var2) / self~factorY + + parse value self~getPos with dx dy + .local~dx = dx + .local~dy = dy + + settings = .settings_dialog~new() + if settings~initCode \= 0 then + do + call errorDialog 'Error creating help dialog. initCode:' settings~initCode + exit + end + settings~execute('ShowTop') + +-- Redraw applicable areas of the dialog based on the font menu choice +::method ReDraw + expose args_input code_input say_input result_input errors_input + + -- FW_EXTRALIGHT == 200 + d = .Directory~new + d~weight = 200 + hfont = self~createFontEx(.fontname,.fontsize,d) + args_input ~setFont(hfont) + code_input ~setFont(hfont) + say_input ~setFont(hfont) + result_input~setFont(hfont) + errors_input~setFont(hfont) + +::method getText + use arg the_input,stripIt + iarray = .array~new() + max_length = 0 + do i = 1 to the_input~lines + if stripIt then + do + if the_input~getLine(i)~strip() \= '' then + do + iarray~append(the_input~getLine(i)) + max_length += iarray[iarray~last]~length + end + end + else + do + iarray~append(the_input~getLine(i)) + max_length += iarray[iarray~last]~length + end + end + .local~max_length = max_length + 1 +return iarray + +-- This method is invoked whenever the user clicks on one of the font menu items. +-- The first arg to the method is the resource id of the menu id that was clicked. +::method onFontMenuClick + expose fontMenuIDs + use arg id + + -- Map the menu item id to a font setting. Could be size of name. + item = fontMenuIDs~index(id) + + -- If item is a number, then it is a font size menu item, otherwis a font name. + if item~datatype('W') then .local~fontSize = item + else .local~fontname = item + + -- Reset the menu item check marks and redraw in the new font. + self~setFontMenuChecks + self~reDraw + +-- This method sets the appropriate font menu item check state. Checked for selected +-- and unchecked for unselected. +::method setFontMenuChecks private + expose fontMenuIDs menuBar + + -- Iterate over all items in the table unchecking each menu item. Brute force, + -- but easy, and there are not many items. The alternative is to keep track of + -- which items are checked and uncheck / check the correct ones. + do id over fontMenuIDs~allItems + menuBar~unCheck(id) + end + + -- Now check the menu item that matches what font name and size is currently + -- in use. + menuBar~check(fontMenuIDs[.fontname]) + menuBar~check(fontMenuIDs[.fontsize]) + +-- A private help method that sets up things to make working with the font menu easier +::method fontMenuHelper private + expose fontMenuIDs + + -- Create a table that maps menu item IDs to the matching font setting. Since + -- the Table class has the index() method, the mapping works both ways. + fontMenuIDs = .Table~new + fontMenuIDs["Lucida Console"] = 30 + fontMenuIDs["Courier New"] = 31 + + fontMenuIDs[ 8] = 40 + fontMenuIDs[10] = 41 + fontMenuIDs[12] = 42 + fontMenuIDs[14] = 43 + fontMenuIDs[16] = 44 + fontMenuIDs[18] = 45 + +-- Class that dynamically creates a method to take the arguments and execute the code +::class executor public +::method init + expose rt_routine + use arg routine_name,code + .local~Error? = .false + signal on syntax name ExecSyntax + rt_routine = .routine~new(routine_name, code) +return + +-- Syntax trap similiar to rexxc.exe +ExecSynTax: + msg = 'Trapped In'~right(11)'..: ExecSyntax' + obj = condition('o') + msg = msg||.endOfLine||'Message'~right(11)'..:' obj['MESSAGE'] + msg = msg||.endOfLine||'ErrorText'~right(11)'..:' obj['ERRORTEXT'] + msg = msg||.endOfLine||'Code'~right(11)'..:' obj['CODE'] + msg = msg||.endOfLine||'Line #'~right(11)'..:' obj['POSITION'] + .local~emsg = msg + .local~Error? = .true +return + +-- Method that actually runs our code +::method run + expose rt_routine say_string + signal on syntax name RunSyntax + .local~run_results = .directory~new + .local~say_stg = '' + my_result = '' + if \.Error? then + do + -- Redirect STDOUT for say statements + scrnOut = .SayCatcher~New('STDOUT')~~Command('open write nobuffer') + theSayMonitor = .monitor~New(scrnOut) + .output~destination(theSayMonitor) + -- Run the Code + args = arg(1) + rt_routine~callWith(args) + -- Test if there was anything returned by the code + if symbol('result') = 'VAR' then + my_result = result + -- Load the says and returns into environment variables for updating the dialog areas + .local~run_results['returns'] = my_result + -- Redirect STDOUT back to what it was (probably the screen) + .output~Destination() + end +return .run_results + +-- Syntax trap for errors in the code +RunSyntax: + msg = 'Trapped In'~right(11)'..: RunSyntax' + obj = condition('o') + msg = msg||.endOfLine||'Message'~right(11)'..:' obj['MESSAGE'] + msg = msg||.endOfLine||'ErrorText'~right(11)'..:' obj['ERRORTEXT'] + msg = msg||.endOfLine||'Code'~right(11)'..:' obj['CODE'] + msg = msg||.endOfLine||'Line #'~right(11)'..:' obj['POSITION'] + .local~emsg = msg +return + +-- Class to "catch" all say,charout,lineout statements in the code +-- Will not catch charout & lineout if the first argument is supplied +::class SayCatcher subclass stream +::method say + use arg input + .local~say_stg = .say_stg||input||.endOfLine + .si~title = .say_stg +return + +::method charout + use arg input + .local~say_stg = .say_stg||input + .si~title = .say_stg +return 0 + +::method lineout + use arg input + .local~say_stg = .say_stg||input||.endOfLine + .si~title = .say_stg +return 0 + + +::class help_dialog subclass userdialog +::method init + self~init:super + lp = (.dx + (.dw / 2) - 50)~format( , 0) + tp = (.dy + (.dh / 2) - 30)~format( , 0) + rc = self~create(lp,tp,100,60,.title,"THICKFRAME") + self~initCode = (rc=0) + +::method defineDialog + expose h sizing + h = .dlgAreaU~new(self) + if .nil \= h~lastError then + call errorDialog h~lastError + h~updateOnResize = .false + sizing = .false + + vt = .dlgArea~new(h~x,0,h~w,10) + self~createStaticText(20,vt~x,vt~y,vt~w,vt~h,'CENTER','Version') + vd = .dlgArea~new(h~x,vt~y + vt~h,h~w,10) + self~createStaticText(21,vd~x,vd~y,vd~w,vd~h,'CENTER',.version) + + at = .dlgArea~new(h~x,vd~y + vd~h,h~w,10) + self~createStaticText(22,at~x,at~y,at~w,at~h,'CENTER','Author') + ad = .dlgArea~new(h~x,at~y + at~h,h~w,10) + self~createStaticText(23,ad~x,ad~y,ad~w,ad~h,'CENTER','Lee Peedin') + + dt = .dlgArea~new(h~x,ad~y + ad~h,h~w,10) + self~createStaticText(24,dt~x,dt~y,dt~w,dt~h,'CENTER','Documentation') + dd = .dlgArea~new(h~x,dt~y + dt~h,h~w,10) + self~createPushButton(25,dd~x,dd~y,dd~w,10,,'&PDF','Help') + +::method initDialog unguarded + v_title = self~newStatic(20) + a_title = self~newStatic(22) + d_title = self~newStatic(24) + + v_title~setColor(5,10) + a_title~setColor(5,10) + d_title~setColor(5,10) + + self~connectResize('onResize', 'sync') + self~connectSizeMoveEnded('onSizeMoveEnded') + +::method help + -- The help doc is supposed to be in the 'doc' subdirectory, but we will also check the + -- current directory, then the Rexx home directory. + if SysFileExists('doc\ooRexxTry.pdf') then do + helpDoc = 'doc\ooRexxTry.pdf' + end + else if SysFileExists('ooRexxTry.pdf') then do + helpDoc = 'ooRexxTry.pdf' + end + else if SysfileExists(value("REXX_HOME",,"ENVIRONMENT")||"\doc\ooRexxTry.pdf") then do + helpDoc = value("REXX_HOME",,"ENVIRONMENT")||"\doc\ooRexxTry.pdf" + end + else do + msg = "The ooRexxTry.pdf help documentation could not be located." || .endOfLine - + || .endOfLine || - + "Tried:" || .endOfLine - + " doc subdirectory: "||directory()||"\doc\ooRexxTry.pdf" || .endOfLine - + " current directory: "||directory()||"\ooRexxTry.pdf" || .endOfLine - + " Rexx home: "||value("REXX_HOME",,"ENVIRONMENT")||"\doc\ooRexxTry.pdf" || .endOfLine - + || .endOfLine || - + "Sorry, no help is available" + title = 'ooRexx Try for the 21st Century - Error' + j = MessageDialog(msg, self~hwnd, title, 'Ok', 'WARNING') + return + end + 'start "ooRexxTry Online Documentation"' '"'||helpDoc||'"' + +::method onResize unguarded + expose h sizing + use arg sizingType, sizeinfo + + sizing = .true + h~resize(self, sizeinfo) + +::method onSizeMoveEnded unguarded + expose sizing + + -- If we were resizing, force the dialog controls to redraw themselves. + if sizing then self~update + + -- We are not resizing anymore. + sizing = .false + return 0 + + +::class settings_dialog subclass userdialog +::method Init + self~init:super + lp = (.dx + (.dw / 2) - 50)~format( , 0) + tp = (.dy + (.dh / 2) - 30)~format( , 0) + rc = self~Create(lp,tp,100,60,.title) + self~InitCode = (rc=0) + +::method DefineDialog + expose h + h = .dlgAreaU~new(self) + if .nil \= h~lastError then + call errorDialog h~lastError + vt = .dlgArea~new(h~x,0,h~w,10) + self~addText(vt~x,vt~y,vt~w,vt~h,'Font Name','CENTER',20) + vd = .dlgArea~new(h~x,vt~y + vt~h,h~w,10) + self~addText(vd~x,vd~y,vd~w,vd~h,.fontname,'CENTER',21) + + at = .dlgArea~new(h~x,vd~y + vd~h,h~w,10) + self~addText(at~x,at~y,at~w,at~h,'Font Size','CENTER',22) + ad = .dlgArea~new(h~x,at~y + at~h,h~w,10) + self~addText(ad~x,ad~y,ad~w,ad~h,.fontsize,'CENTER',23) + + dt = .dlgArea~new(h~x,ad~y + ad~h,h~w,10) + self~addText(dt~x,dt~y,dt~w,dt~h,'Silent','CENTER',24) + dd = .dlgArea~new(h~x,dt~y + dt~h,h~w,10) + self~addText(dd~x,dd~y,dd~w,dd~h,.silent,'CENTER',23) + +::method InitDialog + v_title = self~newStatic(20) + a_title = self~newStatic(22) + d_title = self~newStatic(24) + + v_title~setColor(14,0) + a_title~setColor(14,0) + d_title~setColor(14,0) + +::routine LoadEnvironment + .local~px = ScreenSize()[3] + .local~py = ScreenSize()[4] + +-- Establish dialog area sizes based of the user's screen resolution - will only be used for the first +-- execution - from then on data is retrieved from the .ini file, unless user specifies default as an +-- execution argument from the command line + .local~dwidth = ((.px / 2.5) * .65)~format(,0) + .local~dheight = ((.py / 2.5) * .65)~format(,0) + .local~dx = 0 + .local~dy = 0 + + +-- Need a few generic variables + .local~version = '1.0' -- Internal version control + .local~preferred_path = '' -- Default starting path for Save As dialog - will be either + -- the folder ooRexxTry is executed from or the last folder that + -- was accessed using the Windows File Dialog + .local~title = 'ooRexxTry' -- Title to use for the dialogs + +-- If the .ini file is present, use it for font/silent variables + sd = .application~srcDir + .local~fontname = SysIni(sd'oorexxtry.ini','oorexxtry','fn') + .local~fontsize = SysIni(sd'oorexxtry.ini','oorexxtry','fs') + .local~silent = SysIni(sd'oorexxtry.ini','oorexxtry','sl') + +-- Else use some defaults + if .fontname = 'ERROR:' | .useDefault then + .local~fontname = 'Lucida Console' + if .fontsize = 'ERROR:' | .useDefault then + .local~fontsize = 12 + if .silent = 'ERROR:' | .useDefault then + .local~silent = .false +return + + + diff --git a/modules/windows/oodialog/oobandit.rex b/modules/windows/oodialog/oobandit.rex new file mode 100755 index 0000000..bbc041a --- /dev/null +++ b/modules/windows/oodialog/oobandit.rex @@ -0,0 +1,428 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * oobandit.rex An ooDialog example, the Jackpot Slot Machine. + * + * This example demonstrates one way of animating bitmaps, by drawing them on + * the face of a button. It also shows how to correctly use dialog units in + * a UserDialog to size and place the controls. + * + * Creating the dialog and its controls is done this way: + * + * The pixel size of the bitmaps is known. Although bitmaps can be stretched + * by the OS to fit a specific size, bitmaps look best displayed in their + * actual size. The pixel size of the bitmaps is first converted to the + * correct dialog unit size, correct for the actual dialog to be constructed. + * + * Then the size of the dialog and the size and placement of the dialog + * controls are calculated around the bitmap size. + * + * Note: this program uses the public routine, locate(), to get the full path + * name to the directory this source code file is located. In places, the + * variable holding this value has been callously abbreviated to 'sd' which + * stands for source directory. + * + */ + + -- Use the global .constDir for symbolic IDs, and add IDs for this example. + .application~useGlobalConstDir('O') + .constDir[IDC_PB_STOP] = 1100 + .constDir[IDC_STATIC_JACKPOT] = 1200 + .constDir[IDC_PB_BMP_LEFT] = 1201 + .constDir[IDC_PB_BMP_CENTER] = 1202 + .constDir[IDC_PB_BMP_RIGHT] = 1203 + .constDir[IDC_EDIT] = 120 + .constDir[IDC_UD] = 1206 + + /* 1ms fast, 500ms slow, 200ms start, equals random every 25th */ + d = .BanditDlg~new(1, 1000, 1000, 25) + d~execute("SHOWTOP") + + return 0 + +/*---------------------------------- requires ------------------------*/ + +::requires "ooDialog.cls" +::requires "samplesSetup.rex" + +/*---------------------------------- dialog class --------------------*/ + +::class 'BanditDlg' subclass UserDialog + +::constant BITMAP_X 152 +::constant BITMAP_Y 178 +::constant FONT_NAME "MS Shell Dlg" +::constant FONT_SIZE 14 + +::constant MARGIN_X 10 +::constant MARGIN_Y 5 +::constant JACKPOT_LINE_Y 22 +::constant TEXT_Y 12 + +::constant BUTTON_X 35 +::constant BUTTON_Y 15 + +::method init + expose kind3 initialSpeed minSpeed maxSpeed maxCycle cycle equal misses initPot won bitMapSize dlgSize + use arg minSpeed, maxSpeed, initialSpeed, kind3 + + self~init:super() + + -- Set the font the dialog will use when created. Without this step, dialog + -- units can not be calculated correctly. + self~setDlgFont(self~FONT_NAME, self~FONT_SIZE) + + -- Set our various instance variables. + minSpeed = max(1,minSpeed) + maxCycle = 200; initPot = 1000; equal = 0; misses = 0; cycle = maxCycle; won = .false + + -- Calculate the size of a bitmap in dialog units. + bitMapSize = .Size~new(self~BITMAP_X, self~BITMAP_Y) + self~pixel2dlgUnit(bitMapSize) + + -- Calculate the size of this dialog based on the bitmap size. + dlgSize = self~calcSize(bitMapSize) + + title = "Jackpot Slot Machine - Stop on 3 of a Kind and Win $$$" + self~initCode = self~createcenter(dlgSize~width, dlgSize~height, title) + +::method defineDialog + expose bmp. initialSpeed dlgSize bitMapSize + + sd = locate() + + -- Load the bitmaps into memory. + bmp.1 = self~loadBitmap(sd"bmp\tiger.bmp") + bmp.2 = self~loadBitmap(sd"bmp\chihuahu.bmp") + bmp.3 = self~loadBitmap(sd"bmp\eleph2.bmp") + bmp.4 = self~loadBitmap(sd"bmp\horse.bmp") + bmp.5 = self~loadBitmap(sd"bmp\sealion.bmp") + bmp.6 = self~loadBitmap(sd"bmp\moose.bmp") + bmp.7 = self~loadBitmap(sd"bmp\rhinoce.bmp") + bmp.8 = self~loadBitmap(sd"bmp\goat.bmp") + bmp.0 = 8 + + -- Note that for a static text control, the CENTERIMAGE flag has the effect + -- of vertically centering the text within the control. + + -- Create the jackpot line. First a frame around the whole thing. + x = self~MARGIN_X + y = self~MARGIN_Y + self~createBlackFrame(IDC_STATIC, x, y, dlgSize~width - (2 * self~MARGIN_X), self~JACKPOT_LINE_Y, "BORDER") + + -- Static text on the right, centered over the 1st bitmap + txt = "Jackpot $$$" + txtSize = self~getTextSizeDU(txt) + x += trunc((bitMapSize~width / 2) - (txtSize~width / 2)) + y += self~MARGIN_Y + self~createStaticText(IDC_STATIC, x, y, txtSize~width, self~TEXT_Y, "CENTER CENTERIMAGE", txt) + + -- The jackpot number, could be up to 9 digits. Just a static control with a + -- fancy frame, centered over the middle bitmap + txt = "888888888" + txtSize = self~getTextSizeDU(txt) + x = trunc((dlgSize~width / 2) - ((txtSize~width + 6) / 2)) + self~createBlackFrame(IDC_STATIC, x + 0, y - 2, txtSize~width + 6, self~TEXT_Y + 4, "BORDER") + self~createBlackFrame(IDC_STATIC, x + 1, y - 1, txtSize~width + 4, self~TEXT_Y + 2, "BORDER") + self~createStaticText(IDC_STATIC_JACKPOT, x + 3, y - 0, txtSize~width + 0, self~TEXT_Y + 0, "RIGHT CENTERIMAGE") + + -- Static text on the left, centered over the 3rd bitmap. + txt = "$$$ Jackpot" + txtSize = self~getTextSizeDU(txt) + x = (bitMapSize~width * 2) + (3 * self~MARGIN_X) -- The left edge of the 3rd bitmap ... + x += trunc((bitMapSize~width / 2) - (txtSize~width / 2)) -- ... and center + self~createStaticText(IDC_STATIC, x, y, txtSize~width, self~TEXT_Y, "CENTER CENTERIMAGE", txt) + + -- Now place the bitmaps + x = self~MARGIN_X + y = (2 * self~MARGIN_Y) + self~JACKPOT_LINE_Y + self~createBitmapButton(IDC_PB_BMP_LEFT, x, y, bitMapSize~width, bitMapSize~height, "INMEMORY USEPAL", , , bmp.1) + + x += bitMapSize~width + self~MARGIN_X + self~createBitmapButton(IDC_PB_BMP_CENTER, x, y, bitMapSize~width, bitMapSize~height, "INMEMORY ", , , bmp.1) + + x += bitMapSize~width + self~MARGIN_X + self~createBitmapButton(IDC_PB_BMP_RIGHT, x, y, bitMapSize~width, bitMapSize~height, "INMEMORY ", , , bmp.1) + + -- Stop and cancel buttons, placed at left margin and under bitmaps + x = self~MARGIN_X + y += bitMapSize~height + self~MARGIN_Y + buttons = "&Stop" .constDir[IDC_PB_STOP] "onStop &Cancel" .constDir[IDCANCEL] "Cancel" + self~createPushButtonGroup(x, y, self~BUTTON_X, self~BUTTON_Y, buttons, .false, "DEFAULT") + + -- A group box to hold the speed adjustment controls + txt = 'Speed (in ms) lower is faster' + x += bitMapSize~width + self~MARGIN_X + cy = dlgSize~height - y - self~MARGIN_Y + self~createGroupBox(IDC_STATIC, x, y, (bitMapSize~width * 2) + self~MARGIN_X, cy, , txt) + + -- And finally the speed adjustment controls them selves. The top of a group box + -- is higher than the top line of the group box (to allow for text.) So in order + -- for the speed controls to look centered with the group box lines, we need to + -- calculate the center, adjust for the height of the controls, and then push it + -- "down a bit." I arbitrarily choose 3 as 'a bit.' + x += self~MARGIN_X + y += trunc((cy / 2) - (self~TEXT_Y / 2)) + 3 + txt = ' Faster :' + txtSize = self~getTextSizeDU(txt) + self~createStaticText(IDC_STATIC, x, y, txtSize~width, self~TEXT_Y, 'RIGHT CENTERIMAGE', txt) + + x += txtSize~width + 2 + self~createEdit(IDC_EDIT, x , y, 35, self~TEXT_Y, "NUMBER") + + x += 35 + self~createUpDown(IDC_UD, x, y, 25, self~TEXT_Y, "RIGHT ARROWKEYS AUTOBUDDY BUDDYINT HORIZONTAL NOTHOUSANDS", 'speed') + + x += 2 + self~createStaticText(IDC_STATIC, x, y, 30, self~TEXT_Y, 'LEFT CENTERIMAGE', ': Slower') + + -- Set the up down position to the initial speed. + self~speed = initialSpeed + +::method initDialog + expose minSpeed maxSpeed notStopped jackPotCtrl speedCtrl + + self~newUpDown(IDC_UD)~setRange(minSpeed, maxSpeed) + + speedCtrl = self~newEdit(IDC_EDIT) + speedCtrl~setLimit(maxSpeed~length - 1) + ret = speedCtrl~connectCharEvent(onKey) + + jackPotCtrl = self~newStatic(IDC_STATIC_JACKPOT) + + notStopped = .true + self~disableControl(IDC_PB_STOP) + self~start("bandit") + +-- An attempt to disallow cut and paste into the speed control. +::method onKey unguarded + expose speedCtrl + use arg key, shift, control, alt, info + + s = speedCtrl~selection + + if control then return .false -- Don't allow cut and paste + if key == 57 then return .false + else return .true + +::method bandit unguarded + expose x y z bmp. kind3 cycle maxCycle equal misses notStopped won + + rand = random(1, 8, time('S') * 7) /* init random */ + ret = play("WHISTLE.WAV") + + -- The user could have canceled while the whistle was playing.. + if \self~isDialogActive then return 0 + + self~enableControl(IDC_PB_STOP) + + do cycle = maxCycle by -1 to 1 until \self~isDialogActive + if self~checkSpeed = 0 then leave + + sleep = format(max(1, min(100, self~speed / 2)), , 0) + do j = 1 to self~speed / sleep + if self~isDialogActive then call msSleep sleep + end + + if \self~isDialogActive then return 0 + guard on when notStopped -- Don't change the bitmaps out from under the user. + + if random(1, kind3) = 3 then do + x = equal // 8 + 1; y = x; z = x; equal += 1 + end + else do + x = random(1, 8); y = random(1, 8); z = random(1, 8) + end + + -- It's an error to invoke changeBitmapButton if the underlying dialog + -- no longer exists. (Which may be if the user hit cancel.) + if \self~isDialogActive then return 0 + + self~changeBitmapButton(IDC_PB_BMP_LEFT, bmp.x,,,,"INMEMORY STRETCH") + self~changeBitmapButton(IDC_PB_BMP_CENTER, bmp.y,,,,"INMEMORY STRETCH") + self~changeBitmapButton(IDC_PB_BMP_RIGHT, bmp.z,,,,"INMEMORY STRETCH") + + guard off + if \self~isDialogActive then return 0 + end + + if \won then do + self~disableControls + + msg = 'Sorry, you did not get the jackpot in ' || .endOfLine || - + misses 'tries.' || .endOfLine~copies(2) || - + 'There were' equal 'chances. ('equal' three' || .endOfLine || - + 'of a kind were shown.)' + title = 'End of run' + ret = messageDialog(msg, self~hwnd, title, "OK", "INFORMATION") + end + + -- Clean up is in our cancel method, so we invoke that rather than self~ok:super + if self~isDialogActive then return self~cancel + else return 1 + +::method disableControls private + self~disableControl(IDC_PB_STOP) + self~disableControl(IDCANCEL) + self~disableControl(IDC_EDIT) + self~disableControl(IDC_UD) + +::method onStop + expose x y z misses initPot notStopped won jackpotCtrl + + notStopped = .false -- Prevent the 'bandit' from changing the bitmaps + + if ((x=y) & (y=z)) then do + -- All 3 bitmaps are the same, jackpot. + won = .true + ret = play("tada.wav") + self~setWindowTitle(self~get,"Congratulations !") + do i = 40 by 20 to 120 + self~write(i*self~factorx,i*self~factory,"Congratulations...","Arial",14,'BOLD') + end + money = jackpotCtrl~getText + self~write(10*self~factorx+5,75*self~factory,"You won the jackpot:" money,"Arial",18,'BOLD') + do i=1 to min(money%500 + 1,10) + ret = play("jackpot.wav") + money = max(0,money - 500) + jackpotCtrl~setText(money) + end + jackpotCtrl~setText(0) + call msSleep 1000 + return self~cancel + end + + -- Not 3 of a kind + misses += 1 + ret = play("nope.wav", "yes") + + if ((x=y) | (y=z) | (x=z)) then do + ret = infoDialog("2 equal, not bad, try again... jackpot reduced 25%") + initPot = trunc(initPot * .75) + end + else do + ret = infoDialog("Not a chance, try again... jackpot is halfed!") + initPot = trunc(initPot * .5) + end + + if initPot = 1 then ret = infoDialog("One more chance to hit the jackpot....") + self~checkSpeed + notStopped = .true -- Unblock the 'bandit' + return 0 + +::method checkSpeed + expose minSpeed maxSpeed cycle initPot jackpotCtrl + + if \self~isDialogActive then return 0 + + self~getDataAttribute('speed') + + -- Although the edit control is numbers only, and the up down control won't + -- allow the user to spin outside of the range, or use the arrow keys to move + -- outside of the range, it is possible for the user to delete all the + -- numbers in the edit control, or to type in numbers larger than the + -- maximum. In which case the up down control seems to return the empty + -- string for its position ?? + if self~speed == "" then do + say 'Up down position: ' self~newUpDown(IDC_UD)~getPosition + say 'Edit control text:' self~newEdit(IDC_EDIT)~getText + end + + money = trunc(cycle * initPot / self~speed) + jackpotCtrl~setText(money) + + return money + + + -- You can not remove the bitmap handles while the dialog is still displayed + -- on the screen. As long as the dialog is showing, the os will try to + -- repaint the dialog when needed. If the bitmaps are destroyed, the + -- program will crash. The leaving method is provided for just this purpose, + -- it allows you to clean up resources. +::method leaving + expose bmp. + + do i = 1 to bmp.0 + self~removeBitmap(bmp.i) + end + + +::method cancel + expose notStopped + + self~disableControls + self~cancel:super + + call Play "byebye.wav" + + -- Be sure the bandit() method is not blocked so that this Rexx program ends. + notStopped = .true + + return 1 + +::method calcSize private + use strict arg bitMapSize + + s = .Size~new + + -- For the width of the dialog, we have 3 bitmaps, an X magin on both sides, + -- and we space the bitmaps apart horizontaly using the X margin. 3 bitmaps + -- and 4 X margins + s~width = (3 * bitMapSize~width) + (4 * self~MARGIN_X) + + -- The height is sligthly more complicated. It goes like this from top to + -- bottom: Y margin, jackpot line, Y margin, bitmap height, Y margin, push + -- button group height, Y margin. + s~height = (4 * self~MARGIN_Y) + self~JACKPOT_LINE_Y + bitMapSize~height + - + self~getButtonGroupHeight + + return s + +::method getButtonGroupHeight private + expose h + + if \h~dataType('W') then do + -- To calculate the height of the push button group, we need to know the + -- height of a button, the number of buttons (2), and the vertical spacing + -- between buttons. It so happens that I know the vertical spacing is 1/2 + -- the button height, truncated. + h = (2 * self~BUTTON_Y) + trunc(.5 * self~BUTTON_Y) + end + return h + diff --git a/modules/windows/oodialog/oobmpvu.rex b/modules/windows/oodialog/oobmpvu.rex new file mode 100755 index 0000000..cf1143d --- /dev/null +++ b/modules/windows/oodialog/oobmpvu.rex @@ -0,0 +1,114 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ +/* */ +/* ooDialog\Samples\oobmpvu.rex BMP Display - GraphicDemo */ +/* */ +/*--------------------------------------------------------------------------*/ + + -- Use the global .constDir for symbolic IDs, and add IDs for this example. + .application~useGlobalConstDir('O') + .constDir[IDC_CB] = 101 + .constDir[IDC_PB_BITMAP] = 102 + + sd = locate() + oldDir = directory() + j = directory(sd"bmp") + + b.IDC_CB = '' + d = .BmpDialog~new(b.) + d~createCenter(300, 200, "Bitmap Viewer") + d~execute("SHOWTOP") + + j = directory(oldDir) + + return + +/*-------------------------------- requires --------------------------*/ + +::requires "ooDialog.cls" + +/*-------------------------------- dialog class ----------------------*/ + +::class 'BmpDialog' subclass UserDialog + +::method defineDialog + self~createStaticText(IDC_STATIC, 10, 10, , , , "Filename: ") + + self~createComboBox(IDC_CB, 60, 10, 130, 180, "VSCROLL", "Filename") + self~connectComboBoxEvent(IDC_CB, "SELCHANGE", "FileSelected") + + self~createBitmapButton(IDC_PB_BITMAP, 13, 33, self~SizeX - 26, self~SizeY - 30 - 36, , , , "blank.bmp") + + self~createPushButtonGroup(100, self~sizeY - 18,,, "&Show 1 OK &Cancel 2 CANCEL", 1) + self~createBlackFrame(IDC_STATIC, 10, 30, self~SizeX - 20, self~SizeY - 30 - 30) + +::method initDialog + self~addComboEntry(IDC_CB, "...") + self~comboAddDirectory(IDC_CB, "*.bmp", "READWRITE") + self~comboAddDirectory(IDC_CB, "*.dib", "READWRITE") + + -- This is done so that when the dialog is initially displayed, the bitmap viewer portion, + -- the bitmap button, is blank. + self~changeBitmapButton(IDC_PB_BITMAP,0) + +::method fileSelected /* drop-down selection */ + self~getData + if self~filename = "..." then self~OK + else self~showBitmap + +::method OK /* show button */ + self~getData + if self~filename = "..." then + do + self~filename = fileNameDialog("*.*", self~DlgHandle) + if self~filename \= "0" then + do + self~comboDrop(IDC_CB) + self~addComboEntry(IDC_CB, "...") + self~comboAddDirectory(IDC_CB, filespec("drive", self~Filename) || filespec("path", self~Filename) || "*.bmp", "READWRITE") + self~comboAddDirectory(IDC_CB, filespec("drive", self~Filename) || filespec("path", self~Filename) || "*.dib", "READWRITE") + self~setDataAttribute("Filename") + end + end + self~showBitmap + return 0 + +::method showBitmap /* draw the bitmap */ + self~changeBitmapButton(IDC_PB_BITMAP,0) + self~changeBitmapButton(IDC_PB_BITMAP,self~filename,,,,"USEPAL") diff --git a/modules/windows/oodialog/oodStandardDialogs.rex b/modules/windows/oodialog/oodStandardDialogs.rex new file mode 100755 index 0000000..6a18858 --- /dev/null +++ b/modules/windows/oodialog/oodStandardDialogs.rex @@ -0,0 +1,232 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * oDialog\Samples\oodStandardDialog.rex Standard Dialog demonstration. + * + * This example pops up a main dialog from which the user can select to display + * any of the standard dialogs provided by ooDialog. + * + * This example also demonstrates using the .application object to set a default + * application icon. This icon will then be used for every dialog that does not + * over-ride the default by explicitly specifying some other application icon. + * This gives all the dialogs displayed an uniform appearance. + */ + + sd = locate() + .application~setDefaults('O', sd'rc\oodStandardDialogs.h') + .application~defaultIcon(sd'bmp\oodStandardDialogs.ico') + + dlg = .StandardDialogs~new(sd"rc\oodStandardDialogs.rc", IDD_STDDLGS) + dlg~execute("SHOWTOP") + +return 0 +-- End of entry point. + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" +::requires "samplesSetup.rex" + +::class 'StandardDialogs' subclass RcDialog + +::method initDialog + self~newRadioButton(IDC_RB_CHECKLIST)~check + + +::method ok unguarded + reply 0 + + select + when self~newRadioButton(IDC_RB_CHECKLIST)~checked then self~checkList + when self~newRadioButton(IDC_RB_INTEGERBOX)~checked then self~integerBox + when self~newRadioButton(IDC_RB_INPUTBOX)~checked then self~inputBox + when self~newRadioButton(IDC_RB_LISTCHOICE)~checked then self~listChoice + when self~newRadioButton(IDC_RB_MULTIINPUTBOX)~checked then self~multiInputBox + when self~newRadioButton(IDC_RB_MULTILISTCHOICE)~checked then self~multiListChoice + when self~newRadioButton(IDC_RB_PASSWORDBOX)~checked then self~passwordBox + when self~newRadioButton(IDC_RB_SINGLESELECTION)~checked then self~singleSelection + when self~newRadioButton(IDC_RB_TIMEDMESSAGE)~checked then self~timedMessage + otherwise nop + end + -- End select + + +/********************************************************************/ +/* How to use "CheckList" class */ +/********************************************************************/ +::method checkList private + lst.1 = "Monday" ; lst.2 = "Tuesday" ; lst.3 = "Wednesday" ; lst.4 = "Thursday" + lst.5 = "Friday" ; lst.6 = "Saturday"; lst.7 = "Sunday" + + do i = 101 to 107 + chk.i = 0 + end + chk.102 = 1 + chk.104 = 1 + + d = .CheckList~new("This is a checklist dialog","Checklist",lst., chk.) + + msg = "Your CheckList data:" || .endOfLine~copies(2) + if d~execute = 1 then do i = 101 to 107 + a = i-100 + if chk.i = 1 then msg ||= " ->" lst.a || .endOfLine + end + else do + msg ||= 'The user canceled the dialog.' + end + self~displayResult(msg, 'Check List Dialog Results') + + +/********************************************************************/ +/* How to use "InputBox" class */ +/********************************************************************/ +::method inputBox private + d = .InputBox~new("This is an input dialog, please enter some data","InputBox") + msg = "Your InputBox data:" || .endOfLine~copies(2) || d~execute + self~displayResult(msg, 'Input Box Dialog Results') + + +/********************************************************************/ +/* How to use "IntegerBox" class */ +/********************************************************************/ +::method integerBox private + d = .IntegerBox~new("This is an integer dialog, please enter numerical data","IntegerBox") + msg = "Your IntegerBox data:" || .endOfLine~copies(2) || d~execute + self~displayResult(msg, 'Integer Box Dialog Results') + + +/********************************************************************/ +/* How to use "ListChoice" class */ +/********************************************************************/ +::method listChoice private + lst.1 = "Monday" ; lst.2 = "Tuesday" ; lst.3 = "Wednesday" ; lst.4 = "Thursday" + lst.5 = "Friday" ; lst.6 = "Saturday"; lst.7 = "Sunday" + + d = .ListChoice~new("This is a listchoice dialog, please select the day","ListChoice",lst., , , 'Thursday') + s = d~execute + msg = "Your ListChoice data:" || .endOfLine~copies(2) || s + self~displayResult(msg, 'List Choice Dialog Results:') + + +/********************************************************************/ +/* How to use "MultiInputBox" class */ +/********************************************************************/ +::method multiInputBox private + lab.1 = "First name: " + lab.2 = "Last name: " + lab.3 = "Street and City: " + lab.4 = "Profession:" + + addr.101 = "John" ; addr.102 = "Smith" ; addr.103 = "" + addr.104 = "Software Engineer" + + d = .MultiInputBox~new("This is a multi input dialog, please enter the address","Your Address",lab., addr.) + msg = "Your MultiInputBox data:" || .endOfLine~copies(2) + if d~execute = 1 then do + msg || = " ->" d~FirstName || .endOfLine || " ->" d~LastName || .endOfLine ||- + " ->" d~StreetandCity || .endOfLine || " ->" d~Profession + end + else do + msg ||= 'The user canceled the dialog.' + end + self~displayResult(msg, 'MultiInput Box Dialog Results:') + + +/********************************************************************/ +/* How to use "MultiListChoice" class */ +/********************************************************************/ +::method multiListChoice private + lst.1 = "Monday" ; lst.2 = "Tuesday" ; lst.3 = "Wednesday" ; lst.4 = "Thursday" + lst.5 = "Friday" ; lst.6 = "Saturday"; lst.7 = "Sunday" + + d = .MultiListChoice~new("This is a multiple list choice dialog, please select the days",, + "MultipleListChoice",lst.) + s = d~execute + msg = "Your MultiListChoice data:" || .endOfLine~copies(2) || "returned indexes:" s || .endOfLine~copies(2) + if s <> 0 then do while s <> "" + parse var s res s + if res <> "" then msg ||= " ->" lst.res || .endOfLine + end + self~displayResult(msg, 'MultiList Choice Dialog Results') + + +/********************************************************************/ +/* How to use "PasswordBox" class */ +/********************************************************************/ +::method passwordBox private + d = .PasswordBox~new("Please enter your password","Security") + msg = "Your PasswordBox data:" || .endOfLine~copies(2) || d~execute + self~displayResult(msg, 'Password Box Dialog Results') + + +/********************************************************************/ +/* How to use "SingleSelection" class */ +/********************************************************************/ +::method singleSelection private + mon.1 = "January" ; mon.2 = "February" ; mon.3 = "March" ; mon.4 = "April" + mon.5 = "May" ;mon.6 = "June" ; mon.7 = "July" ; mon.8 = "August" + mon.9 = "September";mon.10= "October" ; mon.11= "November"; mon.12= "December" + + d = .SingleSelection~new("This is a single selection dialog","Single Selection",mon.,6,,6) + d~focusControl(106) + s = d~execute + msg = "Your SingleSelection data:" || .endOfLine~copies(2) + if s > 0 then do + msg ||= mon.s + end + else do + msg ||= 'The user canceled the dialog.' + end + self~displayResult(msg, 'Single Selection Dialog Results') + + +/********************************************************************/ +/* How to use "TimedMessage" class */ +/********************************************************************/ +::method timedMessage private + d = .TimedMessage~new("This is a timed message, maybe you will need it sometime", "Hello !", 4000) + d~execute + + +::method displayResult private + use strict arg msg, title + + j = MessageDialog(msg, self~hwnd, title, "OK", "INFORMATION") + diff --git a/modules/windows/oodialog/oodStandardRoutines.rex b/modules/windows/oodialog/oodStandardRoutines.rex new file mode 100755 index 0000000..66f188e --- /dev/null +++ b/modules/windows/oodialog/oodStandardRoutines.rex @@ -0,0 +1,330 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** ooDialog\Samples\oodStandardRoutines.rex Standard Public Routines Demo + * + * This example application pops up a dialog from which any of the standard + * public routines provided by the ooDialog framework can be selected and + * displayed. These routines are used to create a short cut to launching one of + * the standard dialogs provided by ooDialog. + * + * For a similar example program that displays the standard dialogs, see the + * oodStandardDialogs.rex example. + * + * Note the use of the defaultIcon() method to give all the dialogs shown during + * the execution of this example a similar look. + * + * Note also that both this example and the oodStandardDialogs example share the + * same resource script and .h file. + */ + + sd = locate() + .application~setDefaults('O', sd'rc\oodStandardDialogs.h') + .application~defaultIcon(sd'bmp\oodStandardRoutines.ico') + + dlg = .StandardRoutines~new(sd"rc\oodStandardDialogs.rc", IDD_STDRTNS) + dlg~execute("SHOWTOP") + +return 0 +-- End of entry point. + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" + +::class 'StandardRoutines' subclass RcDialog + +::constant COMMON_TITLE "Standard Public Routines Demo" + +::method initDialog + self~newRadioButton(IDC_RB_ASKDIALOG_R)~check + + +::method ok unguarded + reply 0 + + select + when self~newRadioButton(IDC_RB_ASKDIALOG_R)~checked then self~askDialog + when self~newRadioButton(IDC_RB_CHECKLIST_R)~checked then self~checkList + when self~newRadioButton(IDC_RB_ERRORDIALOG_R)~checked then self~errorDialog + when self~newRadioButton(IDC_RB_FILENAMEDIALOG_R)~checked then self~fileNameDialog + when self~newRadioButton(IDC_RB_INFODIALOG_R)~checked then self~infoDialog + when self~newRadioButton(IDC_RB_INTEGERBOX_R)~checked then self~integerBox + when self~newRadioButton(IDC_RB_INPUTBOX_R)~checked then self~inputBox + when self~newRadioButton(IDC_RB_LISTCHOICE_R)~checked then self~listChoice + when self~newRadioButton(IDC_RB_MESSAGEDIALOG_R)~checked then self~messageDialog + when self~newRadioButton(IDC_RB_MULTIINPUTBOX_R)~checked then self~multiInputBox + when self~newRadioButton(IDC_RB_MULTILISTCHOICE_R)~checked then self~multiListChoice + when self~newRadioButton(IDC_RB_PASSWORDBOX_R)~checked then self~passwordBox + when self~newRadioButton(IDC_RB_SINGLESELECTION_R)~checked then self~singleSelection + when self~newRadioButton(IDC_RB_TIMEDMESSAGE_R)~checked then self~timedMessage + otherwise nop + end + -- End select + + +::method askDialog private + + msg = 'AskDialog routine:' || .endOfLine~copies(2) || - + 'This routine is good for getting input' || .endOfLine || - + 'from the user, when the input can be' || .endOfLine || - + 'supplied by a simple Yes or No answer.' || .endOfLine~copies(2) || - + 'Was this information helpful to you?' + + if AskDialog(msg) then do + msg = 'Glad this example is of use.' || .endOfLine~copies(2) || - + 'Did you notice the default button has changed?' + + ret = AskDialog(msg, 'N') + end + else do + msg = 'Well, the text for the message is a littel contrived.' || .endOfLine~copies(2) || - + 'Did you notice the default button has changed?' + + ret = AskDialog(msg, 'N') + end + + +::method checkList private + chks = .array~new + chks[3] = .true + chks[4] = .true + + labels = .array~of("Jan", "Feb", "Mar", "April in Paris is nice", - + "May", "Jun", "Jul", "Aug", - + "Sep", "Oct", "Nov", "Dec") + + ar = CheckList('Select a few months:', self~COMMON_TITLE, labels, chks, , 4) + + msg = 'Check list routine results:' || .endOfLine~copies(2) + if ar \= .nil then do i=1 to ar~items + if ar[i] = 1 then msg ||= ' CheckList['i'] (' || labels[i] || ') is checked.' || .endOfLine + end + else do + msg ||= 'The user canceled.' + end + + self~displayResult(msg, 'Check List Public Routine') + + +::method errorDialog private + + msg = 'ErrorDialog routine:' || .endOfLine~copies(2) || - + 'This routine is good for displaying error' || .endOfLine || - + 'messages to the user. Serious warning' || .endOfLine || - + 'messages might also be appropriate for this' || .endOfLine || - + 'routine.' + + return ErrorDialog(msg) + + +::method fileNameDialog private + + ooRexxHome = value("REXX_HOME", , 'ENVIRONMENT' ) + if ooRexxHome~length == 0 then path = 'C:\Program Files\ooRexx\' + else path = ooRexxHome || '\' + + delimiter = '0'x + filemask = 'All Files (*.*)'delimiter'*.*'delimiter + + fileName = FileNameDialog(path, self~hwnd, filemask) + + if fileName == 0 then msg = 'You did not select a file.' + else msg = 'You selected' fileName 'as your pick.' + self~displayResult(msg, 'File Name Dilaog Public Routine') + + +::method infoDialog private + + msg = 'InfoDialog routine:' || .endOfLine~copies(2) || - + 'This routine is good for displaying short' || .endOfLine || - + 'bits of information to the user, when no' || .endOfLine || - + 'reply from the user is needed.' + + return InfoDialog(msg) + + +::method inputBox private + + width = 60 + data = Inputbox('Please enter some fact:', self~COMMON_TITLE, , 200) + if data \== '' then msg = 'You entered:' data 'is that a fact?' + else msg = 'You canceled and did not enter any fact.' + self~displayResult(msg, 'Input Box Public Routine', .true) + + +::method integerBox private + + integer = Integerbox('Please enter a numeric value now:', self~COMMON_TITLE) + if integer \== '' then msg = 'You entered:' integer + else msg = 'You canceled and did not enter any value.' + self~displayResult(msg, 'Integer Box Public Routine') + + +::method listChoice private + + day = ListChoice('Select your favorite day:', self~COMMON_TITLE, - + .array~of("Monday", "Tuesday", "Wednesday", "Tursday", - + "Friday", "Saturday", "Sunday"), 102) + if day \== .nil then do + msg = 'So, your favorite day is' day'?' + self~displayResult(msg, 'List Choice Public Routine', .true) + end + else do + msg = 'You canceled and did not pick a favorite day.' + self~displayResult(msg, 'List Choice Public Routine') + end + + +::method messageDialog private + + msg = 'MessageDialog routine:' || .endOfLine~copies(2) || - + 'The message dialog gives the progammer more' || .endOfLine || - + 'flexibilty in crafting a dialog to inform the' || .endOfLine || - + 'user or to solicit information from the user.' || .endOfLine~copies(2) || - + 'That is a good thing, is it not?' + + do while .true + ret = MessageDialog(msg, self~hwnd, self~COMMON_TITLE, 'YESNOCANCEL', 'INFORMATION') + if ret == self~IDCANCEL then return + + if ret == self~IDNO then do + msg1 = 'No is not an appropriate answer!' + ret = MessageDialog(msg1, self~hwnd, self~COMMON_TITLE, 'RETRYCANCEL', 'EXCLAMATION', 'DEFBUTTON2') + if ret == self~IDCANCEL then return + end + else do + msg1 = 'Yes is the correct answer.' + ret = MessageDialog(msg1, self~hwnd, self~COMMON_TITLE, 'CANCELTRYCONTINUE', 'INFORMATION', 'DEFBUTTON3') + if ret == self~IDCANCEL then return + else if ret = self~IDTRYAGAIN then iterate + + msg2 = 'I could continue asking questions all day.' + ret = MessageDialog(msg2, self~hwnd, self~COMMON_TITLE, 'ABORTRETRYIGNORE', 'WARNING', 'DEFBUTTON3') + if ret == self~IDABORT then return + end + end + + +::method multiInputBox private + + editWidth = 100 + tab = '09'x + labels = .array~of("&First name", "Last &name", "&State") + + ar = MultiInputBox('Enter employee information:', self~COMMON_TITLE, - + labels, .array~of("Ueli", "Wahli", ''), 100) + + msg = 'Multi Input Box routine results:' || .endOfLine~copies(2) + if ar \== .nil then do i = 1 to 3 + msg ||= labels[i]~changeStr('&', '') || tab || ':' ar[i] || .endOfLine + end + else do + msg ||= 'You canceled the dialog.' + end + self~displayResult(msg, 'Multi Input Box Public Routine') + + +::method multiListChoice private + + labels = .array~of("Monday", "Tuesday", "Wednesday", "Tursday", "Friday", "Saturday", "Sunday") + + msg = 'Multi List Choice routine results:' || .endOfLine~copies(2) + ar = MultiListChoice('Select several days:', self~COMMON_TITLE, labels) + if ar \= .nil then do + msg ||= 'You selected' || .endOfLine + do i = 1 to ar~items + msg ||= ' ' ar[i] || .endOfLine + end + end + else do + msg ||= 'You did not select any days.' + end + self~displayResult(msg, 'Multi List Choice Public Routine') + + +::method passwordBox private + + -- This just shows that the password box increases in width to fit the prompt. + p = Passwordbox('Please enter a password, and be quick about it:', self~COMMON_TITLE) + msg = 'The password entered was:' p + self~displayResult(msg, 'Password Box Public Routine') + + p = Passwordbox('Password:', self~COMMON_TITLE) + msg = 'The password entered was:' p + self~displayResult(msg, 'Password Box Public Routine') + + + +::method singleSelection private + + labels = .array~of("Jan", "Feb", "Mar", "Apr", "May", "Jun", "July is the hottest month", - + "Aug", "Sep", "Oct", "Nov", "Dec") + selected = 7 + + choice = SingleSelection('Select one:', self~COMMON_TITLE, labels, selected) + msg = 'You selected' labels[choice] + self~displayResult(msg, 'Single Selection Public Routine') + + -- This shows the radio buttons do not have to be all in 1 row. Here we + -- break the buttons up so that no more than 6 are in 1 row. + selected = 3 + maxInRow = 6 + choice = SingleSelection('Select one, one more time:', self~COMMON_TITLE, labels, selected, , maxInRow) + msg = 'You selected' labels[choice] + self~displayResult(msg, 'Single Selection Public Routine') + + + +::method timedMessage private + + x = TimedMessage('Please read this message. You will have to be quick.', 'Message', 2000) + + +::method displayResult private + use strict arg msg, title, isQuestion = .false + + icon = "INFORMATION" + bttn = "OK" + if isQuestion then do + icon = "QUESTION" + bttn = "YESNO" + end + j = MessageDialog(msg, self~hwnd, title, icon, bttn) + diff --git a/modules/windows/oodialog/oodpbar.rex b/modules/windows/oodialog/oodpbar.rex new file mode 100755 index 0000000..8cac32a --- /dev/null +++ b/modules/windows/oodialog/oodpbar.rex @@ -0,0 +1,186 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: oodpbar.rex */ +/* Type: Open Object Rexx Script using ooDialog */ +/* Resource: oodpbar.rc */ +/* */ +/****************************************************************************/ + +-- Use the global .constDir for symbolic IDs +.application~useGlobalConstDir('O') + +sd = locate() + +myDialog = .MyDialogClass~new(sd"rc\oodpbar.rc") +if myDialog~initCode = 0 then do + rc = myDialog~execute("SHOWTOP") +end + +/* Add program code here */ + +exit /* leave program */ + + +::requires "ooDialog.cls" /* This file contains the ooDialog classes */ + +/* ---------------------------- Directives ---------------------------------*/ + +::class 'MyDialogClass' subclass RcDialog + +::method init + forward class (super) continue /* call parent constructor */ + initRet = Result + + /* Connect dialog control items to class methods. Ok, Cancel, and Help are + * already connected by the super class init() + */ + + /* Initial values that are assigned to the object attributes */ + + /* Add your initialization code here */ + return initRet + + +::method initDialog + + /* Initialize progress bar IDC_PBAR_A */ + curPB = self~newProgressBar("IDC_PBAR_A") + if curPB \= .nil then do + curPB~setRange(0,100) + curPB~setStep(50) + curPB~setPos(10) + end + + /* Initialize progress bar IDC_PBAR_B */ + curPB = self~newProgressBar("IDC_PBAR_B") + if curPB \= .nil then do + curPB~setRange(0,100) + curPB~setStep(40) + curPB~setPos(20) + end + + /* Initialize progress bar IDC_PBAR_C */ + curPB = self~newProgressBar("IDC_PBAR_C") + if curPB \= .nil then do + curPB~setRange(0,100) + curPB~setStep(30) + curPB~setPos(30) + end + + /* Initialize progress bar IDC_PBAR_D */ + curPB = self~newProgressBar("IDC_PBAR_D") + if curPB \= .nil then do + curPB~setRange(0,100) + curPB~setStep(20) + curPB~setPos(40) + end + + /* Initialize progress bar IDC_PBAR_E */ + curPB = self~newProgressBar("IDC_PBAR_E") + if curPB \= .nil then do + curPB~setRange(0,100) + curPB~setStep(10) + curPB~setPos(50) + end + + /* Othe initialization Code (e.g. fill list and combo boxes) */ + return 0 + + +::method defineDialog + + if self~initCode = 0 then do + -- Additional dialog control items could be added here. e.g. + -- createEditInputGroup(), createDateTimePicker(), etc.. However, that is + -- rarely done with a RcDialog. It makes more sense to simply have all the + -- controls in the resource script file. + end + + +/* --------------------- event handler(s) ------------------------------------*/ + + -- Method 0k is automatically connected to the button CLICK event with the + -- resource ID of IDOK by the ooDialog framework. In the resource script + -- file: "rc\oodpbar.rc" the button with ID of IDOK is labeled 'step' +::method ok unguarded + /* step each progress bar by the step set with the setStep method */ + curPB = self~newProgressBar("IDC_PBAR_A") + curPB~step + curPB = self~newProgressBar("IDC_PBAR_B") + curPB~step + curPB = self~newProgressBar("IDC_PBAR_C") + curPB~step + curPB = self~newProgressBar("IDC_PBAR_D") + curPB~step + curPB = self~newProgressBar("IDC_PBAR_E") + curPB~step + return 0 + + -- Method cancel is automatically connected to resource ID IDCANCEL by the + -- ooDialog framework. +::method cancel unguarded + /* Calling the superclass cancel will *always* close the dialog. If you want + * to over-ride that behavior, for example to ask the user if she is sure she + * wants to cancel, do not call the super class cancel first. Here, commented + * out, is one possible over-ride. + */ + + /* + text = 'There are unsaved changes, are you'.endOfLine'sure you want to cancel?' + title = "Abort All Changes !" + ret = MessageDialog(text, self~hwnd, title, "YESNO", "WARNING", "DEFBUTTON2") + say 'ret' ret 'self~IDYES:' self~IDYES + if ret == self~IDYES then return self~cancel:super + else return 1 + */ + + return self~cancel:super + + -- Method help() is automatically connected to resource ID IDHELP by the + -- ooDialog framework. The super class does nothing, you need to over-ride + -- this method to actually do anything. +::method help unguarded + + text = "There is no help for oodpbar.rex" + title = "The ooDialog ProgressBar Example" + + ret = MessageDialog(text, self~hwnd, title, "OK", "EXCLAMATION") + + return 0 + diff --git a/modules/windows/oodialog/oodraw.rex b/modules/windows/oodialog/oodraw.rex new file mode 100755 index 0000000..e9be291 --- /dev/null +++ b/modules/windows/oodialog/oodraw.rex @@ -0,0 +1,721 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * oodraw.rex, an ooDialog sample program. + * + * This example demonstrates how to do custom drawing in ooDialog. It uses + * a large button as the drawing surface. + */ + + sd = locate() + .application~useGlobalConstDir("O", sd'ooDraw.h') + + d = .drawDlg~new + if d~initCode <> 0 then do + say 'The Draw dialog was not created correctly. Aborting.' + return d~initCode + end + d~execute("SHOWTOP") + + return 0 + +/*---------------------------------- requires ------------------------*/ + +::requires "ooDialog.cls" + +/*---------------------------------- dialog class --------------------*/ + +::class 'drawDlg' subclass UserDialog + +::attribute interrupted unguarded + +::method init + expose colornames + + forward class (super) continue + + colornames = .array~of('dark red', 'dark green', 'dark yellow', 'dark blue', - + 'purple', 'blue grey', 'light grey', 'pale green', - + 'light blue', 'white', 'grey', 'dark grey', 'red', - + 'light green', 'yellow', 'blue', 'pink', 'turquoise') + self~interrupted = .true + + if \ self~createcenter(200, 235, "ooDialog Color Drawing Demonstration", , , "System", 8) then + self~initCode = 1 + +::method defineDialog + + self~createPushButton(IDC_PB_DRAW, 0,0,200,200, "DISABLED NOTAB") -- The drawing surface. + + self~createPushButton(IDC_PB_BRUSH_RECTANGLES, 5, 205, 55, 12, ,"&Rectangles","brushRectangles") + self~createPushButton(IDC_PB_PEN_RECTANGLES, 62, 205, 55, 12, ,"&Pen Rectangles","penRectangles") + self~createPushButton(IDC_PB_PIXELS, 119, 205, 36, 12, ,"Pi&xels","pixels") + self~createPushButton(IDC_PB_STAR_LINES, 5, 220, 36, 12, ,"S&tar","starLines") + self~createPushButton(IDC_PB_RANDOM_LINES, 43, 220, 36, 12, ,"&Lines","randomLines") + self~createPushButton(IDC_PB_RANDOM_SQUARES, 81, 220, 36, 12, ,"&Squares","randomSquares") + self~createPushButton(IDC_PB_ELLIPSES, 119, 220, 36, 12, ,"&Ellipses","circleEllipses") + + self~createPushButton(IDC_PB_INTERRUPT, 160, 205, 35, 12, "DEFAULT", "&Interrupt", "interrupt") + self~createPushButton(IDCANCEL, 160, 220, 35, 12, ,"&Cancel") + + do i=5 to 49 + self~createBlackRect(-1, 2*i, 2*i, 200-4*i, 200-4*i, "BORDER") + end + do i=51 to 99 + self~createWhiteRect(-1, i+25, i+25, 200-2*i, 200-2*i, "BORDER") + end + +::method initDialog unguarded + expose x y dc myBrush myPen recThick linthick ranthick kpix change sysFont oldFont + + self~disableControl(IDC_PB_INTERRUPT) /* cannot interrupt yet */ + change = 0 + recThick = 0; linthick = 1; ranthick=0; kpix = 1; + x = self~factorx + y = self~factory + + dc = self~getButtonDC(IDC_PB_DRAW) + myBrush = self~createBrush(10) /* white */ + myPen = self~createPen(1,'solid',0) /* thin black */ + sysFont = self~createFontEx("System",10) + oldFont = self~FontToDC(dc,sysFont) + self~writeToButton(IDC_PB_DRAW,45*x,30*y,"Black rectangles","Arial",12,"BOLD") + self~writeToButton(IDC_PB_DRAW,80*x,80*y,"White rectangles","Arial",12,"BOLD") + +::method interrupt unguarded + self~interrupted = .true + self~disableControl(IDC_PB_INTERRUPT) + +::method cancel unguarded -- Stop the drawing program and quit. + expose x y dc myBrush myPen sysFont oldFont + + drawSurface = self~newPushButton(IDC_PB_DRAW) + self~interrupted = .true + j = msSleep(1) + + opts = .directory~new + opts~weight = 700 + tmpFont = self~createFontEx("Arial",28,opts) + xFont = self~fontToDC(dc,tmpFont) + + do i = 2 to 6 + if i // 2 = 1 then self~transparentText(dc) + else self~opaqueText(dc) + self~writeDirect(dc, 30 * x, 25 * i * y, "Good bye !") + j = SysSleep(.5) + end + + self~fontToDC(dc,oldFont) + self~deletefont(tmpFont) + self~deletefont(sysFont) + self~deleteObject(myBrush) + self~deleteObject(myPen) + self~freeButtonDC(IDC_PB_DRAW,dc) + + call msSleep 1000 + + self~cancel:super + +::method enableButtons -- Enable the selection buttons, disable interrupt. + self~enableControl(IDCANCEL) + self~enableControl(IDC_PB_BRUSH_RECTANGLES) + self~enableControl(IDC_PB_PEN_RECTANGLES) + self~enableControl(IDC_PB_PIXELS) + self~enableControl(IDC_PB_STAR_LINES) + self~enableControl(IDC_PB_RANDOM_LINES) + self~enableControl(IDC_PB_RANDOM_SQUARES) + self~enableControl(IDC_PB_ELLIPSES) + self~disableControl(IDC_PB_INTERRUPT) + +::method disableButtons -- Disable the selection buttons, enable interrupt. + self~disableControl(IDCANCEL) + self~disableControl(IDC_PB_BRUSH_RECTANGLES) + self~disableControl(IDC_PB_PEN_RECTANGLES) + self~disableControl(IDC_PB_PIXELS) + self~disableControl(IDC_PB_STAR_LINES) + self~disableControl(IDC_PB_RANDOM_LINES) + self~disableControl(IDC_PB_RANDOM_SQUARES) + self~disableControl(IDC_PB_ELLIPSES) + self~enableControl(IDC_PB_INTERRUPT) + +::method greyButton -- Repaint the drawing surface all grey. + expose x y dc change + change = 0 + brush = self~createBrush(7) + pen = self~createPen(1, 'solid', 7) + ob = self~objectToDC(dc, brush) + op = self~objectToDC(dc, pen) + + self~rectangle(dc, x, y, 199 * x, 199 * y, 'FILL') + + self~objectToDC(dc, op) + self~objectToDC(dc, ob) + self~deleteObject(brush) + self~deleteObject(pen) + +::method brushRectangles /* draw rectangles */ + expose x y dc myBrush myPen recThick change + + self~disableButtons + + if change \= 3 then do + self~greyButton + self~rectangle(dc, 26 * x, 26 * y, 174 * x, 174 * y, 'FILL') + end + + op = self~objectToDC(dc, myPen) + ob = self~objectToDC(dc, myBrush) + if change = 3 then signal doRectangles + + do col = 0 to 18 + i = col + 1 + brush = self~createBrush(col) + self~objectToDC(dc, brush) + j = 5*i + self~rectangle(dc, j * x, j * y, (200 - j) * x, (200 - j) * y, 'FILL') + self~objectToDC(dc,ob) + self~deleteObject(brush) + end + + self~writeToButton(IDC_PB_DRAW, 25 * x, 15 * y, "Colored brush rectangles", "Arial", 12, "BOLD") + call msSleep 2000 + change = 3 + +doRectangles: + self~transparentText(dc) + self~interrupted = .false + do recThick = recThick + 1 to 100 while \ self~interrupted + self~objectToDC(dc, myPen) + self~objectToDC(dc, myBrush) + self~rectangle(dc, 7 * x, 7 * y, 193 * x, 193 * y, 'FILL') + + do k = 1 to 25 while \ self~interrupted + brushcol = random(1, 18) + brush = self~createBrush(brushcol) + if recThick // 3 = 0 then pencol = brushcol + else pencol = random(1, 18) + + thick = recThick % 3 + 1 + pen = self~createPen(thick, 'solid', pencol) + self~objectToDC(dc, pen) + self~objectToDC(dc, brush) + px = random(10, 190) * x + py = random(10, 180) * y + pxx= random(10, 190) * x + pyy= random(10, 180) * y + + if recThick // 3 = 2 then self~rectangle(dc, px, py, pxx, pyy) + else self~rectangle(dc, px, py, pxx, pyy, 'FILL') + + self~objectToDC(dc, ob) + self~objectToDC(dc, op) + self~deleteObject(pen) + self~deleteObject(brush) + end + + if recThick // 3 = 1 then do + self~writeDirect(dc, 15 * x, 183 * y, "Random filled rectangles of thickness" thick) + end + else do + if recThick // 3 = 2 then self~writeDirect(dc, 15 * x, 183 * y, "Random rectangles of thickness" thick) + else self~writeDirect(dc, 15 * x, 183 * y, "Random unicolor rectangles") + end + + if \ self~interrupted then do + call msSleep 2000 + end + end + self~objectToDC(dc, op) + self~objectToDC(dc, ob) + self~opaqueText(dc) + self~interrupted = .true + self~enableButtons + +::method penRectangles unguarded /* draw rectangles with pen */ + expose x y dc myBrush myPen + self~disableButtons + self~greyButton + op = self~objectToDC(dc, myPen) + ob = self~objectToDC(dc, myBrush) + do col = 0 to 18 + i = col + 1 + pen = self~createPen(5, 'solid', col) + self~objectToDC(dc, pen) + j = 5 * i + 1 + self~rectangle(dc, j * x, j * y, (200 - j) * x, (200 - j) * y, 'FILL') + self~objectToDC(dc, op) + self~deleteObject(pen) + end + + self~writeToButton(IDC_PB_DRAW, 35 * x, 24 * y, "Colored pen rectangles", "Arial", 12, "BOLD") + styles = .array~of('solid', 'dash', 'dot', 'dashdot', 'dashdotdot', 'null') + call msSleep 2000 + + self~interrupted = .false + do k = 1 by 1 while \ self~interrupted + self~objectToDC(dc, myPen) + self~objectToDC(dc, myBrush) + self~rectangle(dc, 7 * x, 7 * y, 193 * x, 193 * y, 'FILL') + do i = 1 to 19 + if random(1, 4) = 1 | k // 2 = 0 then th = 1; else th = random(1, 8) + pen = self~createPen(th, styles[random(1, 6)], random(1, 18) ) + self~objectToDC(dc, pen) + + j = 5 * i + if k // 2 = 1 then self~rectangle(dc, j * x, j * y, (200 - j) * x, (200 - j) * y) + else self~rectangle(dc, random(10, 190) * x, random(10 , 180) * y, random(10, 190) * x, random(10, 180) * y) + + self~objectToDC(dc, op) + self~deleteObject(pen) + end + self~writeToButton(IDC_PB_DRAW, 25 * x, 24 * y, "Solid and dotted rectangles", "Arial", 12, "BOLD") + if \ self~interrupted then do + call msSleep 2000 + end + end + + self~objectToDC(dc, ob) + self~interrupted = .true + self~enableButtons + +::method pixels /* draw individual pixels */ + expose x y dc myBrush myPen kpix change + mx = trunc(100 * x); my = trunc(100 * y); size = 100 + self~disableButtons + if change \= 2 then do + self~greyButton + self~rectangle(dc, mx - size, my - size, mx + size + 2, my + size + 2, 'FILL') + end + change = 2 + self~writeToButton(IDC_PB_DRAW, 20 * x, 20 * y, "Drawing colored pixels", "Arial", 14, "BOLD") + call msSleep 1000 + + self~interrupted = .false + do kpix = kpix to size until self~interrupted + px = mx + kpix + do py = my - kpix + 2 to my + kpix while \ self~interrupted + if \ self~interrupted then self~pause + col= random(0, 18); self~drawPixel(dc, px, py, col) + end + + py = my + kpix + do px = mx + kpix - 1 by -1 to mx - kpix + 1 while \ self~interrupted + if \ self~interrupted then self~pause + col = random(0, 18); self~drawPixel(dc, px, py, col) + end + + px = mx - kpix + 1 + do py = my + kpix - 1 by -1 to my - kpix + 1 while \ self~interrupted + if \ self~interrupted then self~pause + col= random(0, 18); self~drawPixel(dc, px, py, col) + end + + py = my - kpix + 1 + do px = mx - kpix + 2 to mx + kpix while \ self~interrupted + if \ self~interrupted then self~pause + col= random(0, 18); self~drawPixel(dc, px, py, col) + end + if \ self~interrupted then self~writeDirect(dc, 125 * x, 170 * y, "Done" kpix) + end + if kpix >= size then do; change = 0; kpix = 1; end + + self~interrupted = .true + self~enableButtons + +::method starLines /* draw rotating lines */ + expose x y dc myBrush myPen linthick change + self~disableButtons + self~interrupted = .false + + op = self~objectToDC(dc, myPen) + ob = self~objectToDC(dc, myBrush) + if change \= 1 then do + self~greyButton + self~rectangle(dc, 26 * x, 26 * y, 174 * x, 174 * y, 'FILL') + end + change = 1 + self~writeToButton(IDC_PB_DRAW, 20 * x, 6 * y, "Drawing colored lines", "Arial", 14, "BOLD") + px = 100 * x + py = px + call msSleep 1000 + maxthick = 140 + do linthick = linthick by 1 to maxthick until self~interrupted + self~writeToButton(IDC_PB_DRAW, 20 * x, 185 * y, "Lines are" linthick "thick", "System", 10) + do j = 1 to 4 until self~interrupted + do i = 30 by linthick to 170 until self~interrupted + if \ self~interrupted then self~pause + if j = 1 then do; pxx = 170 * x; pyy = i * y ; end + if j = 2 then do; pyy = 170 * x; pxx = (200 - i) * y; end + if j = 3 then do; pxx = 30 * x; pyy = (200 - i) * y; end + if j = 4 then do; pyy = 30 * x; pxx = i * y ; end + col= random(0, 18) + pen = self~createPen(linthick,' solid', col) + self~objectToDC(dc, pen) + self~drawLine(dc, px, py, pxx, pyy) + self~objectToDC(dc, op) + self~deleteObject(pen) + end + end + end + if linthick >= maxthick then do; change = 0; linthick = 1; end + self~objectToDC(dc, ob) + self~interrupted = .true + self~enableButtons + +::method randomLines /* draw random lines */ + expose x y dc myBrush myPen change ranthick + + self~disableButtons + self~interrupted = .false + + if change \= 5 then do + self~greyButton + self~rectangle(dc, 26 * x, 26 * y, 174 * x, 174 * y, 'FILL') + end + change = 5 + op = self~objectToDC(dc, myPen) + ob = self~objectToDC(dc, myBrush) + self~writeToButton(IDC_PB_DRAW, 20 * x, 5 * y, "Drawing random lines", "Arial", 14, "BOLD") + call msSleep 1000 + + do ranthick = ranthick by 1 until self~interrupted + self~rectangle(dc, 15 * x, 15 * y, 185 * x, 185 * y, 'FILL') + pxx = 30 * x; pyy = 30 * y + maxthick = max(1, random(1, 150) - 10) /* favor 1 */ + do i = 0 to 49 until self~interrupted + if \ self~interrupted then self~pause + col= random(0, 18) + if ranthick // 2 = 1 then thickd = ranthick % 2 // 50 + 1 + else thickd = (maxthick - i * maxthick / 50) % 3 + 1 + pen = self~createPen(thickd, 'solid', col) + if i = 0 then do + if ranthick // 2 = 1 then text = "Connected lines of even thickness" thickd + else text = "Random lines of thickness" thickd "to 1 " + + self~writeToButton(IDC_PB_DRAW, 15 * x, 188 * y, text, "System", 10) + end + ix = trunc(thickd / 2 / x) + iy = trunc(thickd / 2 / y) + pxx = random(15 + ix, 185 - ix) * x + pyy = random(15 + iy, 185 - iy) * y + self~objectToDC(dc, pen) + if ranthick // 2 = 1 then do + /* connected lines */ + self~drawLine(dc,,,pxx,pyy) + end + else do + /* random lines */ + px = random(15 + ix, 185 - ix) * x + py = random(15 + iy, 185 - iy) * y + self~drawLine(dc, px, py, pxx, pyy) + end + self~objectToDC(dc, op) + self~deleteObject(pen) + end + if \self~interrupted then do + call msSleep 2000 + end + end + + self~objectToDC(dc, ob) + self~interrupted = .true + self~enableButtons + +::method randomSquares /* draw colored squares */ + expose x y dc myBrush myPen colornames + self~disableButtons + self~interrupted = .false + self~greyButton + blackbrush = self~createBrush(0) + op = self~objectToDC(dc, myPen) + ob = self~objectToDC(dc, blackbrush) + self~rectangle(dc, x, y, 199 * x, 199 * y, 'FILL') + self~objectToDC(dc, ob) + self~deleteObject(blackbrush) + self~writeToButton(IDC_PB_DRAW, 15 * x, 5 * y, "Drawing colored squares", "Arial", 14, "BOLD") + colorx = .array~of(1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 10) + colors = colorx~copy + sx = 10 * x; sy = 10 * y; sx5 = 5 * x; sy5 = 5 * y + do i = 1 by 1 until self~interrupted + if \ self~interrupted then self~pause + + px = random(1, 17) * sx + sx5 + py = random(1, 17) * sy + sy5 + col= colors[random(1, 18)] + brush = self~createBrush(col) + self~objectToDC(dc, brush) + self~rectangle(dc, px, py, px + sx, py + sy,'FILL') + self~objectToDC(dc, ob) + self~deleteObject(brush) + + if i // 50 = 0 then do + if i < 1000 then do + c1 = colors[min(i / 50, 18)]; c2 = 10 + colors[i / 50] = 10 /* make whiter */ + end + else do + i1 = i / 50 // 18 + 1; i2 = 18 - i % 250 // 18 + c1 = colors[i1]; c2 = colorx[i2] + colors[i1] = colorx[i2] /* shift colors */ + end + txt = '- ' colornames[c1]~left(20) '+ ' colornames[c2]~left(20) + self~writeToButton(IDC_PB_DRAW, 15 * x, 188 * y, txt, "System") + self~writeToButton(IDC_PB_DRAW, 150 * x, 188 * y, "Done" i, "System") + end + end + + self~objectToDC(dc, op) + self~interrupted = .true + self~enableButtons + +::method circleEllipses /* draw circles and ellipses */ + expose x y dc myBrush myPen colornames change jellipse + + self~interrupted = .false + self~disableButtons + + variat = 6 + if change \= 4 then do + self~greyButton + jellipse = 1 + end + op = self~objectToDC(dc, myPen) + ob = self~objectToDC(dc, myBrush) + if change = 4 then signal doEllipses + + self~writeToButton(IDC_PB_DRAW, 15 * x, 2 * y, "Drawing colored ellipses", "Arial", 14, "BOLD") + self~rectangle(dc, 10 * x, 10 * y, 190 * x, 190 * y, 'FILL') + do i = 1 to 18 until self~interrupted + if \ self~interrupted then self~pause + px = i * 5 + 5; py = i * 3 + 7 + self~drawEllipse(i, 3, px, py, 200 - px, 200 - py) + end + + call msSleep 2000 + if self~interrupted then signal restore + + self~rectangle(dc, 10 * x, 10 * y, 190 * x, 190 * y, 'FILL') + do i = 1 to 18 until self~interrupted + if \ self~interrupted then self~pause + px = i * 4 + 6; py = i * 5 + 5 + self~drawEllipse(random(1, 18),random(1, 4), px, py, 200 - px, 200 - py) + self~drawEllipse(random(1, 18),random(1, 4), py, px, 200 - py, 200 - px) + end + call msSleep 2000 + change = 4 + +DOELLIPSES: + if self~interrupted then signal restore + do jellipse = jellipse by 1 until self~interrupted + self~rectangle(dc, 10 * x, 10 * y, 190 * x, 190 * y, 'FILL') + self~setArcDirection(dc, 'COUNTERCLOCKWISE') + if jellipse // variat = 1 then do i = 1 to 18 until self~interrupted + /* concentric partial circles */ + px = i * 5 + 5; py = i * 5 + 5 + if i // 4 = 3 then do + if random(1, 2) = 1 then do + self~drawEllipse(random(1, 18), random(1, 10), px, py, 200 - px, 200 - py, 200, 100, 0, 100) + end + else do + self~drawEllipse(random(1, 18), random(1, 10), px, py, 200 - px, 200 - py, 0, 100, 200, 100) + end + end + else do + self~drawEllipse(random(1, 18), random(1, 10), px, py, 200 - px, 200 - py, - + (random(1, 2) - 1) * 200, (random(1, 2) - 1) * 200, - + (random(1, 2) -1 ) * 200, (random(1, 2) - 1) * 200) + end + if i = 1 then do + self~writeToButton(IDC_PB_DRAW, 15 * x, 190 * y, "concentric partial circles ", "System", 10) + end + end + else if jellipse // variat = 2 then do i = 1 to 50 until self~interrupted + /* random full ellipses */ + if \ self~interrupted then self~pause + px = random(15, 185); py = random(15, 185) + pxx= random(15, 185); pyy= random(15, 185) + col = random(1, 18) + self~drawEllipse(col, random(1, 10), px, py, pxx, pyy) + + if i // 3 = 1 & col \= 10 & abs(px - pxx) > 1 & abs(py - pyy) > 2 then do + brush = self~createBrush(random(1, 18)) + self~objectToDC(dc, brush) + self~fillDrawing(dc, (px + pxx) %2 * x, (py + pyy) % 2 * x, col) + self~objectToDC(dc, ob) + self~deleteObject(brush) + end + if i = 1 then do + self~writeToButton(IDC_PB_DRAW, 15 * x, 190 * y, "random complete ellipses", "System", 10) + end + end + else if jellipse // variat = 3 then do i = 1 to 40 until self~interrupted + /* random partial ellipses */ + if \ self~interrupted then self~pause + + if i // 3 = 0 then self~setArcDirection(dc, 'COUNTERCLOCKWISE') + else self~setArcDirection(dc, 'CLOCKWISE') + + px = random(15, 185); py = random(15, 185) + pxx= random(15, 185); pyy= random(15, 185) + sx = random(15, 185); sy = random(15, 185) + ex = random(15, 185); ey = random(15, 185) + self~drawEllipse(random(1, 18), random(1, 16), px, py, pxx, pyy, sx, sy, ex, ey) + if i = 1 then do + self~writeToButton(IDC_PB_DRAW, 15 * x, 190 * y, "random partial ellipses ", "System", 10) + end + end + else if jellipse // variat = 4 then do i = 1 to 20 until self~interrupted + /* nice pies */ + if \ self~interrupted then self~pause + + px = 15; py = 15; pxx = 185; pyy = 185 + if i < 11 then do + sx = 60 * i - 260 + ex = sx + 50 + end + else do + sx = 900 - 50 * i + ex = sx - 40 + end + + if i = 1 | i = 11 then sy = 100 + else if i < 11 then sy = 0 + else sy = 200 + + if i < 10 then ey = 0 + else if i = 10 then ey = 95 + else if i < 20 then ey = 200 + else ey = 105 + + col = random(1, 18) + self~drawPieX(col, col, 1, px, py, pxx, pyy, ex, ey, sx, sy) + if i=1 then do + self~writeToButton(IDC_PB_DRAW, 15 * x, 190 * y, "arranged pies ", "System", 10) + end + end + else if jellipse//variat = 5 then do i = 1 to 30 until self~interrupted + /* random pies */ + if \ self~interrupted then self~pause + + px = random(15, 185); py = random(15, 185) + pxx = random(15, 185); pyy= random(15, 185) + sx = random(15, 185); sy = random(15, 185) + ex = random(15, 185); ey = random(15, 185) + col = random(1, 18) + + if i // 2 = 1 then + self~drawPieX(col, random(1, 18), random(1, 8), px, py, pxx, pyy, sx, sy, ex, ey) + else + self~drawPieX(col, col, 1, px, py, pxx, pyy, sx, sy, ex, ey) + + if i = 1 then do + self~writeToButton(IDC_PB_DRAW, 15 * x, 190 * y, "random pies ", "System", 10) + end + end + else do i = 1 to 10 until self~interrupted | ret > 0 + /* random angle arcs */ + if \ self~interrupted then self~pause + + sx = 150 - random(1, 100); sy = 150 - random(1, 100) + px = 130 - random(1, 60); py = 130 - random(1, 60) + radius = random(20, min(px, 200 - px, py, 200 - py) - 10) + angle = random(1, 360); sweep = random(1, 360) + col = random(1, 18) + pen = self~createPen(random(3, 10), 'solid', col) + self~objectToDC(dc, pen) + + ret = self~drawAngleArc(dc, sx * x, sy * y, px * x, py * y, radius * x, angle, sweep) + if i // 2 = 1 then self~drawLine(dc, , , sx * x, sy * y) + self~objectToDC(dc, myPen) + self~deleteObject(pen) + + if i = 1 then do + self~writeToButton(IDC_PB_DRAW, 15 * x, 190 * y, "random angle arcs ", "System", 10) + end + if ret > 0 then do + self~writeToButton(IDC_PB_DRAW, 50 * x, 100 * y, "Not working on Windows 95", "System", 10) + end + end + if \ self~interrupted then do + call msSleep 2000 + end + end + +restore: + self~objectToDC(dc, op) + self~objectToDC(dc, ob) + self~setArcDirection(dc, 'COUNTERCLOCKWISE') + self~interrupted = .true + self~enableButtons + +::method drawEllipse private + expose x y dc myBrush myPen + use arg col, penth, px, py, pxx, pyy, sx, sy, ex, ey + + pen = self~createPen(penth, 'solid', col) + self~objectToDC(dc, pen) + + if arg()<7 then self~drawArc(dc, px * x, py * y, pxx * x, pyy * y) + else self~drawArc(dc, px * x, py * y, pxx * x, pyy * y, sx * x, sy * y, ex * x, ey * y) + + self~objectToDC(dc, myPen) + self~deleteObject(pen) + +::method drawPieX + expose x y dc myBrush myPen jellipse + use arg col, col2, penth, px, py, pxx, pyy, sx, sy, ex, ey + + pen = self~createPen(penth, 'solid', col) + if jellipse // 3 = 1 then brush = self~createBrush(col2) /* no args */ + else brush = self~createBrush(col) + + self~objectToDC(dc, pen) + self~objectToDC(dc, brush) + + self~drawPie(dc, px * x, py * y, pxx * x, pyy * y, sx * x, sy * y, ex * x, ey * y) + + self~objectToDC(dc, myPen) + self~objectToDC(dc, myBrush) + + self~deleteObject(pen) + self~deleteObject(brush) + +::method pause + j = msSleep(10) + diff --git a/modules/windows/oodialog/oograph.rex b/modules/windows/oodialog/oograph.rex new file mode 100755 index 0000000..09452ca --- /dev/null +++ b/modules/windows/oodialog/oograph.rex @@ -0,0 +1,237 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: oograph.rex + * Type: Open Object REXX Script + * + * Description: A dialog that allows the user to execute two graphical ooRexx + * examples. One example displays bitmaps and the other example + * shows how to use the drawing methods provided by ooDialog. + * + * The main program, this program, shows how to use the + * scrollBitmapFromTo() and scrollInControl() methods. + * + * Note: this program uses the public routine, locate(), to get the full path + * name to the directory this source code file is located. In places, the + * variable holding this value has been callously abbreviated to 'sd' which + * stands for source directory. + * + */ + + -- Use the global .constDir for symbolic IDs + .application~useGlobalConstDir('O') + + .constDir[IDC_BMP_TOP] = 101 + .constDir[IDC_BMP_MIDDLE] = 102 + .constDir[IDC_ST_WFRAME] = 203 + .constDir[IDC_PB_OWNERDRAW] = 103 + .constDir[IDC_PB_VIEWER] = 111 + .constDir[IDC_PB_DRAW] = 112 + + d = .GraphDialog~new() + if d~initCode \= 0 then do + say "Dialog init did not work" + return d~initCode + end + + title = "Graphical Demonstration of Open Object Rexx and ooDialog Capabilities" + d~createCenter(trunc(770 / d~FactorX), trunc(470 / d~FactorY), title) + d~execute("SHOWTOP") + + return 0 + +/*-------------------------------- requires --------------------------*/ + +::requires "ooDialog.cls" +::requires "samplesSetup.rex" + +/*-------------------------------- dialog class ----------------------*/ + +::class 'GraphDialog' subclass UserDialog + +::method defineDialog + expose but2size sd + but2pos = trunc(170 / self~factorY) + but2size = trunc(300 / self~factorY) + + -- The two bitmap buttons are created larger than they need to be. In particular, + -- The IDC_BMP_MIDDLE button height is much larger, it covers most of the lower part of the + -- dialog. + -- + -- Then, the bitmaps for the buttons are positioned (moved from the upper left corner + -- of the button) by a large amount. The IDC_BMP_TOP button is positioned far to the right, + -- and the IDC_BMP_MIDDLE button is positioned far to the bottom and far to the left. In the + -- showInterface() method, scrollBitmapFromTo() is used to scroll the bitmaps from + -- their positions back to the upper left corner of the buttons. This gives the IDC_BMP_TOP + -- button the appearance of scrolling from the right to the left, and the IDC_BMP_MIDDLE button + -- the appearance of scrolling from the bottom to the top. + + -- install.bmp 550 x 100 pixels + -- install2.bmp 450 x 120 pixels + + sd = locate() + + self~createBitmapButton(IDC_BMP_TOP, 1, 10, self~sizeX-1, trunc(130 / self~factorY), "USEPAL", , , sd"bmp\install.bmp") + self~createBitmapButton(IDC_BMP_MIDDLE, 20, but2pos, self~sizeX - 20, but2size, , , , sd"bmp\install2.bmp") + + pos = .Point~new(trunc(self~sizeX * self~factorX) + 10, 0) + self~setBitmapPosition(IDC_BMP_TOP, pos) + + pos~x = 0 + pos~y = trunc(self~sizeY * self~factorY) + 10 + self~setBitmapPosition(IDC_BMP_MIDDLE, pos) + + -- Add the other controls. + self~createWhiteFrame(IDC_ST_WFRAME, 10, self~SizeY - 62, self~sizeX - 20, 38, "HIDDEN") + self~createPushButton(IDC_PB_OWNERDRAW, 12, self~SizeY - 60, self~sizeX - 24, 34, "OWNER NOTAB") + + groupArgs = "&Bitmap-Viewer" .constDir[IDC_PB_VIEWER] "bitmapViewer " || - + "&Draw-Color-Demo" .constDir[IDC_PB_DRAW] "ooDraw " || - + "&Cancel" .constDir[IDCANCEL] "cancel" + self~createPushButtonGroup(self~sizeX - 220, self~sizeY - 18, 60, 12, groupArgs, 1, "DEFAULT") + +::method initDialog + + -- We set the background color of these buttons to the same backgroud color + -- as the dialog, so that the buttons blend into the dialog. + COLOR_BTNFACE = 15 + self~setControlSysColor(IDC_PB_OWNERDRAW, COLOR_BTNFACE) + self~setControlSysColor(IDC_BMP_TOP, COLOR_BTNFACE) + self~setControlSysColor(IDC_BMP_MIDDLE, COLOR_BTNFACE) + + self~start("showInterface") + +::method showInterface unguarded + expose m but2size + + bmppos = trunc(but2size - 125 / self~FactorY) + + self~disableControl(IDC_PB_VIEWER) /* disable push buttons */ + self~disableControl(IDC_PB_DRAW) + self~disableControl(IDCANCEL) + + ret = play("inst.wav", yes) + + -- Scroll the bitmaps from their displaced positions back to the upper left corners + -- of the buttons. + self~scrollBitmapFromTo(IDC_BMP_TOP, trunc(self~SizeX * self~FactorX), 5, 12, 5, -12, 0, 1) + self~scrollBitmapFromTo(IDC_BMP_MIDDLE, 30, bmppos, 30, 0, 0, -3, 2, 1) + + -- The size of the IDC_BMP_MIDDLE button actually covers the controls under the button. If the + -- user clicks on any portion of the button, the button is repainted in the 'depressed' + -- state. Since the other controls are not repainted, this cause them (or parts of + -- them) to disappear. To prevent that, we resize the button to only take up the height + -- needed for the bitamp. + self~resizeControl(IDC_BMP_MIDDLE, 450 + 32, 120 + 2, "NOREDRAW") + + self~showControl(IDC_PB_OWNERDRAW) /* show scroll button */ + self~showControl(IDC_ST_WFRAME) + self~enableControl(IDCANCEL) /* Enable push buttons */ + self~enableControl(IDC_PB_VIEWER) + self~enableControl(IDC_PB_DRAW) + + -- Start the Asynchronuous scrolling of the introductory text. + text = "This ooDialog sample demonstrates dynamic dialog creation" + m = self~start("scrollInControl", IDC_PB_OWNERDRAW, text, "Arial", 36, "BOLD", 0, 2, 2, 6) + m~notify(.message~new(self, "scrollingFinished")) + + -- Now, wait until the scrolling finishes, or the user closes the main dialog. + self~waitForEvent + + -- While the user has not closed the dialog, scroll the instruction text. + do while self~isDialogActive + text = "... please press Bitmap-Viewer or Draw-Color-Demo buttons to run graphical applications ..." + m = self~start("scrollInControl", IDC_PB_OWNERDRAW, text, "Arial", 32, "SEMIBOLD", 0, 2, 4) + m~notify(.message~new(self, "scrollingFinished")) + + self~waitForEvent + end + +-- Wait until the haveEvent object variable turns .true. In this program we just +-- watch for two events, the scrolling text has finished, or the user has closed +-- the dialog. +::method waitForEvent unguarded + expose haveEvent + + haveEvent = .false + guard on when haveEvent + +-- This is the notification method for the scrolling text. It is invoked when +-- the scrollInControl() method has finished. The haveEvent object variable is +-- set to true which causes ourself to stop waiting. +::method scrollingFinished unguarded + expose haveEvent + haveEvent = .true + +-- leaving() is invoked by the ooDialog framework when the underlying dialog is +-- closed. It serves as a notification that the dialog is finished. The +-- default implementation does nothing. It can be, and ii meant to be, over- +-- ridden by the programmer when desired. We use it to signal ourself to stop +-- waiting by setting haveEvent to true. +::method leaving unguarded + expose haveEvent + haveEvent = .true + + +-- Invoke the Bitmap Viewer program (oobmpvu.rex.) +::method bitmapViewer + expose m sd + + -- Stop the scrolling and hide ourself. + if \ m~completed then self~scrollInControl(IDC_PB_OWNERDRAW) + self~hide + + call (sd"oobmpvu.rex") + + -- Show ourself and become the topmost. + self~~show~toTheTop + +-- Invoke the Color Draw Demo program (oodraw.rex.) +::method ooDraw + expose m sd + + -- Stop the scrolling and hide ourself. + if \ m~completed then self~scrollInControl(IDC_PB_OWNERDRAW) + self~hide + + call (sd"oodraw.rex") + + -- Show ourself and become the topmost. + self~~show~toTheTop + diff --git a/modules/windows/oodialog/oophil.ico b/modules/windows/oodialog/oophil.ico new file mode 100644 index 0000000000000000000000000000000000000000..332179b92c4eeb18d3ed43c913707ce063f0dc4f GIT binary patch literal 766 zcmchUu?>ST5Jis&AtahqsVOr?ip-KZTt!*IB8woqppCdevIY6y1{)A{&Ybb%-5Co+ z3XHZr3*&ndx!`_9w#XZ@kP@?qfjbTZ31dvWVa5_^WEcjBDO@s5Tp=;|2-EYi4d``L zjoZW__cql8A6Ub)#D3gz)Nb+6pXP1&6eb$*^oHu%o<-fd#}1VkH*t1{qOlS z3+u<)4!h6n)gm%e&js8cx^sPOAVZ@zu~&YN_)!~p9m(~J5g5H>Q%g;DVXy4T)~?y@ Z83pB?5&L=4{612OYW;Juu6O)*`~iyxD3AaE literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/oophil.rex b/modules/windows/oodialog/oophil.rex new file mode 100755 index 0000000..d07bcdf --- /dev/null +++ b/modules/windows/oodialog/oophil.rex @@ -0,0 +1,430 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * oophil.rex An ooDialog demonstration of the Philosopher's Forks + */ + + myDir = locate() + +/*---------------------- run default parameters ----------------------*/ + + parms.107 = 80 /* sleeping time 80 * 100 ms = 8 sec */ + parms.108 = 50 /* eating time 50 * 100 ms = 5 sec */ + parms.109 = 3 /* 3 repetitions */ + parms.104 = 0 /* radio button left fork first off */ + parms.105 = 0 /* right fork first off */ + parms.106 = 1 /* any fork first on */ + +/*---------------------- dialogs & resources -------------------------*/ + + v.anidialogID = 100 /* animation dialog graphical */ + v.anidialog = myDir'rc\oophil2.rc' + v.setdialogID = 101 /* setup dialog for parameters */ + v.setdialog = myDir'rc\oophil1.rc' + +/*---------------------- animation dialog IDs ------------------------*/ + + v.idp = 100 /* phil 101-105 */ + v.idf = 105 /* fork 106-110 */ + v.idhr = 111 /* hand-r 121,131,141,151,161 */ + v.idhl = 112 /* hand-l 122,132,142,152,162 */ + v.idcake = 120 /* cake */ + v.idpc = 110 /* piece of cake 111-115 */ + +/*---------------------- animation audio files -----------------------*/ + + v.help = myDir'wav\philhelp.wav' + v.stop = myDir'wav\philstop.wav' + v.eat = myDir'wav\phileat.wav' + v.sleep = myDir'wav\philslep.wav' + v.wait = myDir'wav\philwait.wav' + v.ouch = myDir'wav\philouch.wav' + v.cakewhere = myDir'wav\philstrt.wav' + v.cakenew = myDir'wav\philcake.wav' + + v.helptext = "<<< The values of this dialog determine the" , + "behavior of the Philosophers' Forks execution <<<" + +/*----------------------- bitmaps (will be memory loaded) ------------*/ + + vb.bmpblank = myDir'bmp\blank.bmp' + vb.bmpphil = myDir'bmp\philphil.bmp' + vb.bmpwait = myDir'bmp\philwait.bmp' + vb.bmpeat = myDir'bmp\phileat.bmp' + vb.bmpeat2 = myDir'bmp\phileat2.bmp' + vb.bmpsleep = myDir'bmp\philslep.bmp' + vb.bmpouch = myDir'bmp\philouch.bmp' + vb.bmpfork = myDir'bmp\fork.bmp' + vb.bmphandr = myDir'bmp\handrite.bmp' + vb.bmphandl = myDir'bmp\handleft.bmp' + vb.bmphandrf = myDir'bmp\handfkri.bmp' + vb.bmphandlf = myDir'bmp\handfkle.bmp' + vb.bmppiece = myDir'bmp\cakepiec.bmp' + do i=1 to 11 + icake = 'BMPCAKE'i + vb.icake = myDir'bmp\cake'i'.bmp' + end + +/*---------------------- main logic ----------------------------------*/ + + setUpDlg = .SetUpDialog~new(parms., v., vb.) + setUpDlg~execute("SHOWTOP") + + return 0 + + +/*---------------------- requires ooDialog ----------------------------*/ + +::requires 'ooDialog.cls' +::requires 'samplesSetup.rex' + + +/*---------------------- setup dialog ---------------------------------*/ + +::class 'SetupDialog' subclass UserDialog + +::method init + expose v. vb. + use arg parms., v., vb. + self~init:super(parms.) + self~load(v.setdialog, v.setdialogID, 'CENTER') + +::method initDialog + expose msg v. vb. + msg = .nil + + -- Set the up down controls. They all have a range from 0 to 1000. Then + -- we connect the delta postion event notification for the sleeping and + -- eating time controls so that we can increment them by 5 rather than 1. + do id = 107 to 109 + self~newUpDown(id)~setRange(0, 1000) + end + + self~connectUpDownEvent(107, "DELTAPOS", onDelta) + self~connectUpDownEvent(108, "DELTAPOS", onDelta) + + -- Load the bitmaps in to memory + do i over vb. + v.i = self~loadBitmap(vb.i) + end + +-- The user incremented (or decremented) one of the up down controls. We +-- intercept the notification so that we can increment (or decrement) by 5 +-- rather than 1. +::method onDelta + use arg pos, delta, id, hwnd + + return .UpDown~deltaPosReply(.true, .false, delta * 5) + +::method help + expose msg v. + if msg = .NIL then ret = Play(v.help, 'yes') + else if msg~completed then ret = Play(v.help, 'yes') + else ret = Play() + msg = self~start("scrollInButton", 110, v.helptext, - + "Arial", 30, "BOLD", 0, 4, 8) + return 0 + +::method ok /* run philosophers */ + expose msg v. + if msg \= .nil then + if msg~completed=0 then self~scrollInButton(110) + self~getDataStem(parms.) + /* philosopher dialog */ + dlg = .phildlg~new(v.) + if dlg~executeAsync(,"SHOWTOP") = 0 then do + dlg~myExecute(parms.) /* philosopher animation */ + dlg~endAsyncExecution + end + else call errorDialog "Couldn't execute Philosophers Forks Dialog" + +::method cancel + expose msg v. vb. + if msg \= .nil then + if \msg~completed then self~scrollInButton(110) + do i over vb. /* bitmaps out of memory */ + self~removeBitmap(v.i) + end + self~cancel:super + + +/*---------------------- animation dialog -----------------------------*/ + +::class 'PhilDlg' subclass UserDialog + +::attribute stopped unguarded + +::method init + expose v. + use arg v. + self~init:super + self~stopped = .false + self~load(v.anidialog, v.anidialogID, 'CENTER') + +::method initDialog + expose f1 f2 f3 f4 f5 p1 p2 p3 p4 p5 v. + + self~disableControl(1) /* disable stop button */ + do i = 1 to 5 + ret = self~installBitmapButton(v.idp + i, '', v.bmpphil ,,,,"STRETCH INMEMORY") + ret = self~installBitmapButton(v.idf + i, '', v.bmpfork ,,,,"STRETCH INMEMORY") + ret = self~installBitmapButton(v.idhl + 10*i, '', v.bmpblank,,,,"STRETCH INMEMORY") + ret = self~installBitmapButton(v.idhr + 10*i, '', v.bmpblank,,,,"STRETCH INMEMORY") + ret = self~installBitmapButton(v.idpc + i, '', v.bmpblank,,,,"STRETCH INMEMORY") + end + ret = self~installBitmapButton(v.idcake, '', v.bmpblank,,,,"STRETCH INMEMORY") + + f1 = .fork~new(1, self) /* create 5 forks */ + f2 = .fork~new(2, self) + f3 = .fork~new(3, self) + f4 = .fork~new(4, self) + f5 = .fork~new(5, self) + + p1 = .phil~new(1,f5,f1, self) /* create 5 philos. */ + p2 = .phil~new(2,f1,f2, self) + p3 = .phil~new(3,f2,f3, self) + p4 = .phil~new(4,f3,f4, self) + p5 = .phil~new(5,f4,f5, self) + +::method myExecute unguarded /* animate dialog */ + expose f1 f2 f3 f4 f5 p1 p2 p3 p4 p5 + use arg parms. + reply + T.sleep = parms.101 + T.eat = parms.102 + T.veat = trunc(T.eat / 2) + T.vsleep = trunc(T.sleep / 2) + if parms.104 = 1 then T.side = 100 /* left fork first */ + else if parms.105 = 1 then T.side = 0 /* right */ + else T.side = 50 /* random */ + T.repeats = parms.103 + + self~cake('init') /* set up the cake */ + + m1 = p1~start("run",T.) /* run 5 philsophers */ + m2 = p2~start("run",T.) + m3 = p3~start("run",T.) + m4 = p4~start("run",T.) + m5 = p5~start("run",T.) + self~enableControl(1) /* enable stop button */ + + -- wait untill the 5 philsopers are done, or the stop button is pushed. + do while(m1~completed+m2~completed+m3~completed+m4~completed+m5~completed <5) & \self~stopped + j = SysSleep(.340) + end + m1~result /* check 5 phils */ + m2~result + m3~result + m4~result + m5~result + self~ok:super /* finish dialog */ + +::method ok unguarded /* Stop button */ + expose f1 f2 f3 f4 f5 p1 p2 p3 p4 p5 v. + self~disableControl(1) + self~stopped = .true + call play v.stop,'yes' + f1~layDown /* take away forks */ + f2~layDown + f3~layDown + f4~layDown + f5~layDown + +::method cancel unguarded + self~ok /* stop ourself */ + +::method setPhil unguarded /* philosoph bitmap */ + expose v. + use arg num, bmp + self~changeBitmapButton(v.idp + num, value('v.bmp'bmp),,,,'STRETCH INMEMORY') + +::method setFork unguarded /* fork bitmap */ + expose v. + use arg num, bmp + self~changeBitmapButton(v.idf + num, value('v.bmp'bmp),,,,'STRETCH INMEMORY') + +::method setLeft unguarded /* left hand bitmap */ + expose v. + use arg num, bmp + self~changeBitmapButton(v.idhl + num*10, value('v.bmp'bmp),,,,'STRETCH INMEMORY') + +::method setRight unguarded /* righthand bitmap */ + expose v. + use arg num, bmp + self~changeBitmapButton(v.idhr + num*10, value('v.bmp'bmp),,,,'STRETCH INMEMORY') + +::method setPiece unguarded /* cakepiece bitmap */ + expose v. + use arg num, bmp + self~changeBitmapButton(v.idpc + num, value('v.bmp'bmp),,,,'STRETCH INMEMORY') + +::method cake unguarded /* cake bitmap */ + expose curCake v. + if arg() = 1 then do + curCake = -1 + self~audio('cakewhere') + call SysSleep(2) + end + curCake = (curCake+1)//11 + i = curCake + 1 + self~changeBitmapButton(v.idcake, value('v.bmpcake'i),,,,'STRETCH INMEMORY') + if curCake=10 then self~audio('cakenew') + +::method audio unguarded /* play a sound */ + expose v. + use arg act + ret = play(value('v.'act), 'yes') + + +/*---------------------- philosopher ---------------------------------*/ + +::class phil /*** philosophers ***/ + +::method init /* initialize */ + expose num rFork lFork dlg + use arg num, rFork, lFork, dlg + +::method run /* run the philosop.*/ + expose num rFork lFork dlg + use arg T. + x = random(1,100,time('S')*num) + do i=1 to T.repeats until dlg~stopped /* - run the loop */ + stime = random(T.sleep-T.vsleep,T.sleep+T.vsleep) + if dlg~stopped then leave /* - stop clicked */ + self~sleep(stime) /* - call sleep */ + if dlg~stopped then leave /* - stop clicked */ + self~wait /* - call wait */ + if random(1,100) < T.side then do /* - pick up forks */ + self~pickLeft(T.eat>20) /* - - left first */ + self~pickRight(T.eat>20) + end + else do /* - - right first */ + self~pickRight(T.eat>20) + self~pickLeft(T.eat>20) + end + etime = random(T.eat-T.veat,T.eat+T.veat) + if dlg~stopped then leave /* - stop clicked */ + self~eat(etime) /* - call eat */ + self~layDownLeft /* - free forks */ + self~layDownRight + end + self~done + return 1 + +::method sleep /* philosoph sleeps */ + expose num dlg + use arg ds + dlg~setPhil(num, 'sleep') + if num=1 & ds>=20 then dlg~audio('sleep') + if ds > 0 then call msSleep ds*100 + +::method eat /* philosoph eats */ + expose num dlg + use arg ds + dlg~setPhil(num, 'eat') + dlg~cake /* - cake smaller */ + dlg~setPiece(num, 'piece') /* - he gets piece */ + if ds > 0 then do + if num=1 & ds>=20 then dlg~audio('eat') + do i = 1 to ds/5 while \dlg~stopped /* - eat, check stop */ + call msSleep 300 + if random(1,50)=11 then + dlg~~audio('ouch')~setPhil(num, 'ouch') + else dlg~setPhil(num, 'eat2') + call msSleep 200 + dlg~setPhil(num, 'eat') + end + if \dlg~stopped then call msSleep ds//10 * 100 + end + dlg~setPiece(num, 'blank') + +::method wait /* philosoph waits */ + expose num dlg + dlg~setPhil(num, 'wait') + +::method pickLeft /* pick left fork */ + expose num dlg lFork + use arg sound + dlg~setLeft(num, 'handl') + lFork~pickUp(num=1 & sound) + dlg~setLeft(num, 'handlf') + +::method pickRight /* pick right fork */ + expose num dlg rFork + use arg sound + dlg~setRight(num, 'handr') + rFork~pickUp(num=1 & sound) + dlg~setRight(num, 'handrf') + +::method layDownLeft /* down left fork */ + expose num dlg lFork + dlg~setLeft(num, 'blank') + lFork~layDown + +::method layDownRight /* down right fork */ + expose num dlg rFork + dlg~setRight(num, 'blank') + rFork~layDown + +::method done /* philosopher done */ + expose num dlg + dlg~setPhil(num, 'blank') + + +/*---------------------- fork ----------------------------------------*/ + +::class fork /*** forks **********/ + +::method init /* initialize */ + expose used num dlg + use arg num, dlg + used = 0 /* - forks are free */ + +::method pickUp /* pickUp the fork */ + expose used num dlg + use arg sound + if used & sound then dlg~audio('wait') + guard on when used = 0 /* - wait until free*/ + used = 1 /* - set occupied */ + dlg~setFork(num, 'blank') + +::method layDown unguarded /* layDown the fork */ + expose used num dlg + dlg~setFork(num, 'fork') + used = 0 /* - set to free */ diff --git a/modules/windows/oodialog/oovideo.rex b/modules/windows/oodialog/oovideo.rex new file mode 100755 index 0000000..60afb91 --- /dev/null +++ b/modules/windows/oodialog/oovideo.rex @@ -0,0 +1,168 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: oovideo.rex */ +/* Type: ooRexx Script */ +/* */ +/* Description: Video archive */ +/* */ +/* + * Note: this program uses the public routine, locate(), to get the full path + * name to the directory this source code file is located. In places, the + * variable holding this value has been callously abbreviated to 'sd' which + * stands for source directory. + * + ****************************************************************************/ + + srcDir = locate() + + -- Use the global .constDir for symbolic IDs + .application~useGlobalConstDir('O', srcDir'rc\ldvideo.h') + + logfile = srcDir'oovideo.log' + a.IDC_EDIT_TAPE_NO = "10000" + a.IDC_EDIT_TAPE_LABEL = "Actionfilms 1" + a.IDC_EDIT_FILM1 = "Gone with the Wind" + a.IDC_EDIT_FILM2 = "True Lies" + a.IDC_EDIT_FILM3 = "Rambo 4" + a.IDC_EDIT_FILM4 = "" + a.IDC_CB_LOCATION = "Unknown" + a.IDC_LB_LENT_TO = "Maria Shell" + do i = .constDir[IDC_CK_LONGPLAY] to .constDir[IDC_RB_C240] + a.i = 0 + end + a.IDC_RB_C180 = 1 + a.IDC_CK_HIFI = 1 + + dlg = .MyDialog~new(srcDir"rc\ldvideo.rc", IDD_VIDEO_DLG, A., , "CONNECTBUTTONS") + + if dlg~initcode > 0 then do + call errorDialog "Couldn't load the Video dialog" + return 99 + end + else if dlg~execute("SHOWTOP") = .MyDialog~IDOK then do + o=.stream~new(logfile) + o~open('write replace') + o~lineout("OOVideo - Data:") + o~lineout("Nr :" a.IDC_EDIT_TAPE_NO) + o~lineout("Titel :" a.IDC_EDIT_TAPE_LABEL) + o~lineout("Film 1 :" a.IDC_EDIT_FILM1) + o~lineout("Film 2 :" a.IDC_EDIT_FILM2) + o~lineout("Film 3 :" a.IDC_EDIT_FILM3) + o~lineout("Film 4 :" a.IDC_EDIT_FILM4) + o~lineout("Lent to :" a.IDC_LB_LENT_TO) + o~lineout("Location:" a.IDC_CB_LOCATION) + o~lineout("Longplay:" a.IDC_CK_LONGPLAY) + o~lineout("Hifi :" a.IDC_CK_HIFI) + o~lineout("Protect :" a.IDC_CK_WRITEPROTECT) + if (a.IDC_RB_C120 = 1) then o~lineout("Tape : C120") + if (a.IDC_RB_C180 = 1) then o~lineout("Tape : C180") + if (a.IDC_RB_C240 = 1) then o~lineout("Tape : C240") + o~close() + 'type "'logfile'"' + end + + return + +/*--------------------------------- requires -------------------------*/ + +::requires "ooDialog.cls" +::requires "samplesSetup.rex" + +/*--------------------------------- dialog class --------------------*/ + +::class 'MyDialog' subclass RcDialog + +::method initDialog + expose sd + + sd = locate() + + cb = self~newComboBox(IDC_CB_LOCATION) + cb~add("Drawer 1") + cb~add("Drawer 2") + cb~add("Behind the door") + cb~add("Under the bed") + cb~add("On the floor") + cb~add("Unknown") + + lb = self~newListBox(IDC_LB_LENT_TO) + lb~add("Hans-Maria Baier") + lb~add("John Smith") + lb~add("Peter Fonda") + lb~add("Maria Shell") + lb~add("Mike Miller") + + return 0 + +::method validate + expose sd + tst = self~newEdit(IDC_EDIT_TAPE_NO)~getText + if tst <> "" then do + call Play sd"wav\take.wav" + return .true + end + else do + msg = "The tape number can not be blank. Use cancel to quit, if needed." + title = 'Video Archive Database Warning' + ret = MessageDialog(msg, self~hwnd, title, 'OK', 'WARNING') + end + + return .false + +::method cancel unguarded + expose sd + + ret = Play(sd"wav\cancel.wav", yes) + + msg = "Do you really want to cancel? " + title = 'Exiting Video Database Application' + + ret = MessageDialog(msg, self~hwnd, title, 'YESNO', 'QUESTION') + + if ret == self~IDYES then return self~cancel:super + else return 0 + +::method search unguarded + + msg = "Entry not found in Video Archive database." + title = 'Video Archive Database Warning' + ret = MessageDialog(msg, self~hwnd, title, 'OK', 'WARNING') + + return 0 + diff --git a/modules/windows/oodialog/oowalk2.rex b/modules/windows/oodialog/oowalk2.rex new file mode 100755 index 0000000..944b73f --- /dev/null +++ b/modules/windows/oodialog/oowalk2.rex @@ -0,0 +1,293 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * oowalk2.rex Animation demonstration (using a compiled binary resource + * for the dialog template. A DLL file.) + * + * The only real difference between this sample and the oowalker.rex sample is + * the way the bitmaps for the animation are loaded. Look at the initDialog() + * method of the .WalkerDialog to see this difference. + * + * An animated button is used to simulate a man walking across the dialog. The + * user can adjust the pace of the waling by setting the amount the man is + * moved each time the button is redrawn and the delay between redrawing the + * button. The button is drawn using a sequence of bitmaps that show the man + * with different leg and arm positions. The user can also set how the man + * 'walking' off the edge of the dialog is handled, smoothly or bouncy, by + * using the "smooth corner wrap" check box. + * + * A 'got cha' point (!!!) is periodically drawn and if the man is close enough + * to this 'danger,' the man is 'gotten' and the animation is stopped. Each + * time the button is drawn, the !!! is over-drawn, so the !!! is only seen + * as a flicker. + * + * Normally the dialog ends when the walker is gotten. However there is a + * check box that allows the user to cancel this behavior and then restart the + * animation. + */ + + srcDir = locate() + .application~setDefaults('O', srcDir'rc\walker.h', .false) + + dlg = .WalkerDialog~new(srcDir'res\oowalk2.dll', IDD_WALKER) + + if dlg~initCode \= 0 then do + mgr~goBack + return 99 + end + dlg~execute("SHOWTOP") + + return + +/*---------------------------- requires -----------------------------*/ + +::requires "ooDialog.cls" +::requires "samplesSetup.rex" + +/*---------------------------- walker dialog ------------------------*/ + +::class 'WalkerDialog' subclass ResDialog + +::method initDialog + expose bitmaps spriteButton quitCheckBox restartButton okButton + + -- Make button IDC_DRAW_BUTTON a bitmap button. Bitmap buttons are owner- + -- drawn and ooDialog will manage the 'drawing' of the button by painting a + -- series of bitmaps on the button, using the AnimatedButton class. + self~installBitmapButton(IDC_DRAW_BUTTON, '', 0); + + -- The bitmaps are loaded from the resource DLL by specifying their resouce + -- IDs in the DLL file, res\oowalk2.dll. + -- + -- We use symbolic IDs for the bitmaps, and we assigned the IDs in order. + -- In the new() method, the 2nd arg is the first bitmap ID and the 3rd is the + -- last bitmap ID and they are assumed to be in order. The AnimatedButton + -- class was never updated to accept symbolic IDs, so we need to convert the + -- IDs to numeric IDs + bmpFirst = .constDir[ID_BMP_FIG1] + bmpLast = .constDir[ID_BMP_FIG8] + spriteButton = .WalkButton~new(IDC_DRAW_BUTTON, bmpFirst, bmpLast, 10, 2, 70, 120, 60, 10, 10, self) + + -- Use 'bouncy' operation when hitting edges. + spriteButton~setSmooth(.false) + + -- Size of the step through the bitmap IDs. + spriteButton~setstep(1) + + -- Get things set up. + self~connectButtonEvent(IDC_PB_RESTART, "CLICKED", onRestart) + + quitCheckBox = self~newCheckBox(IDC_CB_GOTCHA) + restartButton = self~newPushButton(IDC_PB_RESTART) + okButton = self~newPushButton(IDOK) + + quitCheckBox~check + spriteButton~fillData(data.) + spriteButton~suspendGotCha(.false) + self~doValueStemSet(data.) + ret = Play(srcDir"tada.wav", n) -- TODO not playing in Win7 + + -- Animate the button. + spriteButton~run + +::method doValueStemGet unguarded + use strict arg data. + data.IDC_EDIT_MOVEX = self~newEdit(IDC_EDIT_MOVEX)~getText + data.IDC_EDIT_MOVEY = self~newEdit(IDC_EDIT_MOVEY)~getText + data.IDC_EDIT_DELAY = self~newEdit(IDC_EDIT_DELAY)~getText + if self~newCheckBox(IDC_CB_SMOOTH)~checked then data.IDC_CB_SMOOTH = 1 + else data.IDC_CB_SMOOTH = 0 + +::method doValueStemSet unguarded + use strict arg data. + self~newEdit(IDC_EDIT_MOVEX)~setText(data.IDC_EDIT_MOVEX) + self~newEdit(IDC_EDIT_MOVEY)~setText(data.IDC_EDIT_MOVEY) + self~newEdit(IDC_EDIT_DELAY)~setText(data.IDC_EDIT_DELAY) + if data.IDC_CB_SMOOTH == 1 then self~newCheckBox(IDC_CB_SMOOTH)~check + else self~newCheckBox(IDC_CB_SMOOTH)~uncheck + +::method onGotCha + expose okButton + use strict arg animatedButton, x, y + okButton~disable + self~writetoButton(IDC_DRAW_BUTTON, x, y, "Got-cha", "Arial", 28, "BOLD") + ret = play('gotcha.wav') + animatedButton~stop + call msSleep 1000 + +::method maybeQuit + expose quitCheckBox restartButton okButton + if quitCheckBox~checked then return self~ok + + restartButton~enable + okButton~enable + +::method onRestart + expose spriteButton restartButton + restartButton~disable + spriteButton~stopped = .false + + -- Suspend the 'GotCha' before we start the animated button. Otherwise the + -- walker will be 'gotten' as soon as he starts. + spriteButton~suspendGotCha(.true) + spriteButton~run + + -- Give the walker time to 'walk' out of the danger zone before reactivating + -- the 'GotCha.' + delay = self~newEdit(IDC_EDIT_DELAY)~getText + j = msSleep(2 * delay) + spriteButton~suspendGotCha(.false) + +::method ok unguarded + self~stopAnimation + return self~ok:super + +::method cancel unguarded + self~stopAnimation + return self~cancel:super + +::method stopAnimation private + expose bitmaps spriteButton + spriteButton~stop + + -- Wait until the animation sequence is finished. + do while spriteButton~isRunning + j = msSleep(30) + end + + +/*------------------------------ animated button --------------------*/ + +::class 'WalkButton' subclass AnimatedButton + +::method run unguarded + expose xDanger yDanger running + xDanger = 300; yDanger = 70; running = .true + + reply 0 + + do until self~stopped | self~parentStopped + self~doAnimatedSequence + end + + -- Have the walker do one more sequence, gives the appearance of walking 'in + -- place.' + self~doAnimatedSequence + + -- We are no longer running, tell the parent dialog to maybe quit. + running = .false + self~parentDlg~maybeQuit + +::method doAnimatedSequence private unguarded + expose xDanger yDanger + + self~parentDlg~doValueStemGet(data.) + do k over data. + if \ data.k~datatype('N') then data.k = 0 + end + self~moveseq + self~setmove(data.IDC_EDIT_MOVEX, data.IDC_EDIT_MOVEY) + self~setdelay(data.IDC_EDIT_DELAY) + self~setsmooth(data.IDC_CB_SMOOTH) + if \ self~stopped then + self~parentDlg~writetoButton(IDC_DRAW_BUTTON,xDanger,yDanger,"!!!","Arial",20,"BOLD") + +::method isRunning unguarded + expose running + return running + +::method suspendGotCha unguarded + expose gotCha + use strict arg suspend + if suspend then gotCha = .false + else gotCha = .true + +::method hitright + ret = play('ding.wav', 'YES') + return 1 + +::method hitleft + ret = play('ding.wav', 'YESY') + return 1 + +::method hitbottom + self~getsprite(s.) + ret = play('chord.wav', 'YES') + s.movey = -s.movey + self~setsprite(s.) + self~fillData(data.) + self~parentDlg~doValueStemSet(data.) + return 0 + +::method hittop + expose sprite. + self~getsprite(s.) + ret = play('chimes.wav', 'YES') + s.movey = -s.movey + self~setsprite(s.) + self~fillData(data.) + self~parentDlg~doValueStemSet(data.) + return 0 + +::method fillData + expose quitCheckBox + use arg data. + if \ quitCheckBox~isA(.CheckBox) then quitCheckBox = self~parentDlg~newCheckBox(IDC_CB_GOTCHA) + self~getSprite(msprite.) + data.IDC_EDIT_MOVEX = msprite.movex + data.IDC_EDIT_MOVEY = msprite.movey + data.IDC_EDIT_DELAY = msprite.delay + data.IDC_CB_SMOOTH = msprite.smooth + + if quitCheckBox~checked then data.IDC_CB_GOTCHA = 1 + else data.IDC_CB_GOTCHA = 0 + +::method movepos + use arg px, py + if \ self~stopped then do + self~movepos:super(px,py) + self~checkDanger + end + +::method checkDanger + expose xDanger yDanger gotCha + self~getpos(cur.) + if abs(cur.x+10-xDanger) <= 10 & abs(cur.y+55-yDanger) <= 30 then do + if gotCha then self~parentDlg~onGotCha(self, xDanger-50, yDanger) + end diff --git a/modules/windows/oodialog/oowalker.rex b/modules/windows/oodialog/oowalker.rex new file mode 100755 index 0000000..cf0101c --- /dev/null +++ b/modules/windows/oodialog/oowalker.rex @@ -0,0 +1,285 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * oowalker.rex Animation demonstration (using a .rc file for the dialog + * template.) + * + * The only real difference between this sample and the oowalk2.rex sample is + * the way the bitmaps for the animation are loaded. Look at the initDialog() + * method of the .WalkerDialog to see this difference. + * + * An animated button is used to simulate a man walking across the dialog. The + * user can adjust the pace of the waling by setting the amount the man is + * moved each time the button is redrawn and the delay between redrawing the + * button. The button is drawn using a sequence of bitmaps that show the man + * with different leg and arm positions. The user can also set how the man + * 'walking' off the edge of the dialog is handled, smoothly or bouncy, by + * using the "smooth corner wrap" check box. + * + * A 'got cha' point (!!!) is periodically drawn and if the man is close enough + * to this 'danger,' the man is 'gotten' and the animation is stopped. Each + * time the button is drawn, the !!! is over-drawn, so the !!! is only seen + * as a flicker. + * + * Normally the dialog ends when the walker is gotten. However there is a + * check box that allows the user to cancel this behavior and then restart the + * animation. + */ + + srcDir = locate() + + .application~useGlobalConstDir('O', srcDir"rc\walker.h") + dlg = .WalkerDialog~new(srcDir"rc\walker.rc", , data.) + + if dlg~initCode \= 0 then do + return 99 + end + dlg~execute("SHOWTOP") + + return 0 + +/*---------------------------- requires -----------------------------*/ + +::requires "ooDialog.cls" +::requires "samplesSetup.rex" -- For sound path + +/*---------------------------- walker dialog ------------------------*/ + +::class 'WalkerDialog' subclass RcDialog + +::method initDialog + expose bitmaps spriteButton quitCheckBox restartButton okButton + + -- Make button 105 a bitmap button. Bitmap buttons are owner-drawn and + -- ooDialog will manage the 'drawing' of the button by painting a series of + -- bitmaps on the button, using the AnimatedButton class. + self~installBitmapButton(105, '', 0); + + -- Load the bitmaps from the bitmap files into an array. + bitmaps = .array~new(8) + do i= 1 to 8 + bitmaps[i] = self~loadBitmap(.application~srcDir"bmp\wlkfig"i".bmp") + end + + -- Create the animated button class and pass the array of bitmaps. + spriteButton = .WalkButton~new(105, bitmaps, 0, 10, 2, 70, 120, 60, 10, 10, self) + + -- Use 'bouncy' operation when hitting edges. + spriteButton~setSmooth(.false) + + -- Get things set up. + self~connectButtonEvent(107, "CLICKED", onRestart) + quitCheckBox = self~newCheckBox(106) + restartButton = self~newPushButton(107) + okButton = self~newPushButton(IDOK) + quitCheckBox~check + spriteButton~fillData(data.) + spriteButton~suspendGotCha(.false) + self~setDataStem(data.) + ret = Play("tada.wav", n) + + -- Animate the button. + spriteButton~run + +::method doDataStemGet unguarded + use strict arg data. + self~getDataStem(data.) + +::method doDataStemSet unguarded + use strict arg data. + self~setDataStem(data.) + +::method onGotCha + expose okButton + use strict arg animatedButton, x, y + okButton~disable + self~writetoButton(105, x, y, "Got-cha", "Arial", 28, "BOLD") + ret = play('gotcha.wav') + animatedButton~stop + call msSleep 1000 + +::method maybeQuit + expose quitCheckBox restartButton okButton + if quitCheckBox~checked then return self~ok + + restartButton~enable + okButton~enable + +::method onRestart + expose spriteButton restartButton + restartButton~disable + spriteButton~stopped = .false + + -- Suspend the 'GotCha' before we start the animated button. Otherwise the + -- walker will be 'gotten' as soon as he starts. + spriteButton~suspendGotCha(.true) + spriteButton~run + + -- Give the walker time to 'walk' out of the danger zone before reactivating + -- the 'GotCha.' + delay = self~newEdit(103)~getText + j = msSleep(2 * delay) + spriteButton~suspendGotCha(.false) + +::method ok + self~stopAnimation + return self~ok:super + +::method cancel + self~stopAnimation + return self~cancel:super + +::method stopAnimation private + expose bitmaps spriteButton + spriteButton~stop + + -- Wait until the animation sequence is finished. + do while spriteButton~isRunning + j = msSleep(30) + end + + -- Now it is safe to delete the bitmaps. + if bitmaps \== .nil then do i= 1 to 8 + self~removeBitmap(bitmaps[i]) + end + + -- Be sure we don't free the bitmaps twice. The WalkButton will invoke + -- maybeQuit() which can cause stopAnimation() to be invoked twice. + bitmaps = .nil + + +/*------------------------------ animated button --------------------*/ + +::class 'WalkButton' subclass AnimatedButton + +::method run + expose xDanger yDanger running + xDanger = 300; yDanger = 70; running = .true + + reply 0 + + do until(self~stopped = 1) | (self~parentStopped = 1) + self~doAnimatedSequence + end + + -- Have the walker do one more sequence, gives the appearance of walking 'in + -- in place.' + self~doAnimatedSequence + + -- We are no longer running, tell the parent dialog to maybe quit. + running = .false + self~parentDlg~maybeQuit + +::method doAnimatedSequence private + expose xDanger yDanger + + self~moveseq + self~parentDlg~doDataStemGet(data.) + do k over data. + if data.k~datatype('N') = 0 then data.k = 0 + end + self~setmove(data.101, data.102) + self~setdelay(data.103) + self~setsmooth(data.104) + if self~stopped = 0 then + self~parentDlg~writetoButton(105,xDanger,yDanger,"!!!","Arial",20,"BOLD") + +::method isRunning unguarded + expose running + return running + +::method suspendGotCha unguarded + expose gotCha + use strict arg suspend + if suspend then gotCha = .false + else gotCha = .true + +::method hitright + ret = play('ding.wav', 'YES') + return 1 + +::method hitleft + ret = play('ding.wav', 'YESY') + return 1 + +::method hitbottom + self~getsprite(s.) + ret = play('chord.wav', 'YES') + s.movey = -s.movey + self~setsprite(s.) + self~fillData(data.) + self~parentDlg~doDataStemSet(data.) + return 0 + +::method hittop + expose sprite. + self~getsprite(s.) + ret = play('chimes.wav', 'YES') + s.movey = -s.movey + self~setsprite(s.) + self~fillData(data.) + self~parentDlg~doDataStemSet(data.) + return 0 + +::method fillData + expose quitCheckBox + use arg data. + if \ quitCheckBox~isA(.CheckBox) then quitCheckBox = self~parentDlg~newCheckBox(106) + self~getSprite(msprite.) + data.101 = msprite.movex + data.102 = msprite.movey + data.103 = msprite.delay + data.104 = msprite.smooth + + if quitCheckBox~checked then data.106 = 1 + else data.106 = 0 + +::method movepos + use arg px, py + if self~stopped=0 then do + self~movepos:super(px,py) + self~checkDanger + end + +::method checkDanger + expose xDanger yDanger gotCha + self~getpos(cur.) + if abs(cur.x+10-xDanger) <= 10 & abs(cur.y+55-yDanger) <= 30 then do + if gotCha then self~parentDlg~onGotCha(self, xDanger-50, yDanger) + end diff --git a/modules/windows/oodialog/propertysheet.tabControls/PropertySheetDemo.rex b/modules/windows/oodialog/propertysheet.tabControls/PropertySheetDemo.rex new file mode 100755 index 0000000..7c7f5fd --- /dev/null +++ b/modules/windows/oodialog/propertysheet.tabControls/PropertySheetDemo.rex @@ -0,0 +1,633 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** Propery Sheet / Dialog Controls Example + * + * This example demonstrates how to use the PropertySheetDialog and has examples + * of using 5 dialog controls, the: List View, Tree View, Progress Bar, Track + * Bar, and Tab. + * + * Note: this program uses the public routine, locate(), to get the full path + * name to the directory this source code file is located. In places, the + * variable holding this value has been callously abbreviated to 'sd' which + * stands for source directory. + * + */ + + sd = locate() + .application~setDefaults("O", sd"rc\PropertySheetDemo.h", .false) + + -- Create the 5 dialog pages. + p1 = .ListViewDlg~new(sd"rc\PropertySheetDemo.rc", IDD_LISTVIEW_DLG) + p2 = .TreeViewDlg~new(sd"rc\PropertySheetDemo.rc", IDD_TREEVIEW_DLG) + p3 = .ProgressBarDlg~new(sd"rc\PropertySheetDemo.rc", IDD_PROGRESSBAR_DLG) + p4 = .TrackBarDlg~new(sd"rc\PropertySheetDemo.rc", IDD_TRACKBAR_DLG) + p5 = .TabDlg~new(sd"rc\PropertySheetDemo.rc", IDD_TAB_DLG) + + -- Create the PropertySheetDialog using an array of the 5 dialog pages. The + -- order of the pages in the array will be the order of the pages in the tab + -- control of the property sheet. + pages = .array~of(p1, p2, p3, p4, p5) + propDlg = .PropertySheetDemoDlg~new(pages, "NOAPPLYNOW", "ooRexx Property Sheet with Controls") + + -- Do any customization of the property sheet dialog by setting the values of + -- the appropriate attributes. However, for this example we do not do any + -- customization. + + -- Show the property sheet. + propDlg~execute + + return 0 + +::requires "ooDialog.cls" + +::class 'ListViewDlg' subclass RcPSPDialog + +::method initDialog + expose lv + + sd = locate() + + -- Instantiate a Rexx list view object that represents the underlying + -- Windows list-view. The list-view style is report. + lv = self~newListView(IDC_LV_MAIN) + + -- Set the column headers + lv~insertColumn(0, "Symbol", 40) + lv~insertColumn(1, "Quote", 50) + lv~insertColumn(2, "Year high", 50) + lv~insertColumn(3, "Year low", 50) + lv~insertColumn(4, "Description", 120) + + -- Set the images for the items in the list-view. The list-view control was + -- created without the SHAREIMAGES styles, so it takes care of releasing the + -- image list when the program ends. + image = .Image~getImage(sd"rc\propertySheetDemoListView.bmp") + imageList = .ImageList~create(.Size~new(16, 16), COLOR8, 4, 0) + if \image~isNull, \imageList~isNull then do + imageList~add(image) + lv~setImageList(imageList, SMALL) + + -- The image list makes a copy of the bitmap, so we can release it now + -- to free up some (small) amount of system resources. This is not + -- necessary, the OS will release the resource automatically when the + -- program ends. + image~release + end + + -- Fill the list-view with random data. + do ch = "A"~c2d to "Z"~c2d + q = random(200) + yh = random(400) + yh = max(yh, q) + yl = random(100) + yl = min(yl, q) + lv~addRow( , random(3), "_" || ch~d2c~copies(3) || "_", "$" || q, "$" || yh, "$" || yl, - + ch~d2c~copies(3) "is a fictitious company.") + end + + -- Add full row select and the ability to drag and drop the columns to the + -- list-view. + lv~addExtendedStyle("FULLROWSELECT HEADERDRAGDROP") + + -- Connect 2 list-view events to Rexx methods in this dialog. The double- + -- click on a list-view item, and the click on a column header events. + self~connectListViewEvent(IDC_LV_MAIN, "ACTIVATE", "onActivate") + self~connectListViewEvent(IDC_LV_MAIN, "COLUMNCLICK") + +-- Invoked when a list-view item is double-clicked. We display a message and +-- set the focus to the next item in the list. +::method onActivate + expose lv + + selectedItem = lv~focused + symbol = lv~itemText(selectedItem) + price = lv~itemText(selectedItem, 1) + + question = "You have selected the stock with symbol" symbol". Do you want to order" || .endOfLine || - + "50 shares of stock at" price"?" + placeOrder = MessageDialog(question, self~hwnd, "Place Order for Stock", "YESNO", "QUESTION", "DEFBUTTON2" ) + + cost = 50 * price~substr(2) + if placeOrder == self~constDir["IDYES"] then do + j = MessageDialog("Okay, your bank account will be debited $"cost "dollars.", self~hwnd, - + "Order Confirmation", "OK", "INFORMATION") + end + else do + j = MessageDialog("That saved you $"cost "dollars.", self~hwnd, "Order Canceled", "OK", "EXCLAMATION") + end + + lv~deselect(selectedItem) + selectedItem += 1 + lv~focus(selectedItem) + lv~select(selectedItem) + +-- Invoked when a column header of the list-view is clicked. We just show a +-- message box so that the user has some feedback. +::method OnColumnClick + use arg id, column + j = MessageDialog("Column" column + 1 "was clicked in control" id, self~hwnd, "List-View Notification") + + +::class 'TreeViewDlg' subclass RcPSPDialog + +::method initDialog + + -- Instantiate a Rexx tree view object that represents the Windows tree-view + -- control. + tv = self~newTreeView(IDC_TV_MAIN) + + -- Create and set the ImageList for the tree view items + sd = locate() + image = .Image~getImage(sd"rc\propertySheetDemoTreeView.bmp") + imageList = .ImageList~create(.Size~new(32, 32), COLOR8, 10, 0) + if \image~isNull, \imageList~isNull then do + imageList~add(image) + tv~setImageList(imageList, NORMAL) + image~release + end + + -- Add the tree view items. Toys will be the root (the first argument is + -- not omitted. Subitems are added by omitting the first arguments. The + -- number of arguments omitted indicates the depth of the subitem. + -- + -- The last numeric argument in some of the items is the index for the icon + -- for that item in the image list. Those items without a number will not + -- display an icon. + + tv~add("Toys", 1) + tv~add(, "Indoor", 14) + tv~add(, , "Boys", 19) + tv~add(, , , "Cowboys", 13) + tv~add(, , , "Cars", 8) + tv~add(, , , "Starwars", 9) + tv~add(, , "Girls", 0) + tv~add(, , , "Barby", 19) + tv~add(, , , "Painting", 15) + tv~add(, , , "Cooking", 13) + tv~add(, , "Adults", 17) + tv~add(, , , "Poker", 15) + tv~add(, , "Technical", 16) + tv~add(, , , "Racing cars", 8) + tv~add(, , , "Trains", 7) + tv~add(, "Outdoor", 11) + tv~add(, , "Water", 22) + tv~add(, , , "Ball", 5) + tv~add(, , , "Soft tennis", 6) + tv~add(, , "Sand", 12) + tv~add(, , , "Shovel", 12) + tv~add(, , , "Bucket", 19) + tv~add(, , , "Sandbox", 12) + tv~add(, , "Technical", 16) + tv~add(, , , "Trains", 7) + tv~add(, , , "Remote controlled", 8) + tv~add("Office Articles", 2) + tv~add( , "Tools", 16) + tv~add( , "Books", 19) + tv~add( , , "Introduction", 14) + tv~add( , , "Advanced Programming", 17) + tv~add( , , "Tips & Tricks", 16) + tv~add("Hardware", 4) + tv~add( , "Garden", 0) + tv~add( , "Handyman", 18) + tv~add( , "Household", 18) + tv~add("Furniture", 3) + tv~add( , "Standard", 12) + tv~add( , "Luxury", 21) + + -- Connecting the begin drag event and using the default tree drag handler + -- allows us to suppport drag and drop (using the default behaviour. + self~connectTreeViewEvent(IDC_TV_MAIN, "BeginDrag", "DefTreeDragHandler") + + +::class 'ProgressBarDlg' subclass RcPSPDialog + +::method initDialog + expose threadsStarted processes + + threadsStarted = 0 + processes = .array~of('animateProgressA', 'animateProgressB', 'animateProgressC', - + 'animateProgressD', 'animateProgressE') + + +-- The setActive event notification is sent by the property sheet to the page +-- that is about to become the active page. It is sent before the page is +-- visible. This allows the page to do any initialization necessary. For this +-- program, we use the notification to start the progress bar animation threads. +::method setActive unguarded + expose threadsStarted processes + use arg propSheet + + reply 0 + + -- If no threads are running, start a thread to run each progress bar + -- asynchronously. + if threadsStarted < 1 then do + threadsStarted = processes~items + do methodName over processes + self~start(methodName) + end + end + +-- This is the generic method that simulates some type of processing that takes +-- a long time. The progress of this processing is displayed by the progress +-- bar. to simulate a process of which the progress is displayed by a progress bar */ +::method animateProgress unguarded + use arg progressBar, label, step, iterations, tsleep + + progressBar~setRange(0, iterations * step) + progressBar~setStep(step) + do i = 1 to iterations + progressBar~step + if (iterations * step == 100) then label~setText(i * step "%") + else label~setText(i * step) + + call msSleep tsleep + if \ self~isDialogActive then return + end + +-- The following 5 methods are started asynchronously to animate the progress +-- bars. +::method animateProgressA unguarded + expose threadsStarted pbA labelA + + if \ pbA~isA(.ProgressBar) then do + pbA = self~newProgressBar(IDC_PBAR_PROCESSA) + labelA = self~newStatic(IDC_ST_PERCENTA) + end + + self~animateProgress(pbA, labelA, 5, 20, 600) + threadsStarted -= 1 + +::method animateProgressB unguarded + expose threadsStarted pbB labelB + + if \ pbB~isA(.ProgressBar) then do + pbB = self~newProgressBar(IDC_PBAR_PROCESSB) + labelB = self~newStatic(IDC_ST_PERCENTB) + end + + self~animateProgress(pbB, labelB, 1, 100, 150) + threadsStarted -= 1 + +::method animateProgressC unguarded + expose threadsStarted pbC labelC + + if \ pbC~isA(.ProgressBar) then do + pbC = self~newProgressBar(IDC_PBAR_PROCESSC) + labelC = self~newStatic(IDC_ST_PERCENTC) + end + + self~animateProgress(pbC, labelC, 2, 50, 200) + threadsStarted -= 1 + +::method animateProgressD unguarded + expose threadsStarted pbD labelD + + if \ pbD~isA(.ProgressBar) then do + pbD = self~newProgressBar(IDC_PBAR_PROCESSD) + labelD = self~newStatic(IDC_ST_PERCENTD) + end + + self~animateProgress(pbD, labelD, 10, 40, 300) + threadsStarted -= 1 + +::method animateProgressE unguarded + expose threadsStarted pbE labelE + + if \ pbE~isA(.ProgressBar) then do + pbE = self~newProgressBar(IDC_PBAR_PROCESSE) + labelE = self~newStatic(IDC_ST_PERCENTE) + end + + self~animateProgress(pbE, labelE, 20, 50, 500) + threadsStarted -= 1 + + +::class 'TrackBarDlg' subclass RcPSPDialog + +::method initDialog + expose font1 trackBars tbLabels + + -- As we initialize each track bar we'll stash the Rexx object in a table + -- for easy access later, indexed by its numeric resource id. The same + -- thing is done for the static control that is the label for the track bar. + trackBars = .table~new + tbLabels = .table~new + + -- For the horizonatal track bars we'll use a big font for the label. + font1 = self~CreateFontEx("Arial", 24, "BOLD") + + -- The symbolic IDs for the track bars / labels are named after the style + -- of the track bar. Vertical or horizontal and where the ticks are placed. + + -- Initialize the horizontal track bar with ticks on the bottom. + tb = self~newTrackBar(IDC_TB_HORZ_BOTTOM) + label = self~newStatic(IDC_ST_HORZ_BOTTOM) + + tb~setTickFrequency(10) + tb~setPos(20, .true) + label~setText(20) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_BOTTOM] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the horizontal track bar with ticks on the top. + tb = self~newTrackBar(IDC_TB_HORZ_TOP) + label = self~newStatic(IDC_ST_HORZ_TOP) + + tb~initRange(0, 200) + tb~setTickFrequency(50) + tb~setPos(40, .true) + label~setText(40) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_TOP] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the horizontal track bar with ticks on the both sides. + tb = self~newTrackBar(IDC_TB_HORZ_BOTH) + label = self~newStatic(IDC_ST_HORZ_BOTH) + + tb~initSelRange(20, 60) + tb~setTickFrequency(10) + tb~setPos(80, .true) + label~setText(80) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_BOTH] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the right. + tb = self~newTrackBar(IDC_TB_VERT_RIGHT) + label = self~newStatic(IDC_ST_VERT_RIGHT) + + tb~setTickFrequency(10) + tb~setPos(30, .true) + label~setText(30) + + id = self~constDir[IDC_TB_VERT_RIGHT] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the left. + tb = self~newTrackBar(IDC_TB_VERT_LEFT) + label = self~newStatic(IDC_ST_VERT_LEFT) + + tb~setTickFrequency(10) + tb~initRange(0,400) + tb~setLineStep(5) + tb~setPageStep(50) + tb~setPos(90, .true) + label~setText(90) + + id = self~constDir[IDC_TB_VERT_LEFT] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the both sides. + tb = self~newTrackBar(IDC_TB_VERT_BOTH) + label = self~newStatic(IDC_ST_VERT_BOTH) + + tb~setTickFrequency(5) + tb~setPos(70, .true) + label~setText(70) + + id = self~constDir[IDC_TB_VERT_BOTH] + trackBars[id] = tb + tbLabels[id] = label + + -- Connect the event notification that is sent when a track bar is moved to + -- the onEndTrack() method. That method will update the text label for the + -- track bar with the new postition. + self~connectTrackBarEvent(IDC_TB_HORZ_BOTH, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_HORZ_TOP, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_HORZ_BOTTOM, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_RIGHT, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_LEFT, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_BOTH, "EndTrack", "onEndTrack") + +-- Update the static contol that shows the position for a slider when the +-- user is done moving it. +::method onEndTrack + expose trackBars tbLabels + use arg code, hwndTrackBar + + -- hwndTrackBar is the handle to the track bar that was moved. Get its + -- resource ID and use that as an index into the table of track bar objects + -- and the table of the labels. + id = self~getControlID(hwndTrackBar) + tbLabels[id]~setText(trackBars[id]~pos) + +-- We use the leaving() method to clean up (delete) the font we created. In +-- this program there is really no need to do this. As soon as the interpreter +-- terminates, the OS cleans up the resources automatically. The only time +-- cleaning up resources makes sense is in a long-running program that creates +-- and ends a lot of dialogs. Then, over time, the memory usge of the program +-- would keep growing. +::method leaving + expose font1 + self~deleteFont(font1) + + +::class 'TabDlg' subclass RcPSPDialog + +::method initDialog + expose font2 font3 imageList iconsRemoved needWrite + + -- Set the iconsRemoved and needWrite to false. These flags are used in + -- the OnDrawTabRect() method. + iconsRemoved = .false + needWrite = .false + + -- Connect the draw event of the owner-drawn button. This is sent when the + -- button needs to be drawn. Then connect the selection changed event of the + -- tab control. This is sent when the user clicks on a different tab. + self~connectDraw(IDC_PB_OWNERDRAW, "onDrawTabRect") + self~connectTabEvent(IDC_TAB_MAIN, "SELCHANGE", "onTabSelChange") + + tc = self~newTab(IDC_TAB_MAIN) + if tc == .nil then return + + -- Create a font used to display the name of the color in the owner-drawn + -- button. Create another font used to display some informative text. + font2 = self~createFontEX("Arial", 48, "BOLD ITALIC") + font3 = self~createFontEx("Arial", 16, "BOLD") + + -- Add all the tabs, including the index into the image list for an icon for + -- each tab. + tc~AddFullSeq("Red", 0, ,"Green", 1, , "Moss", 2, , "Blue", 3, , "Purple", 4, , "Cyan", 5, , "Gray", 6) + + -- Create a COLORREF (pure white) and load our bitmap. The bitmap is a + -- series of 16x16 images, each one a colored letter. + sd = locate() + cRef = .Image~colorRef(255, 255, 255) + image = .Image~getImage(sd"rc\propertySheetDemoTab.bmp") + + -- Create our image list, as a masked image list. + flags = 'COLOR24 MASK' + imageList = .ImageList~create(.Size~new(16, 16), flags, 10, 0) + if \image~isNull, \imageList~isNull then do + -- The bitmap is added and the image list deduces the number of images + -- from the width of the bitmap. For each image, the image list creates a + -- mask using the color ref. In essence, the mask is used to turn each + -- white pixel in the image to transparent. In this way, only the letter + -- part of the image shows and the rest of the image lets the under-lying + -- color show through. + imageList~addMasked(image, cRef) + tc~setImageList(imageList) + + -- The image list makes a copy of each image added to it. So, we can now + -- release the original image to free up some small amount of system + -- resoureces. + image~release + end + else do + iconsRemoved = .true + end + + -- We will position and size the owner-draw button so that it exactly covers + -- the display area of the tab control. + r = tc~windowRect + tc~calcDisplayRect(r) + s = .Size~new(r~right - r~left, r~bottom - r~top) + + pb = self~newPushButton(IDC_PB_OWNERDRAW) + + -- Map the display area's position on the screen, to the client co-ordinates + -- of this control dialog. + p = .Point~new(r~left, r~top) + self~screen2client(p) + + pb~setWindowPos(tc~hwnd, p~x, p~y, s~width, s~height, "SHOWWINDOW NOOWNERZORDER") + + + +-- When a new tab is selected, we have the owner-drawn button update itself. +-- This causes the button to redraw and the onDrawTabRect() method gets invoked, +-- which actually does the drawing. +::method onTabSelChange + button = self~newPushButton(IDC_PB_OWNERDRAW) + button~update + + +-- Fill the owner-drawn button with the color matching the tab's label and write +-- the name of the color. +::method onDrawTabRect + expose font2 font3 imageList iconsRemoved needWrite + use arg id + + button = self~newPushButton(id) + if button == .nil then return + tc = self~newTab(IDC_TAB_MAIN) + if tc == .nil then return + + -- Each time the 'Gray' tab is selected, we remove the tab icons. Then, when + -- one of the other tabs is selected we set the image list back. + currentTab = tc~selected + if currentTab == 'Gray' then do + tc~setImageList(.nil) + iconsRemoved = .true + needWrite = .true + end + else do + if iconsRemoved then do + tc~setImageList(imageList) + iconsRemoved = .false + needWrite = .true + end + end + + -- Get the button's device context, create pen and brush, and assign pen, + -- brush and font to the device context. + dc = button~getDC + pen = button~createPen(1, "SOLID", 0) + brush = button~createBrush(tc~SelectedIndex + 1) + + oldPen = button~objectToDc(dc, pen) + oldBrush = button~objectToDc(dc, brush) + oldFont = button~fontToDC(dc, font2) + button~transparentText(dc) + + -- Draw a filled in rectangle, with a border of 5 around it, and write text. + size = button~getRealSize + button~rectangle(dc, 5, 5, size~width - 5, size~height - 5, "FILL") + button~writeDirect(dc, trunc(size~width / 4), trunc(size~height / 4), tc~Selected) + + -- Add informative text if needed. + if needWrite then do + button~fontToDC(dc, font3) + x = trunc(size~width / 4) + y = trunc(size~height / 2) + + if currentTab == 'Gray' then + button~writeDirect(dc, x, y, "(Tab icons are removed)") + else + button~writeDirect(dc, x, y, "(Tab icons are restored)") + needWrite = .false + end + + -- Restore pen, brush, and font, then release the device context. + button~objectToDc(dc, oldPen) + button~objectToDc(dc, oldBrush) + button~fontToDC(dc, oldFont) + button~opaqueText(dc) + + button~deleteObject(pen) + button~deleteObject(brush) + button~freeDC(dc) + +-- We use the leaving() method to clean up (delete) the fonts and the image list +-- we created. In this program there is really no need to do this. As soon as +-- the interpreter terminates, the OS cleans up the resources automatically. +-- The only time cleaning up resources makes sense is in a long-running program +-- that creates and ends a lot of dialogs. Then, over time, the memory usge of +-- the program would keep growing. +::method leaving + expose font2 font3 imageList + + self~deleteFont(font2) + self~deleteFont(font3) + imageList~release + +::class 'PropertySheetDemoDlg' subclass PropertySheetDialog + diff --git a/modules/windows/oodialog/propertysheet.tabControls/TabDemo.rex b/modules/windows/oodialog/propertysheet.tabControls/TabDemo.rex new file mode 100755 index 0000000..dc45118 --- /dev/null +++ b/modules/windows/oodialog/propertysheet.tabControls/TabDemo.rex @@ -0,0 +1,952 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** Tab Control / Dialog Controls / ControlDialog Example + * + * This example demonstrates how to use the ControlDialog class to provide the + * pages / content of a Tab control. It is basically the same as the + * PropertySheetDemo.rex example, but uses a Tab control with ControlDialog + * objects rather than using a PropertySheetDialog. + * + * Much of the code is simply copied from the PropertySheetDemo.rex program. + */ + + -- To run correctly, this program needs to be able to find its support files. + -- But, we allow starting the program from anywhere. To do this we: + -- get the directory we are executing from using the locate() convenience + -- routine. This routine also sets the .application object's srcDir + -- attribute. We can then easily construct complete path names for any of our + -- support files. + sd = locate() + .application~setDefaults("O", sd"rc\PropertySheetDemo.h", .false) + + + -- The original version of this example would take a longish period of time to + -- appear on the screen. Too much was being done in the initDialog() method + -- of the .NewControlsDialog. To improve the time between starting the + -- program and the dialog's appearance on the screen, several steps were + -- taken. + -- + -- 1.) All dialogs were made ResDialog dialogs. + -- + -- 2.) The instantiation of the dialogs used for the pages of the tab control + -- was moved out of the initDialog() method and placed here. Some of the + -- work done in the initDialog() method was moved to the prep() method, + -- which is invoked before the dialog is started executing. + -- + -- 3.) The dialog is created with the VISIBLE style. This causes the dialog + -- to appear on the screen before the list view is populated, rather than + -- having the list view populated first and then showing the dialog. + -- + -- Instantiate all the control dialogs and pass them to the prep() method in + -- an array. + t1 = .ListViewDlg~new(sd"rc\PropertySheetDemo.dll", IDD_LISTVIEW_DLG) + t2 = .TreeViewDlg~new(sd"rc\PropertySheetDemo.dll", IDD_TREEVIEW_DLG) + t3 = .ProgressBarDlg~new(sd"rc\PropertySheetDemo.rc", IDD_PROGRESSBAR_DLG) + t4 = .TrackBarDlg~new(sd"rc\PropertySheetDemo.dll", IDD_TRACKBAR_DLG) + t5 = .TabDlg~new(sd"rc\PropertySheetDemo.dll", IDD_TAB_DLG) + + tabContent = .array~of(t1, t2, t3, t4, t5) + + -- Create the main dialog. + dlg = .NewControlsDialog~new(sd'rc\PropertySheetDemo.dll', IDD_NEWCONTROLS_DLG) + + -- Invoke the prep() methods of the list view and progress bar dialogs to do + -- some initial set up before we start executing the main dialog. Note that + -- the list view (t1) dialog needs to have its owner dialog set before + -- invoking the prep method. + t1~ownerDialog = dlg + t1~prep + t3~prep + + -- Invoke the main dialog's prep() method to do some initial set up before the + -- dialog is started executing. + dlg~prep(tabContent) + + -- Show and run the dialog. + dlg~execute('SHOWTOP', IDI_DLG_OODIALOG) + + return 0 + +::requires "ooDialog.cls" + +::class 'NewControlsDialog' subclass ResDialog + +::attribute tabContent + +/** prep() + * + * This method is invoked before the dialog is executed. It does some initial + * set up that would normally be done (by the author) in initDialog(). The + * tabContent argument is an array of the 5 ControlDialog dialogs used as the + * content for the 5 pages of the tab control. This array is saved in the + * tabContent attribute so the dialogs can be accessed when needed. + */ +::method prep + expose tabContent lastSelected havePositioned + use strict arg tabContent + + -- The havePositioned array is used to determine if the page dialogs have been + -- positioned or not. Mark all 5 dialogs as not having been positioned yet. + havePositioned = .array~of(.false, .false, .false, .false, .false) + + -- No tab has been selected yet + lastSelected = 0 + + -- Connect the event handling methods to the events we are interested in. + self~connectButtonEvent(IDC_PB_PREVIOUS, CLICKED, onPrevious) + self~connectButtonEvent(IDC_PB_NEXT, CLICKED, onNext) + self~connectTabEvent(IDC_TAB, SELCHANGE, onNewTab) + self~connectTabEvent(IDC_TAB, "KEYDOWN", "onTabKeyDown", 'SYNC') + + +/** initDialog() + * + * Initialize the underlying Windows dialog. This includes setting up the tab + * control tabs, executing the dialog used for the first tab, and positioning + * the dialog over the display area of the tab control. There are 5 + * .ControlDialog dialogs. The dialogs are used for the display + * area of the tab control, one control dialog for each tab of the tab control. + */ +::method initDialog + expose tabContent tabControl pbNext pbPrevious + + -- Start executing the control dialog for the first tab in the tab control. + -- We can not resize and reposition the control dialog until the underlying + -- dialog is created, so we get it started, then do our other tasks. + dlg = tabContent[1] + dlg~execute + + -- Add the tabs to the tab control. + tabControl = self~newTab(IDC_TAB) + tabControl~addSequence("List View", "Tree View", "Progress Bar", "Track Bar", "Tab") + + -- Save a reference to the push buttons. + pbNext = self~newPushButton(IDC_PB_NEXT) + pbPrevious = self~newPushButton(IDC_PB_PREVIOUS) + + -- Determine the position and size of the display area of the tab control. + self~calculateDisplayArea + + -- Position and show the control dialog used for the first page of the tab. + self~positionAndShow(1) + + +/** calculateDisplayArea() + * + * Tab controls contain two areas, the tabs themselves and the display area. + * The display area is where the content for each tab is drawn. + * + * We need to match the control dialog(s) size and position with the display + * area size and position. There are two approaches here: + * + * We could calculate the size of the largest dialog, resize the tab control to + * match, and position the control dialog over the display area. + * + * We can get the size and position of the tab control's display area and resize + * and reposition the control dialog(s) to match. This is the approach we use + * here. + */ +::method calculateDisplayArea private + expose tabControl displayRect + + -- Given a rectangle describing the tab control's size and position, the tab + -- control itself will calculate the display area's size and position. + r = tabControl~windowRect + tabControl~calcDisplayRect(r) + + -- Save the size of the display area, we need it later. + s = .Size~new(r~right - r~left, r~bottom - r~top) + + -- Now we need to map the display area's position on the screen, to the client + -- co-ordinates of the main dialog. The control dialog(s) are children windows + -- of the main dialog, which is why we need to use the client-area of the + -- dialog, not the client area of the tab control. + p = .Point~new(r~left, r~top) + self~screen2client(p) + + -- Create our display rectangle. This is used in setWindowPosition(), which + -- takes a point / size rectangle. ooDialog defines a point / size rectangle + -- as using the left and top attributes for the position of the upper left + -- corner of a rectangle, using the right attribute for the width of the + -- rectangle, and using the bottom attribute for the height of the rectangle. + displayRect = .Rect~new(p~x, p~y, s~width, s~height) + + +/** positionAndShow() + * + * Used to resize and reposition one of the control dialogs so it occupies the + * display area of the tab control. + * + */ +::method positionAndShow private + expose tabControl tabContent displayRect lastSelected havePositioned + use strict arg index + + -- We can not position the control dialog until the underlying Windows dialog + -- is created. If the system is heavily loaded for some reason, this may not + -- have happened yet. We need to wait for it. + dlg = tabContent[index] + do i = 1 to 10 + if dlg~hwnd <> 0 then leave + z = SysSleep(.01) + end + + if dlg~hwnd == 0 then do + say "Error creating dialog for the tab with index:" index", aborting" + return self~cancel + end + + if lastSelected <> 0 then tabContent[lastSelected]~hide + + -- Now resize and reposition the control dialog to the tab control's display + -- area. We need to position the control dialog *above* the tab control in + -- the Z-order so that it shows. + dlg~setWindowPos(tabControl~hwnd, displayRect, "SHOWWINDOW NOOWNERZORDER") + + lastSelected = index + havePositioned[index] = .true + + self~checkButtons + + +::method onNewTab + expose tabControl tabContent havePositioned lastSelected + + index = tabControl~selectedIndex + 1 + dlg = tabContent[index] + + if havePositioned[index] then do + last = tabContent[lastSelected] + last~hide + dlg~show + lastSelected = index + end + else do + dlg~ownerDialog = self + dlg~execute + self~positionAndShow(index) + end + if index == 3 then dlg~activateThreads + + self~checkButtons + + +::method onNext unguarded + expose tabControl + + tabControl~selectIndex(tabControl~selectedIndex + 1) + self~onNewTab + + +::method goTo private unguarded + use strict arg tabControl, index + + tabControl~selectIndex(index) + self~onNewTab + + +::method onPrevious unguarded + expose tabControl + + tabControl~selectIndex(tabControl~selectedIndex - 1) + self~onNewTab + +::method onTabKeyDown unguarded + use arg id, vKey, tabControl + + lastTab = tabControl~items + + -- We have to reply or the message loop can not process messages and if the + -- dialog for the new tab has not been started yet, it can not execute. + reply 0 + + select + when vKey == .VK~N then self~onNext + when vKey == .VK~P then self~onPrevious + when vKey == .VK~home then self~goTo(tabControl, 0) + when vKey == .VK~end then self~goTo(tabControl, lastTab) + otherwise nop -- ignore all other keys + end + -- End select + + return + + +::method checkButtons private + expose tabControl pbNext pbPrevious + + index = tabControl~selectedIndex + 1 + if index == 1 then do + pbPrevious~disable + pbNext~enable + end + else if index == 5 then do + pbPrevious~enable + pbNext~disable + end + else do + pbPrevious~enable + pbNext~enable + end + + +::method cancel + expose tabContent + + do dlg over tabContent + dlg~endExecution(.false) + end + + return self~cancel:super + +::method ok + expose tabContent + + do dlg over tabContent + dlg~endExecution(.true) + end + + return self~ok:super + + + +::class 'ListViewDlg' subclass ResControlDialog + +::method initDialog + expose lv imageList listData + + -- Instantiate a Rexx list view object that represents the underlying + -- Windows list-view. The list-view style is report. + lv = self~newListView(IDC_LV_MAIN) + + -- Set the column headers + lv~insertColumn(0, "Symbol", 40) + lv~insertColumn(1, "Quote", 50) + lv~insertColumn(2, "Year high", 50) + lv~insertColumn(3, "Year low", 50) + lv~insertColumn(4, "Description", 120) + + lv~setImageList(imageList, SMALL) + + -- Fill the list-view with random data. + do row over listData + lv~addRow( , row[1], row[2], row[3], row[4], row[5], row[6]) + end + + -- Add full row select and the ability to drag and drop the columns to the + -- list-view. + lv~addExtendedStyle("FULLROWSELECT HEADERDRAGDROP") + + -- There is a known redrawing problem when a list view is used in a tab + -- control. ooDialog has an internal fix for that (see initUpdateListView.) + -- But, when the list view is the first page of the tab control, the list + -- view needs to have gained the focus before the dialog is covered up by + -- another window, for the fix to work. Assigning the focus here prevents + -- the very rare occurrence of a user opening the dialog, immediately + -- switching to another window, and then switching back to the dialog, and + -- the fix not working. + lv~assignFocus + +/** onActivate + * + * Invoked when a list-view item is double-clicked. We display a message and + * set the focus to the next item in the list. + */ +::method onActivate + expose lv + + selectedItem = lv~focused + symbol = lv~itemText(selectedItem) + price = lv~itemText(selectedItem, 1) + + question = "You have selected the stock with symbol" symbol". Do you want to order" || .endOfLine || - + "50 shares of stock at" price"?" + placeOrder = MessageDialog(question, self~hwnd, "Place Order for Stock", "YESNO", "QUESTION", "DEFBUTTON2" ) + + cost = 50 * price~substr(2) + if placeOrder == self~constDir["IDYES"] then do + j = MessageDialog("Okay, your bank account will be debited $"cost "dollars.", self~hwnd, - + "Order Confirmation", "OK", "INFORMATION") + end + else do + j = MessageDialog("That saved you $"cost "dollars.", self~hwnd, "Order Canceled", "OK", "EXCLAMATION") + end + + lv~deselect(selectedItem) + selectedItem += 1 + lv~focus(selectedItem) + lv~select(selectedItem) + + +/** onColumnClick() + * + * Invoked when a column header of the list-view is clicked. We just show a + * message box so that the user has some feedback. + */ +::method onColumnClick + use arg id, column + + msg = "Column" column + 1 "was clicked in control" id + j = MessageDialog(msg, self~hwnd, "List-View Notification") + + +/** prep() + * + * Does some initial set up for the list view dialog. This is moved out of the + * initDialog() method to, perhaps, help populate the list view a little + * quicker. + */ +::method prep + expose imageList listData + + -- Initialize the internal fix for the list-view redrawing problem when a + -- list-view is used in a tab control. + self~initUpdateListView(IDC_LV_MAIN) + + -- Create the image list for the list-view. The image list will consist of + -- 4 images. The images are used as the icons for each item in the list + -- view. Each item is assigned 1 image, at random, when the item is added + -- to the list-view. + -- + -- The list-view control is created without the SHAREIMAGES styles, so it + -- takes care of releasing the image list when the program ends. + image = .Image~getImage(.application~srcDir"rc\propertySheetDemoListView.bmp") + imageList = .ImageList~create(.Size~new(16, 16), COLOR8, 4, 0) + if \image~isNull, \imageList~isNull then do + imageList~add(image) + + -- The image list makes a copy of the bitmap, so we can release it now + -- to free up some (small) amount of system resources. This is not + -- necessary, the OS will release the resource automatically when the + -- program ends. + image~release + end + + -- Create the data for each item (row) in the list view. The rows are + -- added to the list view in the initDialog() method + listData = .array~new(26) + do ch = "A"~c2d to "Z"~c2d + q = random(200) + yh = random(400) + yh = max(yh, q) + yl = random(100) + yl = min(yl, q) + row = .array~new(6) + row[1] = random(3) + row[2] = "_" || ch~d2c~copies(3) || "_" + row[3] = "$" || q + row[4] = "$" || yh + row[5] = "$" || yl + row[6] = ch~d2c~copies(3) "is a fictitious company." + listData~append(row) + end + + -- Connect 2 list-view events to Rexx methods in this dialog. The double- + -- click on a list-view item, and the click on a column header events. + self~connectListViewEvent(IDC_LV_MAIN, "ACTIVATE", "onActivate") + self~connectListViewEvent(IDC_LV_MAIN, "COLUMNCLICK") + + +::class 'TreeViewDlg' subclass ResControlDialog + +::method initDialog + + -- Instantiate a Rexx tree view object that represents the Windows tree-view + -- control. + tv = self~newTreeView(IDC_TV_MAIN) + + -- Create and set the ImageList for the tree view items + image = .Image~getImage(.application~srcDir"rc\propertySheetDemoTreeView.bmp") + imageList = .ImageList~create(.Size~new(32, 32), COLOR8, 10, 0) + if \image~isNull, \imageList~isNull then do + imageList~add(image) + tv~setImageList(imageList, NORMAL) + image~release + end + + -- Add the tree view items. Toys will be the root (the first argument is + -- not omitted. Subitems are added by omitting the first arguments. The + -- number of arguments omitted indicates the depth of the subitem. + -- + -- The last numeric argument in some of the items is the index for the icon + -- for that item in the image list. Those items without a number will not + -- display an icon. + + tv~add("Toys", 1) + tv~add(, "Indoor", 14) + tv~add(, , "Boys", 19) + tv~add(, , , "Cowboys", 13) + tv~add(, , , "Cars", 8) + tv~add(, , , "Starwars", 9) + tv~add(, , "Girls", 0) + tv~add(, , , "Barby", 19) + tv~add(, , , "Painting", 15) + tv~add(, , , "Cooking", 13) + tv~add(, , "Adults", 17) + tv~add(, , , "Poker", 15) + tv~add(, , "Technical", 16) + tv~add(, , , "Racing cars", 8) + tv~add(, , , "Trains", 7) + tv~add(, "Outdoor", 11) + tv~add(, , "Water", 22) + tv~add(, , , "Ball", 5) + tv~add(, , , "Soft tennis", 6) + tv~add(, , "Sand", 12) + tv~add(, , , "Shovel", 12) + tv~add(, , , "Bucket", 19) + tv~add(, , , "Sandbox", 12) + tv~add(, , "Technical", 16) + tv~add(, , , "Trains", 7) + tv~add(, , , "Remote controlled", 8) + tv~add("Office Articles", 2) + tv~add( , "Tools", 16) + tv~add( , "Books", 19) + tv~add( , , "Introduction", 14) + tv~add( , , "Advanced Programming", 17) + tv~add( , , "Tips & Tricks", 16) + tv~add("Hardware", 4) + tv~add( , "Garden", 0) + tv~add( , "Handyman", 18) + tv~add( , "Household", 18) + tv~add("Furniture", 3) + tv~add( , "Standard", 12) + tv~add( , "Luxury", 21) + + -- Connecting the begin drag event and using the default tree drag handler + -- allows us to suppport drag and drop (using the default behaviour. + self~connectTreeViewEvent(IDC_TV_MAIN, "BeginDrag", "DefTreeDragHandler") + + +::class 'ProgressBarDlg' subclass RcControlDialog + +::method prep + expose threadsStarted processes + + threadsStarted = 0 + processes = .array~of('animateProgressA', 'animateProgressB', 'animateProgressC', - + 'animateProgressD', 'animateProgressE') + + +-- This message is sent to us by the owner dialog, the .NewControlsDialog dialog +-- to notify us that we are about to become visible. We use the notification to +-- start the progress bar animation threads. +::method activateThreads unguarded + expose threadsStarted processes + + reply 0 + + -- If no threads are running, start a thread to run each progress bar + -- asynchronously. + if threadsStarted < 1 then do + threadsStarted = processes~items + do methodName over processes + self~start(methodName) + end + end + +-- This is a generic method that simulates some type of processing that takes a +-- long time. The progress of this processing is displayed by the progress bar. +::method animateProgress unguarded + use arg progressBar, label, step, iterations, tsleep + + progressBar~setRange(0, iterations * step) + progressBar~setStep(step) + do i = 1 to iterations + progressBar~step + if (iterations * step == 100) then label~setText(i * step "%") + else label~setText(i * step) + + call msSleep tsleep + if \ self~isDialogActive then return + end + +-- The following 5 methods are started asynchronously to animate the progress +-- bars. +::method animateProgressA unguarded + expose threadsStarted pbA labelA + + if \ pbA~isA(.ProgressBar) then do + pbA = self~newProgressBar(IDC_PBAR_PROCESSA) + labelA = self~newStatic(IDC_ST_PERCENTA) + end + + self~animateProgress(pbA, labelA, 5, 20, 600) + threadsStarted -= 1 + +::method animateProgressB unguarded + expose threadsStarted pbB labelB + + if \ pbB~isA(.ProgressBar) then do + pbB = self~newProgressBar(IDC_PBAR_PROCESSB) + labelB = self~newStatic(IDC_ST_PERCENTB) + end + + self~animateProgress(pbB, labelB, 1, 100, 150) + threadsStarted -= 1 + +::method animateProgressC unguarded + expose threadsStarted pbC labelC + + if \ pbC~isA(.ProgressBar) then do + pbC = self~newProgressBar(IDC_PBAR_PROCESSC) + labelC = self~newStatic(IDC_ST_PERCENTC) + end + + self~animateProgress(pbC, labelC, 2, 50, 200) + threadsStarted -= 1 + +::method animateProgressD unguarded + expose threadsStarted pbD labelD + + if \ pbD~isA(.ProgressBar) then do + pbD = self~newProgressBar(IDC_PBAR_PROCESSD) + labelD = self~newStatic(IDC_ST_PERCENTD) + end + + self~animateProgress(pbD, labelD, 10, 40, 300) + threadsStarted -= 1 + +::method animateProgressE unguarded + expose threadsStarted pbE labelE + + if \ pbE~isA(.ProgressBar) then do + pbE = self~newProgressBar(IDC_PBAR_PROCESSE) + labelE = self~newStatic(IDC_ST_PERCENTE) + end + + self~animateProgress(pbE, labelE, 20, 50, 500) + threadsStarted -= 1 + + +::class 'TrackBarDlg' subclass ResControlDialog + +::method initDialog + expose font1 trackBars tbLabels + + -- As we initialize each track bar we'll stash the Rexx object in a table + -- for easy access later, indexed by its numeric resource id. The same + -- thing is done for the static control that is the label for the track bar. + trackBars = .table~new + tbLabels = .table~new + + -- For the horizonatal track bars we'll use a big font for the label. + font1 = self~CreateFontEx("Arial", 24, "BOLD") + + -- The symbolic IDs for the track bars / labels are named after the style + -- of the track bar. Vertical or horizontal and where the ticks are placed. + + -- Initialize the horizontal track bar with ticks on the bottom. + tb = self~newTrackBar(IDC_TB_HORZ_BOTTOM) + label = self~newStatic(IDC_ST_HORZ_BOTTOM) + + tb~setTickFrequency(10) + tb~setPos(20, .true) + label~setText(20) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_BOTTOM] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the horizontal track bar with ticks on the top. + tb = self~newTrackBar(IDC_TB_HORZ_TOP) + label = self~newStatic(IDC_ST_HORZ_TOP) + + tb~initRange(0, 200) + tb~setTickFrequency(50) + tb~setPos(40, .true) + label~setText(40) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_TOP] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the horizontal track bar with ticks on the both sides. + tb = self~newTrackBar(IDC_TB_HORZ_BOTH) + label = self~newStatic(IDC_ST_HORZ_BOTH) + + tb~initSelRange(20, 60) + tb~setTickFrequency(10) + tb~setPos(80, .true) + label~setText(80) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_BOTH] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the right. + tb = self~newTrackBar(IDC_TB_VERT_RIGHT) + label = self~newStatic(IDC_ST_VERT_RIGHT) + + tb~setTickFrequency(10) + tb~setPos(30, .true) + label~setText(30) + + id = self~constDir[IDC_TB_VERT_RIGHT] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the left. + tb = self~newTrackBar(IDC_TB_VERT_LEFT) + label = self~newStatic(IDC_ST_VERT_LEFT) + + tb~setTickFrequency(10) + tb~initRange(0,400) + tb~setLineStep(5) + tb~setPageStep(50) + tb~setPos(90, .true) + label~setText(90) + + id = self~constDir[IDC_TB_VERT_LEFT] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the both sides. + tb = self~newTrackBar(IDC_TB_VERT_BOTH) + label = self~newStatic(IDC_ST_VERT_BOTH) + + tb~setTickFrequency(5) + tb~setPos(70, .true) + label~setText(70) + + id = self~constDir[IDC_TB_VERT_BOTH] + trackBars[id] = tb + tbLabels[id] = label + + -- Connect the event notification that is sent when a track bar is moved to + -- the onEndTrack() method. That method will update the text label for the + -- track bar with the new postition. + self~connectTrackBarEvent(IDC_TB_HORZ_BOTH, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_HORZ_TOP, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_HORZ_BOTTOM, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_RIGHT, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_LEFT, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_BOTH, "EndTrack", "onEndTrack") + +-- Update the static contol that shows the position for a slider when the +-- user is done moving it. +::method onEndTrack + expose trackBars tbLabels + use arg code, hwndTrackBar + + -- hwndTrackBar is the handle to the track bar that was moved. Get its + -- resource ID and use that as an index into the table of track bar objects + -- and the table of the labels. + id = self~getControlID(hwndTrackBar) + tbLabels[id]~setText(trackBars[id]~pos) + +-- We use the leaving() method to clean up (delete) the font we created. In +-- this program there is really no need to do this. As soon as the interpreter +-- terminates, the OS cleans up the resources automatically. The only time +-- cleaning up resources makes sense is in a long-running program that creates +-- and ends a lot of dialogs. Then, over time, the memory usge of the program +-- would keep growing. +::method leaving + expose font1 + self~deleteFont(font1) + + +::class 'TabDlg' subclass ResControlDialog + +::method initDialog + expose font2 font3 imageList iconsRemoved needWrite pb + + -- Set the iconsRemoved and needWrite to false. These flags are used in + -- the OnDrawTabRect() method. + iconsRemoved = .false + needWrite = .false + + -- Connect the draw event of the owner-drawn button. This is sent when the + -- button needs to be drawn. Then connect the selection changed event of the + -- tab control. This is sent when the user clicks on a different tab. + self~connectDraw(IDC_PB_OWNERDRAW, "onDrawTabRect") + self~connectTabEvent(IDC_TAB_MAIN, "SELCHANGE", "onTabSelChange") + + tc = self~newTab(IDC_TAB_MAIN) + if tc == .nil then return + + -- Create a font used to display the name of the color in the owner-drawn + -- button. Create another font used to display some informative text. + font2 = self~createFontEX("Arial", 48, "BOLD ITALIC") + font3 = self~createFontEx("Arial", 16, "BOLD") + + -- Add all the tabs, including the index into the image list for an icon for + -- each tab. + tc~AddFullSeq("Red", 0, ,"Green", 1, , "Moss", 2, , "Blue", 3, , "Purple", 4, , "Cyan", 5, , "Gray", 6) + + -- Create a COLORREF (pure white) and load our bitmap. The bitmap is a + -- series of 16x16 images, each one a colored letter. + cRef = .Image~colorRef(255, 255, 255) + image = .Image~getImage(.application~srcDir"rc\propertySheetDemoTab.bmp") + + -- Create our image list, as a masked image list. + flags = 'COLOR24 MASK' + imageList = .ImageList~create(.Size~new(16, 16), flags, 10, 0) + if \image~isNull, \imageList~isNull then do + -- The bitmap is added and the image list deduces the number of images + -- from the width of the bitmap. For each image, the image list creates a + -- mask using the color ref. In essence, the mask is used to turn each + -- white pixel in the image to transparent. In this way, only the letter + -- part of the image shows and the rest of the image lets the under-lying + -- color show through. + imageList~addMasked(image, cRef) + tc~setImageList(imageList) + + -- The image list makes a copy of each image added to it. So, we can now + -- release the original image to free up some small amount of system + -- resoureces. + image~release + end + else do + iconsRemoved = .true + end + + -- Have the tab control calculate its display area's size and position. + r = tc~windowRect + tc~calcDisplayRect(r) + s = .Size~new(r~right - r~left, r~bottom - r~top) + + -- Get the owner draw push button. We'll resize and position it so that it + -- completely takes up the display area of the tab control. + pb = self~newPushButton(IDC_PB_OWNERDRAW) + + -- Map the display area's position on the screen, to the client co-ordinates + -- of this control dialog. + p = .Point~new(r~left, r~top) + self~screen2client(p) + + -- Now resize and reposition the button so it exactly over-lays the display + -- area of the tab control. We specify that the tab control window is behind + -- the button and use the flag that prevents the button's owner window, this + -- z-order from changing. This leaves the tab control on top of the dialog, + -- and our push button on top of the tab control. Which of course is what we + -- want. + pb~setWindowPos(tc~hwnd, p~x, p~y, s~width, s~height, "SHOWWINDOW NOOWNERZORDER") + + + +-- When a new tab is selected, we have the owner-drawn button update itself. +-- This causes the button to redraw and the onDrawTabRect() method gets invoked, +-- which actually does the drawing. +::method onTabSelChange + expose pb + pb~update + + +-- Fill the owner-drawn button with the color matching the tab's label and write +-- the name of the color. +::method onDrawTabRect + expose font2 font3 imageList iconsRemoved needWrite + use arg id + + button = self~newPushButton(id) + if button == .nil then return + tc = self~newTab(IDC_TAB_MAIN) + if tc == .nil then return + + -- Each time the 'Gray' tab is selected, we remove the tab icons. Then, when + -- one of the other tabs is selected we set the image list back. + currentTab = tc~selected + if currentTab == 'Gray' then do + tc~setImageList(.nil) + iconsRemoved = .true + needWrite = .true + end + else do + if iconsRemoved then do + tc~setImageList(imageList) + iconsRemoved = .false + needWrite = .true + end + end + + -- Get the button's device context, create pen and brush, and assign pen, + -- brush and font to the device context. + dc = button~getDC + pen = button~createPen(1, "SOLID", 0) + brush = button~createBrush(tc~SelectedIndex + 1) + + oldPen = button~objectToDc(dc, pen) + oldBrush = button~objectToDc(dc, brush) + oldFont = button~fontToDC(dc, font2) + button~transparentText(dc) + + -- Draw a filled in rectangle, with a border of 5 around it, and write text. + size = button~getRealSize + button~rectangle(dc, 5, 5, size~width - 5, size~height - 5, "FILL") + button~writeDirect(dc, trunc(size~width / 4), trunc(size~height / 4), tc~Selected) + + -- Add informative text if needed. + if needWrite then do + button~fontToDC(dc, font3) + x = trunc(size~width / 4) + y = trunc(size~height / 2) + + if currentTab == 'Gray' then + button~writeDirect(dc, x, y, "(Tab icons are removed)") + else + button~writeDirect(dc, x, y, "(Tab icons are restored)") + needWrite = .false + end + + -- Restore pen, brush, and font, then release the device context. + button~objectToDc(dc, oldPen) + button~objectToDc(dc, oldBrush) + button~fontToDC(dc, oldFont) + button~opaqueText(dc) + + button~deleteObject(pen) + button~deleteObject(brush) + button~freeDC(dc) + +-- We use the leaving() method to clean up (delete) the fonts and the image list +-- we created. In this program there is really no need to do this. As soon as +-- the interpreter terminates, the OS cleans up the resources automatically. +-- The only time cleaning up resources makes sense is in a long-running program +-- that creates and ends a lot of dialogs. Then, over time, the memory usge of +-- the program would keep growing. +::method leaving + expose font2 font3 imageList + + self~deleteFont(font2) + self~deleteFont(font3) + imageList~release + diff --git a/modules/windows/oodialog/propertysheet.tabControls/TabOwnerDemo.rex b/modules/windows/oodialog/propertysheet.tabControls/TabOwnerDemo.rex new file mode 100755 index 0000000..383564a --- /dev/null +++ b/modules/windows/oodialog/propertysheet.tabControls/TabOwnerDemo.rex @@ -0,0 +1,786 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2018 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** Tab Control / Dialog Controls / ControlDialog Example + * + * This example demonstrates how to use the ControlDialog class to populate a + * Tab control. It is basically the same as the PropertySheetDemo.rex example, + * but uses a Tab control with ControlDialog objects rather than using a + * PropertySheetDialog. + * + * Much of the code is simply copied from the PropertySheetDemo.rex program. + */ + + sd = locate() + .application~setDefaults("O", sd"rc\TabOwnerDemo.h", .false) + + -- Create a managed tab object that is composed of all the control dialogs for + -- a specific tab control in the tab owner dialog. + dlgs = .array~new(5) + + exArgs = .ControlDlgInfo~new( , .true, "List View", .Size~new(300, 250)) + dlgs[1] = .ListViewDlg~new(sd"rc\TabOwnerDemo.dll", IDD_LISTVIEW_DLG, , , exArgs) + + exArgs~title = 'Tree View' + dlgs[2] = .TreeViewDlg~new(sd"rc\TabOwnerDemo.dll", IDD_TREEVIEW_DLG, , , exArgs) + + exArgs~title = 'Progress Bar' + dlgs[3] = .ProgressBarDlg~new(sd"rc\TabOwnerDemo.dll", IDD_PROGRESSBAR_DLG, , , exArgs) + + exArgs~title = 'Track Bar' + dlgs[4] = .TrackBarDlg~new(sd"rc\TabOwnerDemo.dll", IDD_TRACKBAR_DLG, , , exArgs) + + exArgs~title = 'Tab' + dlgs[5] = .TabDlg~new(sd"rc\TabOwnerDemo.dll", IDD_TAB_DLG, , , exArgs) + + mt1 = .ManagedTab~new(IDC_TAB1, dlgs, "SELCHANGE") + + dlgs = .array~new(5) + + exArgs~Title = "Blank 1" + dlgs[1] = .BlankDlg~new(sd"rc\TabOwnerDemo.dll", IDD_BLANK_DLG, , , exArgs) + + exArgs~title = 'Blank 2' + dlgs[2] = .BlankDlg~new(sd"rc\TabOwnerDemo.dll", IDD_BLANK_DLG, , , exArgs) + + exArgs~title = 'Blank 3' + dlgs[3] = .BlankDlg~new(sd"rc\TabOwnerDemo.dll", IDD_BLANK_DLG, , , exArgs) + + exArgs~title = 'Blank 4' + dlgs[4] = .BlankDlg~new(sd"rc\TabOwnerDemo.dll", IDD_BLANK_DLG, , , exArgs) + + exArgs~title = 'Blank 5' + dlgs[5] = .BlankDlg~new(sd"rc\TabOwnerDemo.dll", IDD_BLANK_DLG, , , exArgs) + + mt2 = .ManagedTab~new(IDC_TAB2, dlgs) + + -- Create the main dialog. + exArgs = .TabOwnerDlgInfo~new(.array~of(mt1, mt2)) + dlg = .NewControlsDialog~new( , , exArgs) + + -- Show and run the dialog. + dlg~execute('SHOWTOP', IDI_DLG_OOREXX) + + return 0 + +::requires "ooDialog.cls" + +::class 'NewControlsDialog' subclass UserDialog inherit TabOwnerDialog + +::method init + + forward class (super) continue + if self~initCode <> 0 then return + + self~createCenter(640, 300, "TabOwner Example with ControlDialog objects", "", , "Arial", 9) + +::method defineDialog + + self~createTab(IDC_TAB1, 10, 5, 305, 265) + self~createTab(IDC_TAB2, 325, 5, 305, 265) + + self~createPushButton(IDC_PB_PREVIOUS, 10, 278, 60, 14, , "Previous Control", onPrevious) + self~createPushButton(IDC_PB_NEXT, 80, 278, 60, 14, , "Next Control", onNext) + self~createPushButton(IDOK, 500, 278, 60, 14, "DEFAULT", "Ok") + self~createPushButton(IDCANCEL, 570, 278, 60, 14, , "Cancel") + + +::method initDialog + expose tabControl pbNext pbPrevious +--say "Enter NewControlsDialog::initDialog()" + + -- Save a reference to the push buttons. + pbNext = self~newPushButton(IDC_PB_NEXT) + pbPrevious = self~newPushButton(IDC_PB_PREVIOUS) + tabControl = self~newTab(IDC_TAB1) + + pbPrevious~disable + +--say "Leave NewControlsDialog::initDialog()" + +::method tabOwnerSelChange unguarded + expose pbNext pbPrevious + use arg pageDlg, pageNumber, + + if pageNumber == 1 then do + pbPrevious~disable + pbNext~enable + end + else if pageNumber == 5 then do + pbPrevious~enable + pbNext~disable + end + else do + pbPrevious~enable + pbNext~enable + end + +::method onNext + expose tabControl + + tabControl~focus(tabControl~selectedIndex + 1) + self~checkButtons + + +::method onPrevious + expose tabControl + + tabControl~focus(tabControl~selectedIndex - 1) + self~checkButtons + + +::method checkButtons + expose tabControl pbNext pbPrevious + + index = tabControl~selectedIndex + 1 + if index == 1 then do + pbPrevious~disable + pbNext~enable + end + else if index == 5 then do + pbPrevious~enable + pbNext~disable + end + else do + pbPrevious~enable + pbNext~enable + end + + + +::class 'ListViewDlg' subclass ResControlDialog + +::method initDialog + expose lv +-- say "Enter ListViewDlg::initDialog" + + self~initUpdateListView(IDC_LV_MAIN) + + -- Instantiate a Rexx list view object that represents the underlying + -- Windows list-view. The list-view style is report. + lv = self~newListView(IDC_LV_MAIN) + + -- Set the column headers + lv~insertColumn(0, "Symbol", 40) + lv~insertColumn(1, "Quote", 50) + lv~insertColumn(2, "Year high", 50) + lv~insertColumn(3, "Year low", 50) + lv~insertColumn(4, "Description", 120) + + -- Set the images for the items in the list-view. The list-view control was + -- created without the SHAREIMAGES styles, so it takes care of releasing the + -- image list when the program ends. + image = .Image~getImage(.application~srcDir"rc\TabOwnerDemoListView.bmp") + imageList = .ImageList~create(.Size~new(16, 16), COLOR8, 4, 0) + if \image~isNull, \imageList~isNull then do + imageList~add(image) + lv~setImageList(imageList, SMALL) + + -- The image list makes a copy of the bitmap, so we can release it now + -- to free up some (small) amount of system resources. This is not + -- necessary, the OS will release the resource automatically when the + -- program ends. + image~release + end + + -- Fill the list-view with random data. + do ch = "A"~c2d to "Z"~c2d + q = random(200) + --call msSleep 1 + yh = random(400) + yh = max(yh, q) + yl = random(100) + yl = min(yl, q) + lv~addRow( , random(3), "_" || ch~d2c~copies(3) || "_", "$" || q, "$" || yh, "$" || yl, - + ch~d2c~copies(3) "is a fictitious company.") + end + + -- Add full row select and the ability to drag and drop the columns to the + -- list-view. + lv~addExtendedStyle("FULLROWSELECT HEADERDRAGDROP") + + -- Connect 2 list-view events to Rexx methods in this dialog. The double- + -- click on a list-view item, and the click on a column header events. + self~connectListViewEvent(IDC_LV_MAIN, "ACTIVATE", "onActivate") + self~connectListViewEvent(IDC_LV_MAIN, "COLUMNCLICK") + +-- say "Leave ListViewDlg::initDialog" + +-- Invoked when a list-view item is double-clicked. We display a message and +-- set the focus to the next item in the list. +::method onActivate + expose lv + + selectedItem = lv~focused + symbol = lv~itemText(selectedItem) + price = lv~itemText(selectedItem, 1) + + question = "You have selected the stock with symbol" symbol". Do you want to order" || .endOfLine || - + "50 shares of stock at" price"?" + placeOrder = MessageDialog(question, self~hwnd, "Place Order for Stock", "YESNO", "QUESTION", "DEFBUTTON2" ) + + cost = 50 * price~substr(2) + if placeOrder == self~constDir["IDYES"] then do + j = MessageDialog("Okay, your bank account will be debited $"cost "dollars.", self~hwnd, - + "Order Confirmation", "OK", "INFORMATION") + end + else do + j = MessageDialog("That saved you $"cost "dollars.", self~hwnd, "Order Canceled", "OK", "EXCLAMATION") + end + + lv~deselect(selectedItem) + selectedItem += 1 + lv~focus(selectedItem) + lv~select(selectedItem) + +-- Invoked when a column header of the list-view is clicked. We just show a +-- message box so that the user has some feedback. +::method OnColumnClick + use arg id, column + j = MessageDialog("Column" column + 1 "was clicked in control" id, self~hwnd, "List-View Notification") + +::method tabPageSetActive unguarded + use arg owner, tab + reply 0 + + +::class 'TreeViewDlg' subclass ResControlDialog + +::method initDialog + + -- Instantiate a Rexx tree view object that represents the Windows tree-view + -- control. + tv = self~newTreeView(IDC_TV_MAIN) + + -- Create and set the ImageList for the tree view items + image = .Image~getImage(.application~srcDir"rc\TabOwnerDemoTreeView.bmp") + imageList = .ImageList~create(.Size~new(32, 32), COLOR8, 10, 0) + if \image~isNull, \imageList~isNull then do + imageList~add(image) + tv~setImageList(imageList, NORMAL) + image~release + end + + -- Add the tree view items. Toys will be the root (the first argument is + -- not omitted. Subitems are added by omitting the first arguments. The + -- number of arguments omitted indicates the depth of the subitem. + -- + -- The last numeric argument in some of the items is the index for the icon + -- for that item in the image list. Those items without a number will not + -- display an icon. + + tv~add("Toys", 1) + tv~add(, "Indoor", 14) + tv~add(, , "Boys", 19) + tv~add(, , , "Cowboys", 13) + tv~add(, , , "Cars", 8) + tv~add(, , , "Starwars", 9) + tv~add(, , "Girls", 0) + tv~add(, , , "Barby", 19) + tv~add(, , , "Painting", 15) + tv~add(, , , "Cooking", 13) + tv~add(, , "Adults", 17) + tv~add(, , , "Poker", 15) + tv~add(, , "Technical", 16) + tv~add(, , , "Racing cars", 8) + tv~add(, , , "Trains", 7) + tv~add(, "Outdoor", 11) + tv~add(, , "Water", 22) + tv~add(, , , "Ball", 5) + tv~add(, , , "Soft tennis", 6) + tv~add(, , "Sand", 12) + tv~add(, , , "Shovel", 12) + tv~add(, , , "Bucket", 19) + tv~add(, , , "Sandbox", 12) + tv~add(, , "Technical", 16) + tv~add(, , , "Trains", 7) + tv~add(, , , "Remote controlled", 8) + tv~add("Office Articles", 2) + tv~add( , "Tools", 16) + tv~add( , "Books", 19) + tv~add( , , "Introduction", 14) + tv~add( , , "Advanced Programming", 17) + tv~add( , , "Tips & Tricks", 16) + tv~add("Hardware", 4) + tv~add( , "Garden", 0) + tv~add( , "Handyman", 18) + tv~add( , "Household", 18) + tv~add("Furniture", 3) + tv~add( , "Standard", 12) + tv~add( , "Luxury", 21) + + -- Connecting the begin drag event and using the default tree drag handler + -- allows us to suppport drag and drop (using the default behaviour. + self~connectTreeViewEvent(IDC_TV_MAIN, "BeginDrag", "DefTreeDragHandler") + +::method tabPageSetActive unguarded + use arg owner, tab + reply 0 + + +::class 'ProgressBarDlg' subclass ResControlDialog + +::method initDialog unguarded + expose threadsStarted processes + +--say 'ProgressBarDlg::initDialog() ENTER' + reply 0; + threadsStarted = 0 + processes = .array~of('animateProgressA', 'animateProgressB', 'animateProgressC', - + 'animateProgressD', 'animateProgressE') + self~activateThreads +--say 'ProgressBarDlg::initDialog() LEAVE' + + +-- This message is sent to us by the owner dialog, the .NewControlsDialog dialog +-- to notify us that we are about to become visible. We use the notification to +-- start the progress bar animation threads. +::method activateThreads unguarded + expose threadsStarted processes + use arg propSheet + + reply 0 + + -- If no threads are running, start a thread to run each progress bar + -- asynchronously. + if threadsStarted < 1 then do + threadsStarted = processes~items + do methodName over processes + self~start(methodName) + end + end + +-- This is the generic method that simulates some type of processing that takes +-- a long time. The progress of this processing is displayed by the progress +-- bar. to simulate a process of which the progress is displayed by a progress bar */ +::method animateProgress unguarded + use arg progressBar, label, step, iterations, tsleep + + progressBar~setRange(0, iterations * step) + progressBar~setStep(step) + do i = 1 to iterations + progressBar~step + if (iterations * step == 100) then label~setText(i * step "%") + else label~setText(i * step) + + call msSleep tsleep + if \ self~isDialogActive then return + end + +::method tabPageKillActive unguarded + use strict arg owner, tab + --say 'ProgressBarDlg::tabPageKillActive owner:' owner 'returning false' + return .true + +::method tabPageSetActive unguarded + use arg owner, tab + reply 0 + self~activateThreads + +-- The following 5 methods are started asynchronously to animate the progress +-- bars. +::method animateProgressA unguarded + expose threadsStarted pbA labelA + + if \ pbA~isA(.ProgressBar) then do + pbA = self~newProgressBar(IDC_PBAR_PROCESSA) + labelA = self~newStatic(IDC_ST_PERCENTA) + end + + self~animateProgress(pbA, labelA, 5, 20, 600) + threadsStarted -= 1 + +::method animateProgressB unguarded + expose threadsStarted pbB labelB + + if \ pbB~isA(.ProgressBar) then do + pbB = self~newProgressBar(IDC_PBAR_PROCESSB) + labelB = self~newStatic(IDC_ST_PERCENTB) + end + + self~animateProgress(pbB, labelB, 1, 100, 150) + threadsStarted -= 1 + +::method animateProgressC unguarded + expose threadsStarted pbC labelC + + if \ pbC~isA(.ProgressBar) then do + pbC = self~newProgressBar(IDC_PBAR_PROCESSC) + labelC = self~newStatic(IDC_ST_PERCENTC) + end + + self~animateProgress(pbC, labelC, 2, 50, 200) + threadsStarted -= 1 + +::method animateProgressD unguarded + expose threadsStarted pbD labelD + + if \ pbD~isA(.ProgressBar) then do + pbD = self~newProgressBar(IDC_PBAR_PROCESSD) + labelD = self~newStatic(IDC_ST_PERCENTD) + end + + self~animateProgress(pbD, labelD, 10, 40, 300) + threadsStarted -= 1 + +::method animateProgressE unguarded + expose threadsStarted pbE labelE + + if \ pbE~isA(.ProgressBar) then do + pbE = self~newProgressBar(IDC_PBAR_PROCESSE) + labelE = self~newStatic(IDC_ST_PERCENTE) + end + + self~animateProgress(pbE, labelE, 20, 50, 500) + threadsStarted -= 1 + + +::class 'TrackBarDlg' subclass ResControlDialog + +::method initDialog + expose font1 trackBars tbLabels +-- say "TrackBarDlg::initDialog ENTER" + -- As we initialize each track bar we'll stash the Rexx object in a table + -- for easy access later, indexed by its numeric resource id. The same + -- thing is done for the static control that is the label for the track bar. + trackBars = .table~new + tbLabels = .table~new + + -- For the horizonatal track bars we'll use a big font for the label. + font1 = self~CreateFontEx("Arial", 24, "BOLD") + + -- The symbolic IDs for the track bars / labels are named after the style + -- of the track bar. Vertical or horizontal and where the ticks are placed. + + -- Initialize the horizontal track bar with ticks on the bottom. + tb = self~newTrackBar(IDC_TB_HORZ_BOTTOM) + label = self~newStatic(IDC_ST_HORZ_BOTTOM) + + tb~setTickFrequency(10) + tb~setPos(20, .true) + label~setText(20) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_BOTTOM] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the horizontal track bar with ticks on the top. + tb = self~newTrackBar(IDC_TB_HORZ_TOP) + label = self~newStatic(IDC_ST_HORZ_TOP) + + tb~initRange(0, 200) + tb~setTickFrequency(50) + tb~setPos(40, .true) + label~setText(40) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_TOP] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the horizontal track bar with ticks on the both sides. + tb = self~newTrackBar(IDC_TB_HORZ_BOTH) + label = self~newStatic(IDC_ST_HORZ_BOTH) + + tb~initSelRange(20, 60) + tb~setTickFrequency(10) + tb~setPos(80, .true) + label~setText(80) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_BOTH] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the right. + tb = self~newTrackBar(IDC_TB_VERT_RIGHT) + label = self~newStatic(IDC_ST_VERT_RIGHT) + + tb~setTickFrequency(10) + tb~setPos(30, .true) + label~setText(30) + + id = self~constDir[IDC_TB_VERT_RIGHT] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the left. + tb = self~newTrackBar(IDC_TB_VERT_LEFT) + label = self~newStatic(IDC_ST_VERT_LEFT) + + tb~setTickFrequency(10) + tb~initRange(0,400) + tb~setLineStep(5) + tb~setPageStep(50) + tb~setPos(90, .true) + label~setText(90) + + id = self~constDir[IDC_TB_VERT_LEFT] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the both sides. + tb = self~newTrackBar(IDC_TB_VERT_BOTH) + label = self~newStatic(IDC_ST_VERT_BOTH) + + tb~setTickFrequency(5) + tb~setPos(70, .true) + label~setText(70) + + id = self~constDir[IDC_TB_VERT_BOTH] + trackBars[id] = tb + tbLabels[id] = label + + -- Connect the event notification that is sent when a track bar is moved to + -- the onEndTrack() method. That method will update the text label for the + -- track bar with the new postition. + self~connectTrackBarEvent(IDC_TB_HORZ_BOTH, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_HORZ_TOP, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_HORZ_BOTTOM, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_RIGHT, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_LEFT, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_BOTH, "EndTrack", "onEndTrack") + +-- say "TrackBarDlg::initDialog LEAVE" + + +-- Update the static contol that shows the position for a slider when the +-- user is done moving it. +::method onEndTrack + expose trackBars tbLabels + use arg code, hwndTrackBar + + -- hwndTrackBar is the handle to the track bar that was moved. Get its + -- resource ID and use that as an index into the table of track bar objects + -- and the table of the labels. + id = self~getControlID(hwndTrackBar) + tbLabels[id]~setText(trackBars[id]~pos) + +-- We use the leaving() method to clean up (delete) the font we created. In +-- this program there is really no need to do this. As soon as the interpreter +-- terminates, the OS cleans up the resources automatically. The only time +-- cleaning up resources makes sense is in a long-running program that creates +-- and ends a lot of dialogs. Then, over time, the memory usge of the program +-- would keep growing. +::method leaving + expose font1 + self~deleteFont(font1) + + + +::class 'TabDlg' subclass ResControlDialog + +::method initDialog + expose font2 font3 imageList iconsRemoved needWrite + + -- Set the iconsRemoved and needWrite to false. These flags are used in + -- the OnDrawTabRect() method. + iconsRemoved = .false + needWrite = .false + + -- Connect the draw event of the owner-drawn button. This is sent when the + -- button needs to be drawn. Then connect the selection changed event of the + -- tab control. This is sent when the user clicks on a different tab. + self~connectDraw(IDC_PB_OWNERDRAW, "onDrawTabRect") + self~connectTabEvent(IDC_TAB_MAIN, "SELCHANGE", "onTabSelChange") + + tc = self~newTab(IDC_TAB_MAIN) + if tc == .nil then return + + -- Create a font used to display the name of the color in the owner-drawn + -- button. Create another font used to display some informative text. + font2 = self~createFontEX("Arial", 48, "BOLD ITALIC") + font3 = self~createFontEx("Arial", 16, "BOLD") + + -- Add all the tabs, including the index into the image list for an icon for + -- each tab. + tc~AddFullSeq("Red", 0, ,"Green", 1, , "Moss", 2, , "Blue", 3, , "Purple", 4, , "Cyan", 5, , "Gray", 6) + + -- Create a COLORREF (pure white) and load our bitmap. The bitmap is a + -- series of 16x16 images, each one a colored letter. + cRef = .Image~colorRef(255, 255, 255) + image = .Image~getImage(.application~srcDir"rc\TabOwnerDemoTab.bmp") + + -- Create our image list, as a masked image list. + flags = 'COLOR24 MASK' + imageList = .ImageList~create(.Size~new(16, 16), flags, 10, 0) + if \image~isNull, \imageList~isNull then do + -- The bitmap is added and the image list deduces the number of images + -- from the width of the bitmap. For each image, the image list creates a + -- mask using the color ref. In essence, the mask is used to turn each + -- white pixel in the image to transparent. In this way, only the letter + -- part of the image shows and the rest of the image lets the under-lying + -- color show through. + imageList~addMasked(image, cRef) + tc~setImageList(imageList) + + -- The image list makes a copy of each image added to it. So, we can now + -- release the original image to free up some small amount of system + -- resoureces. + image~release + end + else do + iconsRemoved = .true + end + + -- Have the tab control calculate its display area's size and position. + r = tc~windowRect + tc~calcDisplayRect(r) + s = .Size~new(r~right - r~left, r~bottom - r~top) + + -- Get the owner draw push button. We'll resize and position it so that it + -- completely takes up the display area of the tab control. + pb = self~newPushButton(IDC_PB_OWNERDRAW) + + -- Map the display area's position on the screen, to the client co-ordinates + -- of this control dialog. + p = .Point~new(r~left, r~top) + self~screen2client(p) + + -- Now resize and reposition the button so it exactly over-lays the display + -- area of the tab control. We specify that the tab control window is behind + -- the button and use the flag that prevents the button's owner window, this + -- z-order from changing. This leaves the tab control on top of the dialog, + -- and our push button on top of the tab control. Which of course is what we + -- want. + pb~setWindowPos(tc~hwnd, p~x, p~y, s~width, s~height, "SHOWWINDOW NOOWNERZORDER") + + + +-- When a new tab is selected, we have the owner-drawn button update itself. +-- This causes the button to redraw and the onDrawTabRect() method gets invoked, +-- which actually does the drawing. +::method onTabSelChange + button = self~newPushButton(IDC_PB_OWNERDRAW) + button~update + + +-- Fill the owner-drawn button with the color matching the tab's label and write +-- the name of the color. +::method onDrawTabRect + expose font2 font3 imageList iconsRemoved needWrite + use arg id + + button = self~newPushButton(id) + if button == .nil then return + tc = self~newTab(IDC_TAB_MAIN) + if tc == .nil then return + + -- Each time the 'Gray' tab is selected, we remove the tab icons. Then, when + -- one of the other tabs is selected we set the image list back. + currentTab = tc~selected + if currentTab == 'Gray' then do + tc~setImageList(.nil) + iconsRemoved = .true + needWrite = .true + end + else do + if iconsRemoved then do + tc~setImageList(imageList) + iconsRemoved = .false + needWrite = .true + end + end + + -- Get the button's device context, create pen and brush, and assign pen, + -- brush and font to the device context. + dc = button~getDC + pen = button~createPen(1, "SOLID", 0) + brush = button~createBrush(tc~SelectedIndex + 1) + + oldPen = button~objectToDc(dc, pen) + oldBrush = button~objectToDc(dc, brush) + oldFont = button~fontToDC(dc, font2) + button~transparentText(dc) + + -- Draw a filled in rectangle, with a border of 5 around it, and write text. + size = button~getRealSize + button~rectangle(dc, 5, 5, size~width - 5, size~height - 5, "FILL") + button~writeDirect(dc, trunc(size~width / 4), trunc(size~height / 4), tc~Selected) + + -- Add informative text if needed. + if needWrite then do + button~fontToDC(dc, font3) + x = trunc(size~width / 4) + y = trunc(size~height / 2) + + if currentTab == 'Gray' then + button~writeDirect(dc, x, y, "(Tab icons are removed)") + else + button~writeDirect(dc, x, y, "(Tab icons are restored)") + needWrite = .false + end + + -- Restore pen, brush, and font, then release the device context. + button~objectToDc(dc, oldPen) + button~objectToDc(dc, oldBrush) + button~fontToDC(dc, oldFont) + button~opaqueText(dc) + + button~deleteObject(pen) + button~deleteObject(brush) + button~freeDC(dc) + +-- We use the leaving() method to clean up (delete) the fonts and the image list +-- we created. In this program there is really no need to do this. As soon as +-- the interpreter terminates, the OS cleans up the resources automatically. +-- The only time cleaning up resources makes sense is in a long-running program +-- that creates and ends a lot of dialogs. Then, over time, the memory usge of +-- the program would keep growing. +::method leaving + expose font2 font3 imageList + + self~deleteFont(font2) + self~deleteFont(font3) + imageList~release + +::method tabPageSetActive unguarded + use arg owner + reply 0 + + + + +::class 'BlankDlg' subclass ResControlDialog + +::method initDialog + self~connectHelp(onHelp) + +::method onHelp unguarded +--say 'Got onHelp hwnd' self~hwnd diff --git a/modules/windows/oodialog/propertysheet.tabControls/UserTabDemo.rex b/modules/windows/oodialog/propertysheet.tabControls/UserTabDemo.rex new file mode 100755 index 0000000..06d51e1 --- /dev/null +++ b/modules/windows/oodialog/propertysheet.tabControls/UserTabDemo.rex @@ -0,0 +1,666 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * UserTabDemo.rex + */ + sd = locate() + .application~useGlobalConstDir('O', sd'rc\UserTabDemo.h') + .application~autoDetection(.false) + .application~defaultFont('Tahoma', 10) + + .constDir[IDC_TAB_MAIN] = 500 + + dlg = .UserTabDialog~new + dlg~execute + +::requires 'ooDialog.cls' + +::class 'UserTabDialog' public subclass UserDialog + +::method init + expose pages descriptions + + self~init:super + + descriptions = self~getDescriptions + + title = "Acme Health Clinic Patient Intake Form Version 1.00.0" + opts = 'MINIMIZEBOX MAXIMIZEBOX' + + if self~createCenter(500, 265, title, opts) then self~initCode = 0 + else self~initCode = 1 + + pages = .array~new(4) + + return self~initCode + + +::method defineDialog + + self~createPushButton(IDOK, 380, 240, 50, 15, "DEFAULT", 'O&k') + self~createPushButton(IDCANCEL, 440, 240, 50, 15, , '&Cancel') + + self~createTab(IDC_TAB_MAIN, 10, 10, 480, 220, 'FIXED FOCUSDOWN') + + self~connectTabEvent(IDC_TAB_MAIN, SELCHANGE, onSelChange) + + +::method initDialog unguarded + expose tab patientDlg contactsDlg insuranceDlg historyDlg dlgRect displayRect isPositioned + + self~connectKeyPress(Cancel, .VK~F3, "NONE" ) + self~connectKeyPress(Cancel, .VK~F3, "SHIFT") + + tab = self~newTab(IDC_TAB_MAIN) + + tabs = .array~of("Patient", "Contacts", "Insurance", "History") + do t over tabs + tab~insert( , t) + end + + tab~setSize(160,28) + + dlgRect = self~calcPageSize + displayRect = self~getDisplayRect + + isPositioned = .array~of(.false, .false, .false, .false) + + self~activatePatient + + +::method calcPageSize private + expose tab + + r = tab~windowRect + tab~calcDisplayRect(r) + + -- r is now the bounding rectangle of the display area of the tab control. + -- We want to convert this to a point size rectangle, in dialog units. The + -- different page dialogs will use this rectangle to set their initial size. + r~right = r~right - r~left + r~bottom = r~bottom - r~top + self~pixel2dlgUnit(r) + + return r + + +::method getDisplayRect private + expose tab + + r = tab~windowRect; + tab~calcDisplayRect(r); + + s = .Size~new(r~right - r~left, r~bottom - r~top) + + p = .Point~new(r~left, r~top) + self~screen2client(p) + + return .Rect~new(p~x, p~y, s~width, s~height) + + +::method onSelChange unguarded + expose tab patientDlg contactsDlg insuranceDlg historyDlg displayRect + + tabName = tab~selected + + select + when tabName == "Patient" then self~select(1) + when tabName == "Contacts" then self~select(2) + when tabName == "Insurance" then self~select(3) + when tabName == "History" then self~select(4) + otherwise nop + end + + +::method select private unguarded + expose tab patientDlg contactsDlg insuranceDlg historyDlg displayRect isPositioned dlgShowing + use arg page + + select + when page == 1 then do + dlgShowing~hideFast + patientDlg~showFast + dlgShowing = patientDlg + dlgShowing~update + end + + when page == 2 then do + if \ contactsDlg~isA(.PlainBaseDialog) then do + self~activateContacts + return + end + + dlgShowing~hideFast + + if \ isPositioned[page] then do + contactsDlg~setWindowPos(tab~hwnd, displayRect, "SHOWWINDOW NOREDRAW NOOWNERZORDER") + isPositioned[page] = .true + end + else do + contactsDlg~showFast + end + + dlgShowing = contactsDlg + dlgShowing~update + end + + when page == 3 then do + if \ insuranceDlg~isA(.PlainBaseDialog) then do + self~activateInsurance + return + end + + dlgShowing~hideFast + + if \ isPositioned[page] then do + insuranceDlg~setWindowPos(tab~hwnd, displayRect, "SHOWWINDOW NOREDRAW NOOWNERZORDER") + isPositioned[page] = .true + end + else do + insuranceDlg~showFast + end + + dlgShowing = insuranceDlg + dlgShowing~update + end + + when page == 4 then do + if \ historyDlg~isA(.PlainBaseDialog) then do + self~activateHistory + return + end + + dlgShowing~hideFast + + if \ isPositioned[page] then do + historyDlg~setWindowPos(tab~hwnd, displayRect, "SHOWWINDOW NOREDRAW NOOWNERZORDER") + isPositioned[page] = .true + end + else do + historyDlg~showFast + end + + dlgShowing = historyDlg + dlgShowing~update + end + + otherwise nop + end + -- End select + + return 0 + + +::method initialShowDlg unguarded + expose patientDlg tab displayRect isPositioned dlgShowing + + patientDlg~setWindowPos(tab~hwnd, displayRect, "SHOWWINDOW NOOWNERZORDER") + isPositioned[1] = .true + dlgShowing = patientDlg + + +::method activatePatient private unguarded + expose patientDlg dlgRect pages + + patientDlg = .PatientDlg~new(dlgRect, self) + patientDlg~execute + + pages[1] = patientdlg + + -- .01 seconds == 10000 microseconds + .Alarm~new(.TimeSpan~fromMicroseconds(20000), .message~new(self, "initialShowDlg")) + + +::method activateContacts private unguarded + expose contactsDlg dlgRect pages + + reply + + contactsDlg = .ContactsDlg~new(dlgRect, self) + contactsDlg~execute + + pages[2] = contactsDlg + + self~postOnSelChange(10) + + +::method activateInsurance private unguarded + expose insuranceDlg dlgRect pages + + reply + + insuranceDlg = .InsuranceDlg~new(dlgRect, self) + insuranceDlg~execute + + pages[3] = insuranceDlg + + self~postOnSelChange(10) + + +::method activateHistory private unguarded + expose historyDlg dlgRect pages descriptions + + reply + + historyDlg = .HistoryDlg~new(dlgRect, self, descriptions) + historyDlg~execute + + pages[4] = historyDlg + + self~postOnSelChange(10) + + +::method postOnSelChange private unguarded + use strict arg microseconds + + .Alarm~new(.TimeSpan~fromMicroseconds(microseconds), .message~new(self, "onSelChange")) + + +::method ok unguarded + expose pages + + do page over pages + if page \== .nil then page~endExecution(.true) + end + + return self~ok:super + + +/** cancel() + * + * A problem can happen if the user hits cancel immediately after selecting the + * History tab. The initDialog() method may be still executing and a syntax + * condition can be raised if the underlying Windows dialog is ended. To + * prevent this we check for that condition and sleep a little bit if it + * happens. + */ +::method cancel unguarded + expose pages + + do page over pages + if page \== .nil then do + if page~isA(.HistoryDlg), \ page~initDialogDone then do while \ page~initDialogDone + j = SysSleep(.5) + end + page~endExecution(.false) + end + end + return self~cancel:super + + +::method getDescriptions private + + d = .array~new + d[ 1] = 'Hearing loss / ringing in ears' + d[ 2] = 'Heart diease / circulatory proplems' + d[ 3] = 'Liver cancer / lung cancer' + d[ 4] = 'Breast cancer / uterine cancer' + d[ 5] = 'Jaundice, hepatitis' + d[ 6] = 'Kidney stones / kidney failure' + d[ 7] = 'High blood pressure / high chorlosterol' + d[ 8] = 'Gall bladder trouble (gallstones)' + d[ 9] = 'Anemia/blood disorder' + d[10] = 'Sugar or albumin in urine' + d[11] = 'Frequent or severe headache' + d[12] = 'Periods of unconsciousness' + d[13] = 'Chronic or frequent colds' + d[14] = 'Loss of memory or amnesia' + d[15] = 'Depression or excessive worry' + d[16] = 'Car, train, sea or air sickness' + + return d + + + +::class 'PatientDlg' subclass UserControlDialog + +::method init + use arg r, parent + + self~init:super( , , parent) + self~create(r~left, r~top, r~right, r~bottom) + +::method defineDialog + + self~createGroupBox( IDC_STATIC, 5, 5, 244, 65, , "Patient" ) + self~createStaticText( IDC_STATIC, 14, 16, 95, 8, LEFT , "Name (Last, First, Middle):" ) + self~createEdit( IDC_EDIT_NAME, 14, 26, 110, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 136, 16, 105, 8, LEFT , "Also known as / Maiden name:" ) + self~createEdit( IDC_EDIT_AKA, 136, 26, 105, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 14, 43, 48, 8, LEFT , "Date of birth:" ) + self~createEdit( IDC_EDIT_DOB1, 14, 53, 17, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 33, 55, 8, 8, CENTER , "/" ) + self~createEdit( IDC_EDIT_DOB2, 44, 53, 17, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 64, 55, 8, 8, CENTER , "/" ) + self~createEdit( IDC_EDIT_DOB3, 74, 53, 17, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 102, 43, 22, 8, LEFT , "Age:" ) + self~createEdit( IDC_EDIT_AGE, 102, 53, 22, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 136, 43, 86, 8, LEFT , "Social Security Number:" ) + self~createEdit( IDC_EDIT_SSN1, 136, 53, 19, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 195, 54, 8, 8, CENTER , "-" ) + self~createEdit( IDC_EDIT_SSN2, 172, 53, 19, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 159, 54, 8, 8, CENTER , "-" ) + self~createEdit( IDC_EDIT_SSN3, 209, 53, 31, 12, AUTOSCROLLH NUMBER ) + self~createGroupBox( IDC_STATIC, 258, 6, 35, 37, , "Sex" ) + self~createRadioButton( IDC_RB_M, 269, 16, 15, 8, GROUP TAB , "M" ) + self~createRadioButton( IDC_RB_F, 269, 30, 15, 8, , "F" ) + self~createGroupBox( IDC_STATIC, 311, 6, 159, 37, , "Language" ) + self~createRadioButton( IDC_RB_CHINESE, 322, 16, 39, 8, GROUP TAB , "Chinese" ) + self~createRadioButton( IDC_RB_ENGLISH, 322, 30, 39, 8, , "English" ) + self~createRadioButton( IDC_RB_FRENCH, 374, 16, 39, 8, , "French" ) + self~createRadioButton( IDC_RB_GERMAN, 374, 30, 39, 8, , "German" ) + self~createRadioButton( IDC_RB_SPANISH, 422, 16, 39, 8, , "Spanish" ) + self~createRadioButton( IDC_RB_OTHER, 422, 30, 39, 8, , "Other" ) + self~createStaticText( IDC_STATIC, 258, 54, 30, 8, LEFT , "Religon:" ) + self~createEdit( IDC_EDIT_RELIGON, 289, 53, 72, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 373, 54, 30, 8, LEFT , "Church:" ) + self~createEdit( IDC_EDIT_CHURCH, 405, 53, 61, 12, AUTOSCROLLH ) + self~createGroupBox( IDC_STATIC, 5, 75, 184, 37, , "Race" ) + self~createRadioButton( IDC_RB_AFRICAN_AMERICAN, 14, 84, 68, 8, GROUP TAB , "African American" ) + self~createRadioButton( IDC_RB_NATIVE_AMERICAN, 14, 98, 68, 8, , "Native American" ) + self~createRadioButton( IDC_RB_ASIAN, 91, 84, 39, 8, , "Asian" ) + self~createRadioButton( IDC_RB_CAUCASIAN, 91, 98, 47, 8, , "Caucasian" ) + self~createRadioButton( IDC_RB_HISPANIC, 146, 84, 39, 8, , "Hispanic" ) + self~createRadioButton( IDC_RB_OTHER_RACE, 146, 98, 39, 8, , "Other" ) + self~createGroupBox( IDC_STATIC, 204, 75, 265, 37, , "Marital Status" ) + self~createRadioButton( IDC_RB_MARRIED, 214, 84, 41, 8, GROUP TAB , "Married" ) + self~createRadioButton( IDC_RB_SINGLE, 214, 98, 41, 8, , "Single" ) + self~createRadioButton( IDC_RB_NEVER_MARRIED, 269, 84, 65, 8, , "Never Married" ) + self~createRadioButton( IDC_RB_LEGALLY_SEPARATED, 269, 98, 73, 8, , "Legally Separated" ) + self~createRadioButton( IDC_RB_LIFEPARTNER, 351, 83, 53, 8, , "Life Partner" ) + self~createRadioButton( IDC_RB_DIVORCED, 415, 83, 48, 8, , "Divorced" ) + self~createRadioButton( IDC_RB_WIDOWED, 351, 98, 54, 8, , "Widowed" ) + self~createRadioButton( IDC_RB_OTHER_MARITAL, 415, 98, 39, 8, , "Other" ) + self~createGroupBox( IDC_STATIC, 5, 119, 144, 77, , "Address" ) + self~createStaticText( IDC_STATIC, 12, 132, 24, 8, RIGHT , "Street:" ) + self~createEdit( IDC_EDIT_PATIENT_ADDRESS, 38, 130, 107, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 12, 148, 24, 8, RIGHT , "City:" ) + self~createEdit( IDC_EDIT_PATIENT_CITY, 38, 146, 63, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 105, 148, 24, 8, RIGHT , "State:" ) + self~createEdit( IDC_EDIT_PATIENT_STATE, 131, 146, 13, 12, AUTOSCROLLH UPPERCASE ) + self~createStaticText( IDC_STATIC, 12, 164, 24, 8, RIGHT , "Zip:" ) + self~createEdit( IDC_EDIT_PATIENT_ZIP, 38, 162, 26, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 77, 164, 24, 8, RIGHT , "Email:" ) + self~createEdit( IDC_EDIT_EMAIL, 103, 162, 42, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 12, 180, 24, 8, RIGHT , "Phone:" ) + self~createEdit( IDC_EDIT_PATIENT_PHONE, 38, 178, 35, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 77, 180, 24, 8, RIGHT , "Cell:" ) + self~createEdit( IDC_EDIT_PATIENT_CELL, 103, 178, 42, 12, AUTOSCROLLH NUMBER ) + self~createGroupBox( IDC_STATIC, 165, 119, 208, 77, , "Employment" ) + self~createStaticText( IDC_STATIC, 168, 132, 34, 8, RIGHT , "Employer:" ) + self~createEdit( IDC_EDIT_EMPLOYER, 206, 130, 100, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 168, 147, 34, 8, RIGHT , "Street:" ) + self~createEdit( IDC_EDIT_EMPLOYER_STREET, 206, 145, 100, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 168, 163, 34, 8, RIGHT , "City:" ) + self~createEdit( IDC_EDIT_EMPLOYER_CITY, 206, 161, 60, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 269, 163, 21, 8, RIGHT , "State:" ) + self~createEdit( IDC_EDIT_EMPLOYER_STATE, 293, 161, 13, 12, AUTOSCROLLH UPPER ) + self~createStaticText( IDC_STATIC, 168, 180, 34, 8, RIGHT , "Zip:" ) + self~createEdit( IDC_EDIT_EMPLOYER_ZIP, 206, 178, 26, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 307, 133, 24, 8, RIGHT , "Phone:" ) + self~createEdit( IDC_EDIT_EMPLOYER_PHONE, 333, 131, 35, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 307, 147, 24, 8, RIGHT , "Ext:" ) + self~createEdit( IDC_EDIT_EMPLOYER_EXT, 333, 145, 35, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 238, 180, 43, 8, RIGHT , "Occupation:" ) + self~createEdit( IDC_EDIT_OCCUPATION, 283, 178, 84, 12, AUTOSCROLLH ) + self~createGroupBox( IDC_STATIC, 385, 119, 85, 77, , "Primary Care" ) + self~createStaticText( IDC_STATIC, 395, 132, 66, 8, LEFT , "Primary Physician:" ) + self~createEdit( IDC_EDIT_PHYSICIAN, 395, 145, 71, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 388, 163, 66, 8, RIGHT , "Phone - Extension:" ) + self~createEdit( IDC_EDIT_PHYSICIAN_PHONE, 395, 178, 71, 12, AUTOSCROLLH NUMBER ) + + + +::class 'ContactsDlg' subclass UserControlDialog + +::method init + use arg r, parent + + self~init:super( , , parent) + self~create(r~left, r~top, r~right, r~bottom) + +::method defineDialog + + self~createGroupBox( IDC_STATIC, 5, 5, 244, 192, , "Guarantor" ) + self~createStaticText( IDC_STATIC, 14, 16, 95, 8, LEFT , "Guarantor Name: " ) + self~createEdit( IDC_EDIT_NAME_G, 14, 26, 110, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 136, 16, 105, 8, LEFT , "Relationship to patient:" ) + self~createEdit( IDC_EDIT_RELATION_G, 136, 26, 105, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 14, 43, 48, 8, LEFT , "Date of birth:" ) + self~createEdit( IDC_EDIT_DOB1_G, 14, 53, 17, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 33, 55, 8, 8, CENTER , "/" ) + self~createEdit( IDC_EDIT_DOB2_G, 44, 53, 17, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 64, 55, 8, 8, CENTER , "/" ) + self~createEdit( IDC_EDIT_DOB3_G, 74, 53, 17, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 102, 43, 22, 8, LEFT , "Age:" ) + self~createEdit( IDC_EDIT_AGE_G, 102, 53, 22, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 136, 43, 86, 8, LEFT , "Social Security Number:" ) + self~createEdit( IDC_EDIT_SSN1_G, 136, 53, 19, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 195, 54, 8, 8, CENTER , "-" ) + self~createEdit( IDC_EDIT_SSN2_G, 172, 53, 19, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 159, 54, 8, 8, CENTER , "-" ) + self~createEdit( IDC_EDIT_SSN3_G, 209, 53, 31, 12, AUTOSCROLLH NUMBER ) + self~createGroupBox( IDC_STATIC, 6, 76, 35, 45, , "Sex" ) + self~createRadioButton( IDC_RB_M_G, 17, 87, 15, 8, GROUP TAB , "M" ) + self~createRadioButton( IDC_RB_F_G, 17, 103, 15, 8, , "F" ) + self~createGroupBox( IDC_STATIC, 44, 76, 198, 45, , "Guarantor Employment" ) + self~createStaticText( IDC_STATIC, 47, 89, 41, 8, RIGHT , "Employer:" ) + self~createEdit( IDC_EDIT_EMPLOYER_G, 91, 87, 100, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 47, 105, 41, 8, RIGHT , "Occupation:" ) + self~createEdit( IDC_EDIT_OCCUPATION_G, 91, 103, 100, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 202, 90, 24, 8, RIGHT , "Phone:" ) + self~createEdit( IDC_EDIT_EMPLOYER_PHONE_G, 202, 103, 35, 12, AUTOSCROLLH NUMBER ) + self~createGroupBox( IDC_STATIC, 44, 127, 198, 70, , "Guarantor Address" ) + self~createStaticText( IDC_STATIC, 64, 140, 24, 8, RIGHT , "Street:" ) + self~createEdit( IDC_EDIT_ADDRESS_G, 91, 138, 143, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 64, 156, 24, 8, RIGHT , "City:" ) + self~createEdit( IDC_EDIT_CITY_G, 90, 154, 59, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 152, 156, 20, 8, RIGHT , "State:" ) + self~createEdit( IDC_EDIT_STATE_G, 175, 154, 13, 12, AUTOSCROLLH UPPER ) + self~createStaticText( IDC_STATIC, 189, 156, 15, 8, RIGHT , "Zip:" ) + self~createEdit( IDC_EDIT_ZIP_G, 207, 154, 26, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 64, 172, 24, 8, RIGHT , "Phone:" ) + self~createEdit( IDC_EDIT_PHONE_G, 90, 170, 51, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 148, 172, 24, 8, RIGHT , "Cell:" ) + self~createEdit( IDC_EDIT_CELL_G, 175, 170, 58, 12, AUTOSCROLLH NUMBER ) + self~createGroupBox( IDC_STATIC, 265, 5, 205, 91, , "Emergency Contact" ) + self~createStaticText( IDC_STATIC, 274, 16, 77, 8, LEFT , "Name: " ) + self~createEdit( IDC_EDIT_NAME_EC, 274, 26, 110, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 274, 43, 77, 8, LEFT , "Relationship to patient:" ) + self~createEdit( IDC_EDIT_RELATION_EC, 274, 53, 110, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 274, 69, 41, 8, LEFT , "Employer:" ) + self~createEdit( IDC_EDIT_EMPLOYER_EC, 274, 78, 110, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 391, 16, 66, 8, LEFT , "Phone:" ) + self~createEdit( IDC_EDIT_PHONE_EC, 391, 26, 71, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 391, 43, 66, 8, LEFT , "Cell Phone:" ) + self~createEdit( IDC_EDIT_CELL_EC, 391, 53, 71, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 391, 69, 66, 8, RIGHT , "Employment Phone:" ) + self~createEdit( IDC_EDIT_EMPLOYER_PHONE_EC, 391, 78, 71, 12, AUTOSCROLLH NUMBER ) + self~createGroupBox( IDC_STATIC, 265, 106, 205, 91, , "Next of Kin" ) + self~createStaticText( IDC_STATIC, 274, 117, 77, 8, LEFT , "Name: " ) + self~createEdit( IDC_EDIT_NAME_NOK, 274, 127, 110, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 274, 144, 77, 8, LEFT , "Relationship to patient:" ) + self~createEdit( IDC_EDIT_RELATION_NOK, 274, 154, 110, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 274, 170, 41, 8, LEFT , "Employer:" ) + self~createEdit( IDC_EDIT_EMPLOYER_NOK, 274, 179, 110, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 391, 117, 66, 8, LEFT , "Phone:" ) + self~createEdit( IDC_EDIT_PHONE_NOK, 391, 127, 71, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 391, 144, 66, 8, LEFT , "Cell Phone:" ) + self~createEdit( IDC_EDIT_CELL_NOK, 391, 154, 71, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 391, 170, 66, 8, RIGHT , "Employment Phone:" ) + self~createEdit( IDC_EDIT_EMPLOYER_PHONE_NOK, 391, 179, 71, 12, AUTOSCROLLH NUMBER ) + + + + +::class 'InsuranceDlg' subclass UserControlDialog + +::method init + use arg r, parent + + self~init:super( , , parent) + self~create(r~left, r~top, r~right, r~bottom) + + +::method defineDialog + + self~createGroupBox( IDC_STATIC, 5, 5, 225, 192, , "Primary Insurance" ) + self~createStaticText( IDC_STATIC, 28, 16, 95, 8, LEFT , "Insurance Company Name: " ) + self~createEdit( IDC_EDIT_NAME_PI, 28, 26, 110, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 152, 16, 65, 8, LEFT , "Group" ) + self~createEdit( IDC_EDIT_GROUP_PI, 152, 26, 65, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 28, 43, 48, 8, LEFT , "Effectiv Date:" ) + self~createEdit( IDC_EDIT_DATE1_PI, 28, 53, 17, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 47, 55, 8, 8, CENTER , "/" ) + self~createEdit( IDC_EDIT_DATE2_PI, 58, 53, 17, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 78, 55, 8, 8, CENTER , "/" ) + self~createEdit( IDC_EDIT_DATE3_PI, 88, 53, 17, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 124, 43, 65, 8, LEFT , "Certificate Number:" ) + self~createEdit( IDC_EDIT_CERTIFICATE_PI, 124, 53, 93, 12, AUTOSCROLLH NUMBER ) + self~createGroupBox( IDC_STATIC, 20, 138, 198, 58, , "Subscriber" ) + self~createStaticText( IDC_STATIC, 23, 150, 41, 8, RIGHT , "Name:" ) + self~createEdit( IDC_EDIT_SUBSCRIBER_PI, 67, 148, 144, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 23, 166, 41, 8, RIGHT , "Employer:" ) + self~createEdit( IDC_EDIT_EMPLOYER_PI, 67, 164, 144, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 23, 184, 78, 8, RIGHT , "Relationship to patient:" ) + self~createEdit( IDC_EDIT_RELATION_PI, 104, 182, 107, 12, AUTOSCROLLH NUMBER ) + self~createGroupBox( IDC_STATIC, 19, 69, 198, 62, , "Insurance Company Address" ) + self~createStaticText( IDC_STATIC, 28, 82, 35, 8, RIGHT , "Street:" ) + self~createEdit( IDC_EDIT_ADDRESS_PI, 66, 80, 143, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 28, 98, 35, 8, RIGHT , "City:" ) + self~createEdit( IDC_EDIT_CITY_PI, 65, 96, 59, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 127, 98, 20, 8, RIGHT , "State:" ) + self~createEdit( IDC_EDIT_STATE_PI, 150, 96, 13, 12, AUTOSCROLLH UPPER ) + self~createStaticText( IDC_STATIC, 164, 98, 15, 8, RIGHT , "Zip:" ) + self~createEdit( IDC_EDIT_ZIP_PI, 182, 96, 26, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 28, 114, 35, 8, RIGHT , "Phone 1:" ) + self~createEdit( IDC_EDIT_PHONE1_PI, 65, 112, 51, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 116, 114, 31, 8, RIGHT , "Phone 2:" ) + self~createEdit( IDC_EDIT_PHONE2_PI, 150, 112, 58, 12, AUTOSCROLLH NUMBER ) + self~createGroupBox( IDC_STATIC, 245, 5, 225, 192, , "Secondary Insurance" ) + self~createStaticText( IDC_STATIC, 268, 16, 95, 8, LEFT , "Insurance Company Name: " ) + self~createEdit( IDC_EDIT_NAME_SI, 268, 26, 110, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 392, 16, 65, 8, LEFT , "Group" ) + self~createEdit( IDC_EDIT_GROUP_SI, 392, 26, 65, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 268, 43, 48, 8, LEFT , "Effectiv Date:" ) + self~createEdit( IDC_EDIT_DATE1_SI, 268, 53, 17, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 287, 53, 8, 8, CENTER , "/" ) + self~createEdit( IDC_EDIT_DATE2_SI, 298, 53, 17, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 318, 53, 8, 8, CENTER , "/" ) + self~createEdit( IDC_EDIT_DATE3_SI, 328, 53, 17, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 364, 43, 65, 8, LEFT , "Certificate Number:" ) + self~createEdit( IDC_EDIT_CERTIFICATE_SI, 364, 53, 93, 12, AUTOSCROLLH NUMBER ) + self~createGroupBox( IDC_STATIC, 259, 138, 198, 58, , "Subscriber" ) + self~createStaticText( IDC_STATIC, 263, 150, 41, 8, RIGHT, "Name:" ) + self~createEdit( IDC_EDIT_SUBSCRIBER_SI, 307, 148, 144, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 263, 166, 41, 8, RIGHT , "Employer:" ) + self~createEdit( IDC_EDIT_EMPLOYER_SI, 307, 164, 144, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 263, 184, 78, 8, RIGHT , "Relationship to patient:" ) + self~createEdit( IDC_EDIT_RELATION_SI, 343, 182, 107, 12, AUTOSCROLLH NUMBER ) + self~createGroupBox( IDC_STATIC, 259, 69, 198, 62, , "Insurance Company Address" ) + self~createStaticText( IDC_STATIC, 268, 80, 35, 8, RIGHT , "Street:" ) + self~createEdit( IDC_EDIT_ADDRESS_SI, 306, 80, 143, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 268, 96, 35, 8, RIGHT , "City:" ) + self~createEdit( IDC_EDIT_CITY_SI, 305, 96, 59, 12, AUTOSCROLLH ) + self~createStaticText( IDC_STATIC, 367, 96, 20, 8, RIGHT , "State:" ) + self~createEdit( IDC_EDIT_STATE_SI, 390, 96, 13, 12, AUTOSCROLLH UPPER ) + self~createStaticText( IDC_STATIC, 404, 96, 15, 8, RIGHT , "Zip:" ) + self~createEdit( IDC_EDIT_ZIP_SI, 422, 96, 26, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 268, 112, 35, 8, RIGHT , "Phone 1:" ) + self~createEdit( IDC_EDIT_PHONE1_SI, 305, 112, 51, 12, AUTOSCROLLH NUMBER ) + self~createStaticText( IDC_STATIC, 356, 112, 31, 8, RIGHT , "Phone 2:" ) + self~createEdit( IDC_EDIT_PHONE2_SI, 390, 112, 58, 12, AUTOSCROLLH NUMBER ) + + + +::class 'HistoryDlg' subclass UserControlDialog + +::attribute initDialogDone unguarded + +::method init + expose descriptions + use arg r, parent, descriptions + + self~init:super( , , parent) + + self~initDialogDone = .false + self~create(r~left, r~top, r~right, r~bottom) + +::method defineDialog + + gbText = "Indicate if you or anyone in your family has (or has had) any of these conditions:" + st1Txt = "Yourself" + st2Txt = "Family Member" + + self~createGroupBox( IDC_STATIC , 5, 5, 465, 192, , gbText) + self~createStaticText( IDC_STATIC , 6, 17, 229, 10, CENTER , st1Txt) + self~createListView( IDC_LV_SELF , 5, 30, 229, 167, TAB ALIGNLEFT SINGLESEL REPORT ) + self~createStaticText( IDC_STATIC , 241, 17, 229, 10, CENTER , st2Txt) + self~createListView( IDC_LV_FAMILY, 241, 30, 229, 167, TAB ALIGNLEFT SINGLESEL REPORT ) + +::method initDialog unguarded + expose lvSelf lvFamily descriptions + + lvSelf = self~newListView(IDC_LV_SELF) + + lvSelf~addExtendedStyle('CHECKBOXES') + + s = lvSelf~getRealSize + s~width -= (.SM~cxVscroll * 2) + + lvSelf~insertColumnPx(0, "Description", s~width) + + do d over descriptions + lvSelf~addRow( , , d) + end + + lvFamily = self~newListView(IDC_LV_FAMILY) + + lvFamily~addExtendedStyle('CHECKBOXES') + + s = lvFamily~getRealSize + s~width -= (.SM~cxVscroll * 2) + + lvFamily~insertColumnPx(0, "Description", s~width) + + do d over descriptions + lvFamily~addRow( , , d) + end + + self~initDialogDone = .true + diff --git a/modules/windows/oodialog/propertysheet.tabControls/oodListViews.rex b/modules/windows/oodialog/propertysheet.tabControls/oodListViews.rex new file mode 100755 index 0000000..2d2c63d --- /dev/null +++ b/modules/windows/oodialog/propertysheet.tabControls/oodListViews.rex @@ -0,0 +1,1031 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: oodListViews.rex + * Type: Open Object Rexx (ooRexx) example + * Resources: oodListViews.rc, oodListViews1.bmp, oodListViews2.bmp + * + * Description: + * + * Demonstrates the different views possible in the list-view control. Shows + * how to use the ControlDialog class to populate each page in a tab + * control. Demonstrates some other list-view features, such as info tips, + * user item data, in place label editing, drag and drop in icon view, etc.. + * + * + * Note: this program uses the public routine, locate(), to get the full path + * name to the directory this source code file is located. In places, the + * variable holding this value has been callously abbreviated to 'sd' which + * stands for source directory. + * + */ + + srcDir = locate() + .application~useGlobalConstDir("O", srcDir'rc\oodListViews.h') + + dlg = .ListsDialog~new(srcDir"rc\oodListViews.rc", IDD_LISTVIEWS) + + if dlg~initCode <> 0 then do + say "Error instantiating the ListsDialog, aborting" + return 99 + end + + dlg~execute("SHOWTOP") + + return 0 + +::requires "ooDialog.cls" + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + ListsDialog Class - the main (top-level) dialog. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'ListsDialog' subclass RcDialog + +::method init + expose sd + + forward class (super) continue + + if self~initCode <> 0 then return self~initCode + + sd = locate() + + self~createImageLists + self~initRecords + + self~connectButtonEvent(IDC_PB_ADDRECORD, "CLICKED", "onAdd") + self~connectButtonEvent(IDC_PB_EDITRECORD, "CLICKED", "onEdit") + self~connectButtonEvent(IDC_PB_FORWARD, "CLICKED", "onForward") + self~connectButtonEvent(IDC_PB_BACKWARD, "CLICKED", "onBackward") + + self~connectButtonEvent(IDC_CK_INFOTIPS, "CLICKED", onCheckClicked) + + self~connectTabEvent(IDC_TAB, 'SELCHANGE', 'onNewTab') + + +::method initDialog + expose tabControl pageDialog smallIcons normalIcons records pbBackward pbForward ckInfoTips sd + + -- Set the Use Info Tips check box. + ckInfoTips = self~newCheckBox(IDC_CK_INFOTIPS) + ckInfoTips~check + + -- Disable the edit record push button. + self~newPushButton(IDC_PB_EDITRECORD)~disable + + -- Save a reference to the push buttons. + pbBackward = self~newPushButton(IDC_PB_BACKWARD) + pbForward = self~newPushButton(IDC_PB_Forward) + + -- We start on the first page, so going backwards is not possible. + pbBackward~disable + + -- Add the tabs to the tab control. + tabControl = self~newTab(IDC_TAB) + tabControl~addSequence("List", "Report", "Icon", "Small Icon") + + -- Get the display rectangle of the tab control. + displayRect = self~calculateDisplayArea(tabControl) + + -- The tab control is quite wide in relation to the default space the 4 tabs + -- occupy. Make the tabs wide enough to take up a little over 1/2 of the width + -- of the tab control. + w = (displayRect~right * (7 / 12)) % 4 + tabControl~setMinTabWidth(w) + + pageDialog = .PageDialog~new(sd"rc\oodListViews.rc", IDD_PAGE, , , , , self) + pageDialog~useInfoTips = .true + pageDialog~initialize(smallIcons, normalIcons, records) + + -- Use execute() to properly start a ControlDialog. + pageDialog~execute + self~positionAndShow(pageDialog, tabControl, displayRect) + + +/** calculateDisplayArea() + * + * Tab controls contain two areas, the tabs themselves and the display area. + * The display area is where the content for each tab is drawn. + * + * We need to match the control dialog(s) size and position with the display + * area size and position. There are two approaches here: + * + * We could calculate the size of the largest dialog, resize the tab control to + * match, and position the control dialog over the display area. + * + * We can get the size and position of the tab control's display area and resize + * and reposition the control dialog(s) to match. This is the approach we use + * here. + */ +::method calculateDisplayArea private + use strict arg tabControl + + -- Given a rectangle describing the tab control's size and position, the tab + -- control itself will calculate the display area's size and position. + r = tabControl~windowRect + tabControl~calcDisplayRect(r) + + -- Save the size of the display area, we need it later. + s = .Size~new(r~right - r~left, r~bottom - r~top) + + -- Now we need to map the display area's position on the screen, to the client + -- co-ordinates of the main dialog. The control dialog(s) are children windows + -- of the main dialog, which is why we need to use the client-area of the + -- dialog, not the client area of the tab control. + p = .Point~new(r~left, r~top) + self~screen2client(p) + + -- Create our display rectangle. This is used in setWindowPosition(), which + -- takes a point / size rectangle. ooDialog defines a point / size rectangle + -- as using the left and top attributes for the position of the upper left + -- corner of a rectangle, using the right attribute for the width of the + -- rectangle, and using the bottom attribute for the height of the rectangle. + return .Rect~new(p~x, p~y, s~width, s~height) + + +/** positionAndShow() + * + * Used to resize and reposition the control dialog (PageDialog so it occupies + * the display area of the tab control. + */ +::method positionAndShow private + use strict arg dlg, tabControl, displayRect + + -- We can not position the control dialog until the underlying Windows dialog + -- is created and we have a valid window handle. This takes a small but + -- disecernable amount of time. The actual amount of time can vary widely and + -- depends on both the amount of concurrency going on in the interpreter and + -- the amount of multi-tasking going on in the operating system. + -- + -- We don't want to spin forever if there is some error in creating the + -- dialog, so we set a timeout here. However, it is very short and may not be + -- long enough. If it is not long enough, it is better to increase the time + -- sleeping rather than the loop counter. + do i = 1 to 10 + if dlg~hwnd <> 0 then leave + z = SysSleep(.005) + end + + if dlg~hwnd == 0 then do + say "Error creating dialog for the tab with index:" 1", aborting" + return self~cancel:super + end + + -- Now resize and reposition the control dialog to the tab control's display + -- area. We need to position the control dialog *above* the tab control in + -- the Z-order so that it shows. + dlg~setWindowPos(tabControl~hwnd, displayRect, "SHOWWINDOW NOOWNERZORDER") + + +/** onCheckClicked() + * + * This is the event handler for the CLICKED event of the Use Info Tips check + * box. Each time it is clicked, we update the Page dialog with its state. + */ +::method onCheckClicked unguarded + expose ckInfoTips pageDialog + + if ckInfoTips~checked then pageDialog~useInfoTips = .true + else pageDialog~useInfoTips = .false + + +/** onNewTab() + * + * This is the method we connected to the SELCHANGE event of the tab control. + * + * It is invoked when the user changes to a new tab using the tab control's + * interface. I.e. by clicking on a tab or by using the keyboard when the + * tab control has the focus. + * + * In general, there is usually a different control dialog for each page of + * the tab. In that usage, the programmer would hide the dialog of the old + * page and show the dialog of the new page. However, in this application we + * only use one control dialog. When the page is changed, we tell the page + * dialog to change the view style of the list view to produce the effect of + * changing pages. + */ +::method onNewTab unguarded + expose tabControl pageDialog + use arg ignore1, ignore2 + + pageDialog~refreshView(tabControl~selectedIndex + 1) + self~checkButtons + + +/** onForward() + * + * The event handle for the 'Forward' button's CLICKED event. We select the + * next tab in the tab control and then force the page to update by calling the + * 'onNewTab' method ourselfs. + * + * Note that we do not need to check that the selected index plus 1 is valid + * because the Forward button is disabled when we are on the last page. + */ +::method onForward + expose tabControl + + tabControl~selectIndex(tabControl~selectedIndex + 1) + self~onNewTab + + +/** onBackward() + * + * The event handle for the 'Backward' button's CLICKED event. Coments are the + * same as for the onForward() method above. + */ +::method onBackward + expose tabControl + + tabControl~selectIndex(tabControl~selectedIndex - 1) + self~onNewTab + + +/** onAdd() + * + * The event handle for the 'Add' button's CLICKED event. Here we display the + * address dialog which allows the user add a new record, which in turn will + * show up as a new item in the list-view. + */ +::method onAdd unguarded + expose pageDialog sd + + dlg = .AddressDialog~new(sd'rc\oodListViews.rc', IDD_ADDRESS) + + if dlg~initCode = 0 then do + if dlg~execute("SHOWTOP") == self~IDOK then do + + rec = .directory~new + rec~FirstName = dlg~IDC_EDIT_FNAME + rec~Lastname = dlg~IDC_EDIT_LNAME + rec~Street = dlg~IDC_EDIT_STREET + rec~City = dlg~IDC_EDIT_CITY + rec~State = dlg~IDC_EDIT_STATE + rec~ZipCode = dlg~IDC_EDIT_ZIPCODE + rec~Age = dlg~IDC_EDIT_AGE + rec~isEditable = dlg~IDC_CHK_EDITABLE + + if dlg~IDC_RB_MALE = 1 then rec~Sex = "M" + else rec~Sex = "F" + + -- Have the page dialog add the record to the list-view. + pageDialog~addRecord(rec) + end + end + + +/** onEdit() + * + * The event handle for the 'Edit' button's CLICKED event. Here we display the + * address dialog, but set its mode to edit, which allows the user to edit an + * existing record. + * + * The address dialog is set in edit mode by passing a record into init(). If + * the address dialog is ended with okay, then we update the record with the + * values the user entered and have the page dialog update the list-view item. + */ +::method onEdit unguarded + expose pageDialog sd + + rec = pageDialog~getSelectedRecord + + dlg = .AddressDialog~new(sd'rc\oodListViews.rc', IDD_ADDRESS, rec) + + if dlg~initCode = 0 then do + if dlg~execute("SHOWTOP") == self~IDOK then do + + rec~FirstName = dlg~IDC_EDIT_FNAME + rec~Lastname = dlg~IDC_EDIT_LNAME + rec~Street = dlg~IDC_EDIT_STREET + rec~City = dlg~IDC_EDIT_CITY + rec~State = dlg~IDC_EDIT_STATE + rec~ZipCode = dlg~IDC_EDIT_ZIPCODE + rec~Age = dlg~IDC_EDIT_AGE + rec~isEditable = dlg~IDC_CHK_EDITABLE + + if dlg~IDC_RB_MALE = 1 then rec~Sex = "M" + else rec~Sex = "F" + + -- Have the page dialog refresh, update, the item. + pageDialog~refreshSelectedItem + end + end + + +/** cancel() + * + * The user can not end a ControlDialog, so we need to end the page dialog + * here during cancel. Passing .false to endExecution() says the user + * canceled the main dialog. + */ +::method cancel + expose pageDialog + + -- Always use endExecution() to close a ControlDialog. + pageDialog~endExecution(.false) + return self~cancel:super + + +/** ok() + * + * The user can not end a ControlDialog, so we need to end the page dialog + * here during ok. Passing .true to endExecution() says the user closed the + * main dialog with ok. + */ +::method ok + expose pageDialog + + -- Always use endExecution() to close a ControlDialog. + pageDialog~endExecution(.true) + return self~ok:super + + +/** initAutoDetection() + * + * We turn off auto detection for this dialog. + */ +::method initAutoDetection + self~noAutoDetection + +/** checkButtons() + * + * Enables or disables the forwards / backwards buttons to fit the current + * page. I.e., if we are on the first page, the backwards button should be + * disabled, etc.. + */ +::method checkButtons private + expose tabControl pbForward pbBackward + + index = tabControl~selectedIndex + 1 + + if index == 1 then do + pbBackward~disable + pbForward~enable + end + else if index == 4 then do + pbBackward~enable + pbForward~disable + end + else do + pbBackward~enable + pbForward~enable + end + + +/** createImageLists() + * + * Create the small and large icon image lists. These will be used in the + * report, small icon, and icon views of the list-view. The small icon image + * list is used by both the report and the small icon views, normal icon image + * list is used by the icon view. + * + * In this program we create the initial records and image lists here, in the + * main dialog, and then pass the objects to the page dialog. The creation + * could just as well have been done in the page dialog itself. The example + * program does it this way to try and show that how you use a ControlDialog is + * very flexible. + */ +::method createImageLists private + expose smallIcons normalIcons sd + + small = .Image~getImage(sd"rc\oodListViews1.bmp") + tmpIL = .ImageList~create(.Size~new(16, 12), COLOR4, 4, 0) + if \small~isNull, \tmpIL~isNull then do + tmpIL~add(small) + small~release + smallIcons = tmpIL + end + else do + smallIcons = .nil + end + + normal = .Image~getImage(sd"rc\oodListViews2.bmp") + tmpIL = .ImageList~create(.Size~new(32, 32), COLOR4, 4, 0) + if \normal~isNull, \tmpIL~isNull then do + tmpIL~add(normal) + normal~release + normalIcons = tmpIL + end + else do + normalIcons = .nil + end + + +/** initRecords() + * + * Create 3 records to start with. The records could be pulled from a database. + * Here we just fake it. Each 'record' is put into an array and then the array + * is passed to the page dialog where is record is used to insert a single item + * into the list-view. + */ +::method initRecords private + expose records + + records = .array~new(3) + + rec = .directory~new + rec~FirstName = "Mike" + rec~Lastname = "Miller" + rec~Street = "432 Fifth Ave" + rec~City = "New York" + rec~State = "NY" + rec~ZipCode = "12897" + rec~Age = "35" + rec~Sex = "M" + rec~IsEditable = .false + records[1] = rec + + rec = .directory~new + rec~FirstName = "Sue" + rec~Lastname = "Thaxton" + rec~Street = "5179 Bellevue St" + rec~City = "Tucson" + rec~State = "AZ" + rec~ZipCode = "87340" + rec~Age = "30" + rec~Sex = "F" + rec~IsEditable = .true + records[2] = rec + + rec = .directory~new + rec~FirstName = "Dave" + rec~Lastname = "Hewitt" + rec~Street = "4932 Texas St" + rec~City = "San Diego" + rec~State = "CA" + rec~ZipCode = "92110" + rec~Age = "49" + rec~Sex = "M" + rec~IsEditable = .true + records[3] = rec + + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + PageDialog Class +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'PageDialog' subclass RcControlDialog + +-- This attribute allows the parent dialog to notify us if the Use Info Tips +-- check box is checked or not. When it is not checked, we don't display any +-- info tips. +::attribute useInfoTips + +::method initialize + expose smallIcons normalIcons records haveSelection pbEdit + use strict arg smallIcons, normalIcons, records + + self~connectListViewEvent(IDC_LISTVIEW, "COLUMNCLICK") + self~connectListViewEvent(IDC_LISTVIEW, "ACTIVATE", "onActivate", .true) + self~connectListViewEvent(IDC_LISTVIEW, "DBLCLK", "onDoubleClick", .true) + self~connectListViewEvent(IDC_LISTVIEW, "BEGINDRAG", "DefListDragHandler") + self~connectListViewEvent(IDC_LISTVIEW, "BEGINEDIT", "onBeginEdit", .true) + self~connectListViewEvent(IDC_LISTVIEW, "ENDEDIT", , .true) + self~connectListViewEvent(IDC_LISTVIEW, "GETINFOTIP") + self~connectListViewEvent(IDC_LISTVIEW, "SELECTCHANGED") + + self~initUpdateListView(IDC_LISTVIEW) + + haveSelection = .false + pbEdit = self~ownerDialog~newPushButton(IDC_PB_EDITRECORD) + +::method initDialog + expose lv smallIcons normalIcons records ckInfoTips useInfoTips + + lv = self~newListView(IDC_LISTVIEW) + + if smallIcons <> .nil then lv~setImageList(smallIcons, SMALL) + if normalIcons <> .nil then lv~setImageList(normalIcons, NORMAL) + + lv~insertColumn(0, "Name", 50) + lv~insertColumn(1, "Street", 60) + lv~insertColumn(2, "City", 50) + lv~insertColumn(3, "State", 20) + lv~insertColumn(4, "Zip Code", 30) + lv~insertColumn(5, "Age", 20) + + do r over records + self~addRecord(r, .false) + end + + lv~addExtendedStyle("FULLROWSELECT DOUBLEBUFFER GRIDLINES INFOTIP") + + +/** refreshView() + * + * Invoked by the main dialog when the user has switched to a new tab in the tab + * control. + * + * Typically an application uses a different dialog for each page of a tab + * control. In this example program however, the different pages just show the + * different view types of a list-view. Therefore the same dialog, (and the same + * list-view,) are used for each page. When a new page is to be displayed, + * rather than switching to a different dialog, the current view of the list- + * view is simply changed to the correct view for that page. + */ +::method refreshView unguarded + expose lv + use strict arg index + + select + when index == 1 then lv~setView("LIST") + when index == 2 then lv~setView("REPORT") + when index == 3 then lv~setView("ICON") + when index == 4 then lv~setView("SMALLICON") + otherwise return .false + end + -- End select + + return .true + + +/** onBeginEdit() + * + * The event handler for the label begin edit event, invoked when the user + * initiates a label editing operation. + * + * When the label editing is initiated, the operating system creates and + * postitions a edit control, but doesn't show it. The system then sends the + * label begin edit notification. Here we have access to the edit control, + * which could be customized by using the typical methods of the edit object. + * + * In addition, the edit operation can be vetoed by returning false. I.e., + * return true to allow the editing, and false to disallow it. To demonstrate + * this, we check if the record is editable and if it is not we disallow the + * label editing operation by returning false from this event handler. + */ +::method onBeginEdit unguarded + use arg id, itemIndex, editCtrl, listViewCtrl + + rec = listViewCtrl~getItemData(itemIndex) + if rec~isEditable then return .true + + reply .false + + msg = "The record for" rec~FirstName rec~LastName 'can not be changed.' + title = "Label Edit Error" + j = MessageDialog(msg, self~hwnd, title, , "WARNING") + + return + + +/** onEndEdit() + * + * This is the event handler for the end label edit notification. It is invoked + * when the user ends the label editing operation. If the user canceled the + * operation, then the 'text' argument will be the .nil object. Otherwise it + * will be the text the user entered. + * + * We use this event to validate the label to a degree and to update the record + * for the item when the user edits the label. + */ +::method onEndEdit unguarded + use arg id, itemIndex, text, listViewCtrl + + if text == .nil then return .false + + if text~words == 2 & text~word(1)~right(1) == ',' then do + reply .true + + rec = listViewCtrl~getItemData(itemIndex) + rec~FirstName = text~word(2) + rec~LastName = text~word(1)~strip('T', ',') + + return + end + + reply .false + + msg = "The format for a record label must be" || .endOfLine || - + "last name, comma, first name. For" || .endOfLine || - + "example: Swift, Tom" || .endOfLine~copies(2) || - + "The change is rejected." + + title = "Label Editing Error" + j = MessageDialog(msg, self~hwnd, title, , "WARNING") + + return + + +/** onColumnClick() + * + * The event handler for a column click event, invoked when the user clicks on a + * column header when the list-view is in Report view. + * + * We use the event to demonstrate some of the list-view methods. + */ +::method onColumnClick unguarded + use arg id, column, listView + + -- Get the current width, in pixels, of the column clicked and then set its + -- width to 10 pixels more. + listView~setColumnWidthPx(column, listView~columnWidthPx(column) + 10) + + -- Display information about the column clicked. + d = .Directory~new + if listView~getColumnInfo(column, d) then do + tab = '09'x + msg = "Column Title:"tab d~text || .endOfLine || - + "Subitem index:"tab d~subitem || .endOfLine || - + "Column Width:"tab d~width || .endOfLine || - + "Allignment:"tab d~fmt || .endOfLine~copies(2) || - + "Note: each time you click on a column" || .endOfLine || - + "its width is increased." + j = MessageDialog(msg, self~hwnd, "Column Click Detected") + end + else do + msg = "An error ocurred getting the column information." + j = MessageDialog(msg, self~hwnd, "Windows API Error", "OK", "ERROR") + end + + +/** onDoubleClick() + * + * The event handler for a double clikc event, invoked when a list-view item is + * double clicked. + * + * We use the event to demonstrate: + * + * 1.) That a double click also activates an item and that the double click + * comes first. When you double click an item you will see a message box + * displaying the arguments to this method, the 'age increase' message box, + * and then a message box from the onActivate() method. + * + * 2.) Some of the list-view methods. + * + */ +::method onDoubleClick unguarded + use arg id, item, subitem, state, isSingleClick, listView + + tab = '09'x + tab2 = tab~copies(2) + true = self~booleanToText(isSingleClick) + msg = 'onDoubleClick()' || .endOfLine~copies(2) || - + 'id:'tab2 id || .endOfLine || - + 'item:'tab2 item || .endOfLine || - + 'subitem:'tab2 subitem || .endOfLine || - + 'state:'tab2 state || .endOfLine || - + 'single click:'tab true || .endOfLine || - + 'listView:'tab2 listView + + ret = MessageDialog(msg, self~hwnd, "onDoubleClick Method Invoked", OK, INFORMATION) + + -- Get the index of the item with the focus, use the index to retrieve the + -- item information and the text associated with it + index = listView~focused + + -- The item's information is returned in the .directory object passed in to + -- the getItemInfo() method. + d = .directory~new + listView~getItemInfo(index, d) + + parse value d~text with lastName ', ' firstName + + pronoun = 'his' + if d~image == 1 then pronoun = "her" + + age = listView~itemText(index, 5) + + msg = "You have double clicked on the item for" firstName lastName || "0d0a0d0a"x , + "Should" pronoun "age be increased by 1?" + + ret = MessageDialog(msg, self~hwnd, "Age Increment", YESNO, INFORMATION) + if ret == self~IDYES then do + age += 1 + listView~setItemText(index, 5, age) + + -- Now we need to update the age in the record for this item. We retrieve + -- the record from the user item data and update the age. + rec = listView~getItemData(index) + rec~age = age + end + + -- Deselect the focused item and move the focus to the first item + listView~deselect(index) + listView~focus(0) + return 0 + + +/** onActivate() + * + * The event handler for an activate event, invoked when a list-view item is + * activated. + * + * We use the event to demonstrate that a double click event also generates an + * activate event. We just print out the argument values here. + */ +::method onActivate unguarded + use arg id, ptr, nCode, listView + + tab = '09'x + msg = 'onActivate()' || .endOfLine~copies(2) || - + 'id:'tab id || .endOfLine || - + 'ptr:'tab ptr || .endOfLine || - + 'nCode:'tab nCode || .endOfLine || - + 'listView:'tab listView + + ret = MessageDialog(msg, self~hwnd, "onActivate Method Invoked", OK, INFORMATION) + + return 0 + + +/** onGetInfoTip() + * + * This is the event handler for the INFOTIP event. This method is invoked when + * the list-view wants the text for an info tip. + * + * If this method returns the empty string then no info tip will be shown. + * Otherwise, the info tip will contain the text sent back. + * + * The maxLen argument will be the maximum length allowed for the returned text. + * You should never assume what this length is, although it appears to usually + * be 1023. If the text sent back is longer than maxLen, it will automatically + * be truncated. + * + * Note that the original versions of this example did not use the user item + * data feature of the list-view. Instead they trackd the records through an + * array. When this example was updated to work with the user item data + * feature, this method was left as is, to show more than one way of associating + * a record with a list-view item. + */ +::method onGetInfoTip unguarded + expose lv records useInfoTips + use arg id, item, text, maxLen + + text = '' + + if useInfoTips then do + r = records[item + 1] + text = r~firstName r~lastName '('r~age')' || .endOfLine || - + r~street || .endOfLine || - + r~city',' r~state r~zipcode + end + + return text + + +/** onSelectionChanged() + * + * This is the event handler for the selection changed event. It is invoked + * each time the selection state of an item changes. We use this event to + * enable or disable the Edit Record push button. The button is only enabled + * when an item is selected, and that item is an editable record. When no item + * is selected, or if the selected item is not editable, then the push button is + * disabled. + * + * The event happens each time a selected item is deselected and each time an + * unselected item is selected. This means that quite often when an item is + * selected there are two events, the old selected item losing its selection and + * the newly selected item gaining the selection. + */ +::method onSelectChanged unguarded + expose haveSelection pbEdit + use arg id, itemIndex, state, lv + + if state == 'SELECTED' then haveSelection = .true + else if state == 'UNSELECTED' & lv~selected == -1 then haveSelection = .false + + if \ haveSelection then do + pbEdit~disable + end + else if state == 'SELECTED' then do + -- We have a selection and an item was just selected, see if it is editable: + rec = lv~getItemData(itemIndex) + if rec~isEditable then pbEdit~enable + else pbEdit~disable + end + + +::method booleanToText unguarded private + use strict arg boolean + if boolean == .true then return 'true' + else if boolean == .false then return 'false' + else return 'not a boolean' + + +/** addRecord() + * + * Used to add an item to the list view. + * + * Note that it does not matter what view the list-view is in. When the list- + * view is in report view, then all the information will be visible to the user. + * When it is in other views, only some of the information is visible to the + * user. + */ +::method addRecord unguarded + expose lv records counter + use strict arg rec, newRecord = .true + + iconSex = 0 + if rec~sex = "F" then iconSex = 1 + + index = lv~addRow(, iconSex, rec~lastName', 'rec~firstName, rec~street, rec~city, rec~state, rec~ZipCode, rec~age) + lv~setItemData(index, rec) + + if newRecord then records~append(rec) + + +/** getSelectedRecord() + * + * The owner dialog, the top-level dialog, invokes this method to get access to + * the data record of the currently selected item. + * + * Because the program only enables the 'Edit Record' button when an item that + * is editable is selected, we do not need to do a lot of checks here. We + * simply get the selected index, get the user item data for that index, and + * send the record back. + */ +::method getSelectedRecord + expose lv + return lv~getItemData(lv~selected) + + +/** refreshSelectedRecord() + * + * This method is invoked by the owner dialog to notify us that the data in a + * record has been changed. We simply get the record for the selected item and + * modify the item with the record data. + * + * Because of the way the program is structured, there must be a selected item. + * We check anyway that the selected index is value + */ +::method refreshSelectedItem + expose lv pbEdit + + index = lv~selected + if index == -1 then return .false + + rec = lv~getItemData(index) + + iconSex = 0 + if rec~sex = "F" then iconSex = 1 + + lv~modify(index, 0, rec~lastName', 'rec~firstName, iconSex) + lv~modify(index, 1, rec~street) + lv~modify(index, 2, rec~city) + lv~modify(index, 3, rec~state) + lv~modify(index, 4, rec~zipCode) + lv~modify(index, 5, rec~age) + + -- The is editable status of the record could have changed. + if rec~isEditable then pbEdit~enable + else pbEdit~disable + + return .true + + +/** leaving() + * + * The ooDialog framework invokes the leaving method automatically when a dialog + * is being ended. The default implementation does nothing. The method is + * intended to be over-ridden by the programmer, if desired, to provide the + * proper place to clean up resources. + * + * We use it here to release the image lists resources. This is not needed in + * this stand alone program. When the interpreter process ends, (which will + * happen now that the dialog is ending,) the operating system will free all the + * resources. The example program does this because ... because it is an + * example and this makes a good place to explain about the leaving() method. + */ +::method leaving + expose smallIcons normalIcons + if smallIcons \== .nil then smallIcons~release + if normalIcons \== .nil then normalIcons~release + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + AddressDialog Class +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'AddressDialog' subclass RcDialog + +::method init + expose rec + self~init:super(arg(1), arg(2)) + + if self~initCode <> 0 then return self~initCode + + if arg(3, 'E') then rec = arg(3) + else rec = .nil + + -- Initialize the data attributes. These attributes are added automatically + -- to this dialog by the ooDialog framework. The attributes are used to + -- reflect the state of the underlying dialog controls. + -- + -- If we have a record, we are in edit mode, otherwise we are in add mode. + if rec == .nil then do + self~IDC_RB_MALE = 1 + self~IDC_RB_FEMALE = 0 + self~IDC_EDIT_FNAME = '' + self~IDC_EDIT_LNAME = '' + self~IDC_EDIT_STREET = '' + self~IDC_EDIT_CITY = '' + self~IDC_EDIT_STATE = '' + self~IDC_EDIT_ZIPCODE = '' + self~IDC_EDIT_AGE = '' + self~IDC_CHK_EDITABLE = 1 + end + else do + if rec~Sex == 'M' then do + self~IDC_RB_MALE = 1 + self~IDC_RB_FEMALE = 0 + end + else do + self~IDC_RB_MALE = 0 + self~IDC_RB_FEMALE = 1 + end + self~IDC_EDIT_FNAME = rec~FirstName + self~IDC_EDIT_LNAME = rec~Lastname + self~IDC_EDIT_STREET = rec~Street + self~IDC_EDIT_CITY = rec~City + self~IDC_EDIT_STATE = rec~State + self~IDC_EDIT_ZIPCODE = rec~ZipCode + self~IDC_EDIT_AGE = rec~Age + self~IDC_CHK_EDITABLE = rec~isEditable + end + + return self~initCode + + +::method initDialog + + -- To help with data validation, restrict the number of characters the user + -- can type into these edit controls. Note that in the resource script, the + -- zip code and age edit controls are defined as numeric only. The state edit + -- control is defined as upper-case only. + self~newEdit(IDC_EDIT_STATE)~setLimit(2) + self~newEdit(IDC_EDIT_ZIPCODE)~setLimit(5) + self~newEdit(IDC_EDIT_AGE)~setLimit(3) + + +/** validate() + * + * The validate() method is invoked automatically by the ooDialog framework when + * the user closes a dialog with 'ok'. The default implementation simply + * returns true. The method is meant to be over-ridden by the programmer, if + * desired, to validate the user input is correct. The method must return .true + * or .false. When .true is returned, the dialog continues to close. If .false + * is returned, the dialog will not be closed. + * + * Here we do a bare minimum of validation. We just check that something has + * been entered for the first and last names. + */ +::method validate + + if self~namesEnteredOkay then return .true + + -- It's not very user friendly to prevent the user from closing the dialog + -- without letting him know why. + msg = "The last and first names must be specified for each new record." + title = "New Record Input Error" + j = MessageDialog(msg, self~hwnd, title, , "WARNING") + + -- Place the focus on the first edit control that has invalid data: + if self~newEdit(IDC_EDIT_FNAME)~getText~strip == "" then + self~focusControl(IDC_EDIT_FNAME) + else + self~focusControl(IDC_EDIT_LNAME) + + return .false + + +/* Simple convenience function to make validate() more readable */ +::method namesEnteredOkay private + if self~newEdit(IDC_EDIT_LNAME)~getText~strip == "" then return .false + if self~newEdit(IDC_EDIT_FNAME)~getText~strip == "" then return .false + return .true diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/PropertySheetDemo.dll b/modules/windows/oodialog/propertysheet.tabControls/rc/PropertySheetDemo.dll new file mode 100644 index 0000000000000000000000000000000000000000..7413e919880abbbe120d07b0eba100a3df6fccd0 GIT binary patch literal 4608 zcmeHJO=w(I6#nicX)=jP4Qi>T#5Zkft(1`HCX0a6CIOLXhb9zJQRdHdYGx+9Nj1jJ zI0zQ0P~5sHx)GsJp-2@Mv71Jv;6l)y-3VzL|Nm+f#_!yp$-HqgEuAg|b7$T?_n!ZI z-Z|&K$DTZi767e$%4Ogjp^T`W8&69l_uTtY56*@!M$W0pi;?LgnSwXx=V$zQ)=S27 zx%|ABNPGUVoR`UY;|Hg_Y(AA9?C$Oyu&Ph5jec|atwSf=(|7*#i52eq&d1&mcqo%R zBD9S>iA?~LDuk#9#Z+R3dw9SjO7P6LfuUhR z#Uj8$xPp67aGT@5903J3JZuMwK`*x;L&OurA0?b4e4g+);Vj`P!Ym>0j$)4R3qpdb z!NlNLslu40!C%_|-(kpARD;;Q0sj6C@FT=aE}k1tHo-g#G^fedxvoTxrQtUf%yK z;j_%3pl0J=tv%x(Te#MB*y_4^3v|6^b*(m`s|`i%*9TVDceg;-s@3&<6T0{jrTyB8 zZ*dno5N|D)OBm)S;ShFLUb*3!vOI|fJg-`wWCNbFmM7JK=ZfV?H{iLOA9e%uxy(`0 zb)46AW3q3*_1^gYXhYru0p6Dz@{R>~-)qP_9^k#ykaxoJ^4s3lS13?lrjPx*(*$eW z^{FuKz&+|K{9tSRM*3ry?N_~c7+vaZ{MaJ>aeX+ydTRXgS?5W1wHvK?*B3j{&#rYR zeyPb{xfhJagzg}w-ly0NGDxwz_!XDTyWNWsjItJfrN1Tid()E*Q(NV}h-+IvH*Kq^ zZT(iq*4~P(cXc=ZscBoE(^fxzuVZVMwRHv&zUd|W(WI^S(Ti=YrE7I;wOdZ7f-I<{O6DitBm68>t^R-5Y8eeLf$w%YAoA@|{Ntl~M{YfRoa+B>9`NSmpm rxjG2m$J5NqG=Co4J$k)b-BWWPU#`@u(d6{F?-+xvB>(2(CL{0 +#include +#include "PropertySheetDemo.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_NEWCONTROLS_DLG DIALOG 0, 0, 325, 300 +STYLE DS_MODALFRAME | DS_SETFONT | DS_CENTER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE +CAPTION "Example using ControlDialog objects" +FONT 9, "Arial" +{ + CONTROL "Tab", IDC_TAB, WC_TABCONTROL, WS_TABSTOP, 10, 5, 305, 265 + PUSHBUTTON "Previous Control", IDC_PB_PREVIOUS, 10, 278, 60, 14 + PUSHBUTTON "Next Control", IDC_PB_NEXT, 80, 278, 60, 14 + DEFPUSHBUTTON "Ok", IDOK, 185, 278, 60, 14 + PUSHBUTTON "Cancel", IDCANCEL, 255, 278, 60, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_LISTVIEW_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "List View Control" +FONT 9, "Arial" +{ + CONTROL "ListView", IDC_LV_MAIN, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT, 7, 7, 286, 236 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PROGRESSBAR_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Progress Bar Control" +FONT 9, "Arial" +{ + CONTROL "Progress", IDC_PBAR_PROCESSA, PROGRESS_CLASS, PBS_VERTICAL, 37, 27, 13, 199 + CONTROL "Progress", IDC_PBAR_PROCESSB, PROGRESS_CLASS, PBS_VERTICAL, 86, 27, 13, 199 + CONTROL "Progress", IDC_PBAR_PROCESSC, PROGRESS_CLASS, PBS_VERTICAL, 135, 27, 13, 199 + CONTROL "Progress", IDC_PBAR_PROCESSD, PROGRESS_CLASS, WS_BORDER | PBS_SMOOTH | PBS_VERTICAL, 182, 27, 13, 199 + CONTROL "Progress", IDC_PBAR_PROCESSE, PROGRESS_CLASS, WS_BORDER | PBS_SMOOTH | PBS_VERTICAL, 236, 27, 13, 199 + LTEXT "100%", IDC_ST_PERCENTA, 34, 229, 21, 8, SS_LEFT + LTEXT "100%", IDC_ST_PERCENTB, 83, 229, 21, 8, SS_LEFT + LTEXT "100%", IDC_ST_PERCENTC, 132, 229, 21, 8, SS_LEFT + LTEXT "100%", IDC_ST_PERCENTD, 180, 229, 21, 8, SS_LEFT + LTEXT "100%", IDC_ST_PERCENTE, 234, 229, 21, 8, SS_LEFT + LTEXT "Process A", -1, 25, 12, 36, 8, SS_LEFT + LTEXT "Process B", -1, 74, 12, 36, 8, SS_LEFT + LTEXT "Process C", -1, 123, 12, 36, 8, SS_LEFT + LTEXT "Process D", -1, 170, 12, 36, 8, SS_LEFT + LTEXT "Process E", -1, 224, 12, 36, 8, SS_LEFT +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TAB_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Tab Control" +FONT 9, "Arial" +{ + CONTROL "Tab", IDC_TAB_MAIN, WC_TABCONTROL, WS_TABSTOP, 9, 19, 282, 215 + CONTROL "", IDC_PB_OWNERDRAW, WC_BUTTON, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 17, 63, 267, 162 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TRACKBAR_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Track Bar Control" +FONT 9, "Arial" +{ + CONTROL "Slider", IDC_TB_HORZ_BOTTOM, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS, 10, 30, 119, 20 + LTEXT "Text", IDC_ST_HORZ_BOTTOM, 41, 56, 60, 27, SS_LEFT + CONTROL "Slider", IDC_TB_HORZ_TOP, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_TOP, 10, 97, 119, 20 + LTEXT "Text", IDC_ST_HORZ_TOP, 41, 128, 60, 27, SS_LEFT + CONTROL "Slider", IDC_TB_HORZ_BOTH, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_BOTH | TBS_ENABLESELRANGE, 10, 168, 119, 32 + LTEXT "Text", IDC_ST_HORZ_BOTH, 41, 203, 60, 30, SS_LEFT + CONTROL "Slider", IDC_TB_VERT_RIGHT, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_VERT | TBS_ENABLESELRANGE, 176, 33, 19, 192 + LTEXT "Text", IDC_ST_VERT_RIGHT, 177, 17, 22, 8, SS_LEFT + CONTROL "Slider", IDC_TB_VERT_LEFT, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_VERT | TBS_TOP, 212, 33, 19, 192 + LTEXT "Text", IDC_ST_VERT_LEFT, 216, 17, 27, 8, SS_LEFT + CONTROL "Slider", IDC_TB_VERT_BOTH, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_VERT | TBS_BOTH, 257, 33, 27, 192 + LTEXT "Text", IDC_ST_VERT_BOTH, 261, 17, 21, 8, SS_LEFT + CONTROL "", IDC_ST_FRAME_LEFT, WC_STATIC, SS_BLACKFRAME, 7, 7, 136, 236 + CONTROL "", IDC_ST_FRAME_RIGHT, WC_STATIC, SS_BLACKFRAME, 163, 7, 130, 236 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TREEVIEW_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Tree View Control" +FONT 9, "Arial" +{ + CONTROL "Tree", IDC_TV_MAIN, WC_TREEVIEW, WS_TABSTOP | WS_BORDER | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS, 7, 7, 286, 236 +} diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemo.dll b/modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemo.dll new file mode 100644 index 0000000000000000000000000000000000000000..4046c83529d065c21819f19ffdd6ab83d6f2525e GIT binary patch literal 4608 zcmeHJO=whC6#m{MWB$z8&>vDq(l<7?4U`bujSImsMi86om;@C3BhTolZidH39V z&Ueo_@6I{r&g*ZUKm&kAKIJlSnOrET#_(Z|>ezEvVz}6HGjZ7&yqOp|kS(}VUVguq zo^;33xm_vrqi`xnuKO$FHZ3 z3m?jk9T44ek)*Z*gH8l@3s>K=m|KV>+MJkP8m1OcaFjgVNBFFhTs1Wyxg~jP^G$Su(d+J+nVIp?{anKZb~qwu zzIFF)6j3SxeAZl%y&|#|`ahq512#N#0!4q6tB|GO4a(mkpCUg>O{t1MwXaI|WDq6a8duc?1q zE=EK5Hvk{o1^Mg?Y@=0rs~T*)mXvvfO?C}lb{3VQ9}`F;hl6l2z_Uzqorl!Tlh_K+ zNE8%KN_Z5l*o+uH=dD~sikJ-EB`%LcDA39_&T^QhJWpGe^xoIZ-Y?YNUEKLTk->Xx zypAv4L3%2vJ$pIJ;Jtv|ExyPd99D5Rp$T2i0_Gcr@d0gEOV-Y-kTy^&weeG9&Tow` z9(jK`FFA#RdjEc&q4%#*sVh;%wE=Oo;|A_DOmhDi-)(|?A9LAnS;trFPshiWsBG;u zw(dRxTSttog*t3SQB-kVGPdqL0$U5l)(>^qVil;k*5i9Tjb`j>ESF2z$iG;9U^yAm zm|=t29fJADU{WENiw3hN1arq=hC(pU@{dwCV=j|Qs{ZoK8k>DveX;Kh#rFHKABJML z`LJh0u>(Hrtx)WCgI%gGe}5WbHH|(*HR=3sVb@yge1jiNjqBb1j-=~IYs7h*>1!R> zf;Q(A?l(wZTOwQcF<;$}usYK`cj=oCSMiSV(~2&3t*7uyP5w&9)D}lo2hnj3vm0bF z&fnLogrxJb2b +#include +#include "TabOwnerDemo.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_BLANK_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Blank Dialog" +FONT 19, "Arial" +{ + PUSHBUTTON "Previous Control", IDC_PB_PREVIOUS, 5, 10, 60, 14 + PUSHBUTTON "Next Control", IDC_PB_NEXT, 75, 10, 60, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_LISTVIEW_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "List View Control" +FONT 9, "Arial" +{ + CONTROL "ListView", IDC_LV_MAIN, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT, 7, 7, 286, 236 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PROGRESSBAR_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Progress Bar Control" +FONT 9, "Arial" +{ + CONTROL "Progress", IDC_PBAR_PROCESSA, PROGRESS_CLASS, PBS_VERTICAL, 37, 27, 13, 199 + CONTROL "Progress", IDC_PBAR_PROCESSB, PROGRESS_CLASS, PBS_VERTICAL, 86, 27, 13, 199 + CONTROL "Progress", IDC_PBAR_PROCESSC, PROGRESS_CLASS, PBS_VERTICAL, 135, 27, 13, 199 + CONTROL "Progress", IDC_PBAR_PROCESSD, PROGRESS_CLASS, WS_BORDER | PBS_SMOOTH | PBS_VERTICAL, 182, 27, 13, 199 + CONTROL "Progress", IDC_PBAR_PROCESSE, PROGRESS_CLASS, WS_BORDER | PBS_SMOOTH | PBS_VERTICAL, 236, 27, 13, 199 + LTEXT "100%", IDC_ST_PERCENTA, 34, 229, 21, 8, SS_LEFT + LTEXT "100%", IDC_ST_PERCENTB, 83, 229, 21, 8, SS_LEFT + LTEXT "100%", IDC_ST_PERCENTC, 132, 229, 21, 8, SS_LEFT + LTEXT "100%", IDC_ST_PERCENTD, 180, 229, 21, 8, SS_LEFT + LTEXT "100%", IDC_ST_PERCENTE, 234, 229, 21, 8, SS_LEFT + LTEXT "Process A", -1, 25, 12, 36, 8, SS_LEFT + LTEXT "Process B", -1, 74, 12, 36, 8, SS_LEFT + LTEXT "Process C", -1, 123, 12, 36, 8, SS_LEFT + LTEXT "Process D", -1, 170, 12, 36, 8, SS_LEFT + LTEXT "Process E", -1, 224, 12, 36, 8, SS_LEFT +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TAB_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Tab Control" +FONT 9, "Arial" +{ + CONTROL "Tab", IDC_TAB_MAIN, WC_TABCONTROL, 0, 9, 19, 282, 215 + CONTROL "", IDC_PB_OWNERDRAW, WC_BUTTON, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 17, 63, 267, 162 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TRACKBAR_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Track Bar Control" +FONT 9, "Arial" +{ + CONTROL "Slider", IDC_TB_HORZ_BOTTOM, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS, 10, 30, 119, 20 + LTEXT "Text", IDC_ST_HORZ_BOTTOM, 41, 56, 60, 27, SS_LEFT + CONTROL "Slider", IDC_TB_HORZ_TOP, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_TOP, 10, 97, 119, 20 + LTEXT "Text", IDC_ST_HORZ_TOP, 41, 128, 60, 27, SS_LEFT + CONTROL "Slider", IDC_TB_HORZ_BOTH, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_BOTH | TBS_ENABLESELRANGE, 10, 168, 119, 32 + LTEXT "Text", IDC_ST_HORZ_BOTH, 41, 203, 60, 30, SS_LEFT + CONTROL "Slider", IDC_TB_VERT_RIGHT, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_VERT | TBS_ENABLESELRANGE, 176, 33, 19, 192 + LTEXT "Text", IDC_ST_VERT_RIGHT, 177, 17, 22, 8, SS_LEFT + CONTROL "Slider", IDC_TB_VERT_LEFT, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_VERT | TBS_TOP, 212, 33, 19, 192 + LTEXT "Text", IDC_ST_VERT_LEFT, 216, 17, 27, 8, SS_LEFT + CONTROL "Slider", IDC_TB_VERT_BOTH, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_VERT | TBS_BOTH, 257, 33, 27, 192 + LTEXT "Text", IDC_ST_VERT_BOTH, 261, 17, 21, 8, SS_LEFT + CONTROL "", -1, WC_STATIC, SS_BLACKFRAME, 7, 7, 136, 236 + CONTROL "", -1, WC_STATIC, SS_BLACKFRAME, 163, 7, 130, 236 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TREEVIEW_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Tree View Control" +FONT 9, "Arial" +{ + CONTROL "Tree", IDC_TV_MAIN, WC_TREEVIEW, WS_TABSTOP | WS_BORDER | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS, 7, 7, 286, 236 +} diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemoListView.bmp b/modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemoListView.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2414bdbe33a79efad4289230475e449f7b60984e GIT binary patch literal 2102 zcmeH_F_OYC3`L!oV#_@SC!l8N_x{HT|36udAsJH8?L;%ilA`w|Yk2(KehPNGlya4K z*ZI|%O8cPvo-HJovMk~4)ttF=1Lp?*-v;XUHh1e?z!BK+t&J}9rz%e(KHfoem5R5ZxKu5`SDZSlQa+`=36qy5 zV7n|}*dhZjm~C5rpZ6CYLQ@a$fw!C$c|Z=%_|e}ekHFc^f5e*}`!l;+dddNIiv4-= z9N#GWYj4OujnUveb{aenj~~Sh?ds+NMI3Ijx=Fv{$2@yOBvfN^s}R5UUq7#tjI<#} NXlj0bv&?*PKLOzk55)ig literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemoTab.bmp b/modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemoTab.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7b305ce0e088414a1b84a5d677af90692c33b244 GIT binary patch literal 7734 zcmeH}O>%=U429hrblFuW%bpmlww!7G%6!@3cW`78a%ITzZoUFN+V=6aWTB(s zCy&4`My;hOpK0D)yiAiFyyJep%Mf`*!^vU?-w>#ndC20rup9;?V8UrxIKD3ACl67E zruK$QH8ijH!tXQg%}!3;%NKBKK=Z)U6&yu`zBQZG4(N`>E3dYZFV^yp^95)TD^m@= zD>X=gFB}y$-<35Ig0B@T&*o4fRKblvsX`IM>wqg^OZ^1$X7tysjF#437{?vx*Sj!mJLjk9oz9BUpv%MG}C0qy$hDGL+nEB0#FRX z4pNhFKwVgrF5h3Z0arv>xJ3UAF=(<_CWVwmY&8{Le~N`EQd{|gtP1oSVS!q0O1upD zis|d-*nV(bfux+%X2@8@+486stLm_eX|hu^I;?fL(q)-K7o$Z15L*!yPM$^VbgiZP Zzdi$&Y;Ez{hje6*vUu$)bp4lR;2S3FB)0$n literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemoTreeView.bmp b/modules/windows/oodialog/propertysheet.tabControls/rc/TabOwnerDemoTreeView.bmp new file mode 100644 index 0000000000000000000000000000000000000000..19cb2476f3680e351b0ac86c4262754b05350625 GIT binary patch literal 11894 zcmd^^y>A@H8OFziizO9g!O|58R!I{U{sU+PYy(#M3j(kTz|QrSD+I<7u6!v(wsxg9 zU}04O0uWHj2!>#{X@t=SggZdO_<5dpzIJbUBxNgx>6gd3+4fzR*QLeadG8nIM*(>x3@n5Y7Cfbb+6x%H-WD$9(3!SS)7! zBFq+DFRwK2wfDidBi`OMecx5|i5m*Hx)`4PVG00;CFG4!Hr`UW3H-0W4c?W$K_OYw zgs!F7YXfX>9OxS~19>Ol{=)QqVe)VKHh&^-x4HcZ?^5*b9e^Jn|2BBLHtL&z1h?t> zrh!9Q(6tZDW?b^l{yU9Naw+#N9#P)-B3|FKvG|F+YkiylMjKT4-QfM^_!u3vkUbt4 z#Mydu8i}5QYcUNXMNjC1>k@C zRr-^cd$Rq+buDkobQ7)`s9iu{eJ2gb9zjzR?>H9e9WIRc6eq$kXP+#9Ve*gZhtCR|dTn$%t z8{Xbw0-T@1E3^9mPbX=wl6dDA zQ1X5vpThDq`I3P{83EzTY(*7b$2&ax9_18RttsBymc{Trcym6A4Zv*+uN(<@FO>f7 zneV$MMBbFPt9TcGg8dJSzJGz8>6E@zHwE9K@Y{bsgt#N`=&WWlE`3l6`H?qbW^gBn zSjZH(6NLx7kV$|QkPpIpC*JJ#ygA-bt?Cok%!k|kZ-M3?Xx0*szlkQv8i@eQ$KbXtNyVm#6oj~3cxW35y0GAdrBZL=t+xcJY zmim51`#x7+(Km9c<`2zs@zMM9=J*7+$4Ap9N>SRGHx-qQ`ig*B9;HNo5_uPYQt{R> zfhYV)2V`Ua-L`o{L+C6`|9v|D?teNVEbbdS)Z)J@cLLCQzPE|DJ#FnzwyEuP`bKYu zbLMcqd?()4F2fJV8+d)YjEAFIq2}Z)EH2 zMFGo3-qGFhc_w&kg~B|uoAFK)7VC`lJy@P#LZltV*5RsX>5BeamJ?R|37v_3R3=ZA zR-@_gdj(&0!<`&B1TNn6-^P2=e~S?V)@!1^3J*E7SPJUE?WqEs>t5AkCMj|~uN z#Bnd$)x7CUDsOTF-fXLCajfs3mp7+LZFVqms>8T7Z?CxTg6|N3H@Fcw*4;FP$yX>v z0V=_NFL-Wc{@dn2)a3z+HcI7u5DA&Lq-?jJe+Ah6{ESzLwDH!E>&dDG%8EZBZfhxq z*ZLFk9=!EKe}cVEwcDATFJBD&$>8q8mce?0ch=9MYdwx$LAe8JL=Z#YVJ7ztO0C!~ z?lj=7A<{g{7X-tF26R>hfnyM~ePSXkW+S!)?*~dlqInYB6ZwUA(gRAxg+hda-6utrIyKcjjN_9!Crd(8^h#O){jY8p3%qazHOO2*#y3LD! znwBvW&}PnYgV`^5hcv*ks!;RD>PbqV{~k@40J4*^`JI*qO4I9%R;vQH=e<*EujegQ z+fNQ@gITIVbUl7e18%r*U`NhK-y!_|`Evqwm%`mb-&8)_fq4W99M%9A&_~NoBwlm9 zm-69=uzo=m=0WN6v)L?-4qJ}A_hVHZosf6Fezn3ojBu~#eLq@m5QkOua&UEjIaq$D z_4iS#Kk!uMMb`1=;upW32|b!v;T;{dzZ6dAJ{76Vn>$p%18$Di6~@shyeof_^!;BI z=)XYy$h&HZw2QpyyJ1!SHPNW=Jb)9thb@fu^TW)acm+{Yo1Np5kZtAlAhjm5h@Xo$ z*-Dwvw-TUs<4tD-<0VdcTkq2Z$u? +#include +#include +#include "UserTabDemo.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_CONTACTS DIALOGEX 0, 0, 475, 202 +STYLE DS_3DLOOK | DS_CONTROL | DS_SHELLFONT | WS_CAPTION | WS_CHILDWINDOW | WS_TABSTOP +CAPTION "Contacts" +FONT 10, "Tahoma", 400, 0, 0 +{ + GROUPBOX "Guarantor", IDC_STATIC, 5, 5, 244, 192 + LTEXT "Guarantor Name: ", IDC_STATIC, 14, 16, 95, 8, SS_LEFT + EDITTEXT IDC_EDIT_NAME_G, 14, 26, 110, 12, ES_AUTOHSCROLL + LTEXT "Relationship to patient:", IDC_STATIC, 136, 16, 105, 8, SS_LEFT + EDITTEXT IDC_EDIT_RELATION_G, 136, 26, 105, 12, ES_AUTOHSCROLL + LTEXT "Date of birth:", IDC_STATIC, 14, 43, 48, 8, SS_LEFT + EDITTEXT IDC_EDIT_DOB1_G, 14, 53, 17, 12, ES_AUTOHSCROLL | ES_NUMBER + CTEXT "/", IDC_STATIC, 33, 55, 8, 8, SS_CENTER + EDITTEXT IDC_EDIT_DOB2_G, 44, 53, 17, 12, ES_AUTOHSCROLL | ES_NUMBER + CTEXT "/", IDC_STATIC, 64, 55, 8, 8, SS_CENTER + EDITTEXT IDC_EDIT_DOB3_G, 74, 53, 17, 12, ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Age:", IDC_STATIC, 102, 43, 22, 8, SS_LEFT + EDITTEXT IDC_EDIT_AGE_G, 102, 53, 22, 12, ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Social Security Number:", IDC_STATIC, 136, 43, 86, 8, SS_LEFT + EDITTEXT IDC_EDIT_SSN1_G, 136, 53, 19, 12, ES_AUTOHSCROLL | ES_NUMBER + CTEXT "-", IDC_STATIC, 195, 54, 8, 8, SS_CENTER + EDITTEXT IDC_EDIT_SSN2_G, 172, 53, 19, 12, ES_AUTOHSCROLL | ES_NUMBER + CTEXT "-", IDC_STATIC, 159, 54, 8, 8, SS_CENTER + EDITTEXT IDC_EDIT_SSN3_G, 209, 53, 31, 12, ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Sex", IDC_STATIC, 6, 76, 35, 45 + AUTORADIOBUTTON "M", IDC_RB_M_G, 17, 87, 15, 8, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "F", IDC_RB_F_G, 17, 103, 15, 8 + GROUPBOX "Guarantor Employment", IDC_STATIC, 44, 76, 198, 45 + RTEXT "Employer:", IDC_STATIC, 47, 89, 41, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER_G, 91, 87, 100, 12, ES_AUTOHSCROLL + RTEXT "Occupation:", IDC_STATIC, 47, 105, 41, 8, SS_RIGHT + EDITTEXT IDC_EDIT_OCCUPATION_G, 91, 103, 100, 12, ES_AUTOHSCROLL + RTEXT "Phone:", IDC_STATIC, 202, 90, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER_PHONE_G, 202, 103, 35, 12, ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Guarantor Address", IDC_STATIC, 44, 127, 198, 70 + RTEXT "Street:", IDC_STATIC, 64, 140, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_ADDRESS_G, 91, 138, 143, 12, ES_AUTOHSCROLL + RTEXT "City:", IDC_STATIC, 64, 156, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_CITY_G, 90, 154, 59, 12, ES_AUTOHSCROLL + RTEXT "State:", IDC_STATIC, 152, 156, 20, 8, SS_RIGHT + EDITTEXT IDC_EDIT_STATE_G, 175, 154, 13, 12, ES_AUTOHSCROLL | ES_UPPERCASE + RTEXT "Zip:", IDC_STATIC, 189, 156, 15, 8, SS_RIGHT + EDITTEXT IDC_EDIT_ZIP_G, 207, 154, 26, 12, ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Phone:", IDC_STATIC, 64, 172, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PHONE_G, 90, 170, 51, 12, ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Cell:", IDC_STATIC, 148, 172, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_CELL_G, 175, 170, 58, 12, ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Emergency Contact", IDC_STATIC, 265, 5, 205, 91 + LTEXT "Name: ", IDC_STATIC, 274, 16, 77, 8, SS_LEFT + EDITTEXT IDC_EDIT_NAME_EC, 274, 26, 110, 12, ES_AUTOHSCROLL + LTEXT "Relationship to patient:", IDC_STATIC, 274, 43, 77, 8, SS_LEFT + EDITTEXT IDC_EDIT_RELATION_EC, 274, 53, 110, 12, ES_AUTOHSCROLL + LTEXT "Employer:", IDC_STATIC, 274, 69, 41, 8, SS_LEFT + EDITTEXT IDC_EDIT_EMPLOYER_EC, 274, 78, 110, 12, ES_AUTOHSCROLL + LTEXT "Phone:", IDC_STATIC, 391, 16, 66, 8, SS_LEFT + EDITTEXT IDC_EDIT_PHONE_EC, 391, 26, 71, 12, ES_AUTOHSCROLL + LTEXT "Cell Phone:", IDC_STATIC, 391, 43, 66, 8, SS_LEFT + EDITTEXT IDC_EDIT_CELL_EC, 391, 53, 71, 12, ES_AUTOHSCROLL + RTEXT "Employment Phone:", IDC_STATIC, 391, 69, 66, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER_PHONE_EC, 391, 78, 71, 12, ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Next of Kin", IDC_STATIC, 265, 106, 205, 91 + LTEXT "Name: ", IDC_STATIC, 274, 117, 77, 8, SS_LEFT + EDITTEXT IDC_EDIT_NAME_NOK, 274, 127, 110, 12, ES_AUTOHSCROLL + LTEXT "Relationship to patient:", IDC_STATIC, 274, 144, 77, 8, SS_LEFT + EDITTEXT IDC_EDIT_RELATION_NOK, 274, 154, 110, 12, ES_AUTOHSCROLL + LTEXT "Employer:", IDC_STATIC, 274, 170, 41, 8, SS_LEFT + EDITTEXT IDC_EDIT_EMPLOYER_NOK, 274, 179, 110, 12, ES_AUTOHSCROLL + LTEXT "Phone:", IDC_STATIC, 391, 117, 66, 8, SS_LEFT + EDITTEXT IDC_EDIT_PHONE_NOK, 391, 127, 71, 12, ES_AUTOHSCROLL + LTEXT "Cell Phone:", IDC_STATIC, 391, 144, 66, 8, SS_LEFT + EDITTEXT IDC_EDIT_CELL_NOK, 391, 154, 71, 12, ES_AUTOHSCROLL + RTEXT "Employment Phone:", IDC_STATIC, 391, 170, 66, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER_PHONE_NOK, 391, 179, 71, 12, ES_AUTOHSCROLL | ES_NUMBER +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_HISTORY DIALOGEX 0, 0, 475, 202 +STYLE DS_3DLOOK | DS_CONTROL | DS_SHELLFONT | WS_CAPTION | WS_CHILDWINDOW | WS_TABSTOP +CAPTION "History" +FONT 10, "Tahoma", 400, 0, 0 +{ + GROUPBOX "Indicate if you or anyone in your family has (or has had) any of these conditions:", IDC_STATIC, 5, 5, 465, 192 + CTEXT "Yourself", IDC_STATIC, 6, 17, 229, 10, SS_CENTER + CONTROL "", IDC_LV_SELF, WC_LISTVIEW, WS_TABSTOP | LVS_ALIGNLEFT | LVS_SINGLESEL | LVS_REPORT, 5, 30, 229, 167 + CTEXT "Family Member", IDC_STATIC, 241, 17, 229, 10, SS_CENTER + CONTROL "", IDC_LV_FAMILY, WC_LISTVIEW, WS_TABSTOP | LVS_ALIGNLEFT | LVS_SINGLESEL | LVS_REPORT, 241, 30, 229, 167 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_INSURANCE DIALOGEX 0, 0, 475, 202 +STYLE DS_3DLOOK | DS_CONTROL | DS_SHELLFONT | WS_CAPTION | WS_CHILDWINDOW | WS_TABSTOP +CAPTION "Insurance" +FONT 10, "Tahoma", 400, 0, 0 +{ + GROUPBOX "Primary Insurance", IDC_STATIC, 5, 5, 225, 192 + LTEXT "Insurance Company Name: ", IDC_STATIC, 28, 16, 95, 8, SS_LEFT + EDITTEXT IDC_EDIT_NAME_PI, 28, 26, 110, 12, ES_AUTOHSCROLL + LTEXT "Group", IDC_STATIC, 152, 16, 65, 8, SS_LEFT + EDITTEXT IDC_EDIT_GROUP_PI, 152, 26, 65, 12, ES_AUTOHSCROLL + LTEXT "Effectiv Date:", IDC_STATIC, 28, 43, 48, 8, SS_LEFT + EDITTEXT IDC_EDIT_DATE1_PI, 28, 53, 17, 12, ES_AUTOHSCROLL | ES_NUMBER + CTEXT "/", IDC_STATIC, 47, 55, 8, 8, SS_CENTER + EDITTEXT IDC_EDIT_DATE2_PI, 58, 53, 17, 12, ES_AUTOHSCROLL | ES_NUMBER + CTEXT "/", IDC_STATIC, 78, 55, 8, 8, SS_CENTER + EDITTEXT IDC_EDIT_DATE3_PI, 88, 53, 17, 12, ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Certificate Number:", IDC_STATIC, 124, 43, 65, 8, SS_LEFT + EDITTEXT IDC_EDIT_CERTIFICATE_PI, 124, 53, 93, 12, ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Subscriber", IDC_STATIC, 20, 138, 198, 58 + RTEXT "Name:", IDC_STATIC, 23, 150, 41, 8, SS_RIGHT + EDITTEXT IDC_EDIT_SUBSCRIBER_PI, 67, 148, 144, 12, ES_AUTOHSCROLL + RTEXT "Employer:", IDC_STATIC, 23, 166, 41, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER_PI, 67, 164, 144, 12, ES_AUTOHSCROLL + RTEXT "Relationship to patient:", IDC_STATIC, 23, 184, 78, 8, SS_RIGHT + EDITTEXT IDC_EDIT_RELATION_PI, 104, 182, 107, 12, ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Insurance Company Address", IDC_STATIC, 19, 69, 198, 62 + RTEXT "Street:", IDC_STATIC, 28, 82, 35, 8, SS_RIGHT + EDITTEXT IDC_EDIT_ADDRESS_PI, 66, 80, 143, 12, ES_AUTOHSCROLL + RTEXT "City:", IDC_STATIC, 28, 98, 35, 8, SS_RIGHT + EDITTEXT IDC_EDIT_CITY_PI, 65, 96, 59, 12, ES_AUTOHSCROLL + RTEXT "State:", IDC_STATIC, 127, 98, 20, 8, SS_RIGHT + EDITTEXT IDC_EDIT_STATE_PI, 150, 96, 13, 12, ES_AUTOHSCROLL | ES_UPPERCASE + RTEXT "Zip:", IDC_STATIC, 164, 98, 15, 8, SS_RIGHT + EDITTEXT IDC_EDIT_ZIP_PI, 182, 96, 26, 12, ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Phone 1:", IDC_STATIC, 28, 114, 35, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PHONE1_PI, 65, 112, 51, 12, ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Phone 2:", IDC_STATIC, 116, 114, 31, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PHONE2_PI, 150, 112, 58, 12, ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Secondary Insurance", IDC_STATIC, 245, 5, 225, 192 + LTEXT "Insurance Company Name: ", IDC_STATIC, 268, 16, 95, 8, SS_LEFT + EDITTEXT IDC_EDIT_NAME_SI, 268, 26, 110, 12, ES_AUTOHSCROLL + LTEXT "Group", IDC_STATIC, 392, 16, 65, 8, SS_LEFT + EDITTEXT IDC_EDIT_GROUP_SI, 392, 26, 65, 12, ES_AUTOHSCROLL + LTEXT "Effectiv Date:", IDC_STATIC, 268, 43, 48, 8, SS_LEFT + EDITTEXT IDC_EDIT_DATE1_SI, 268, 53, 17, 12, ES_AUTOHSCROLL | ES_NUMBER + CTEXT "/", IDC_STATIC, 287, 53, 8, 8, SS_CENTER + EDITTEXT IDC_EDIT_DATE2_SI, 298, 53, 17, 12, ES_AUTOHSCROLL | ES_NUMBER + CTEXT "/", IDC_STATIC, 318, 53, 8, 8, SS_CENTER + EDITTEXT IDC_EDIT_DATE3_SI, 328, 53, 17, 12, ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Certificate Number:", IDC_STATIC, 364, 43, 65, 8, SS_LEFT + EDITTEXT IDC_EDIT_CERTIFICATE_SI, 364, 53, 93, 12, ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Subscriber", IDC_STATIC, 259, 138, 198, 58 + RTEXT "Name:", IDC_STATIC, 263, 150, 41, 8, SS_RIGHT + EDITTEXT IDC_EDIT_SUBSCRIBER_SI, 307, 148, 144, 12, ES_AUTOHSCROLL + RTEXT "Employer:", IDC_STATIC, 263, 166, 41, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER_SI, 307, 164, 144, 12, ES_AUTOHSCROLL + RTEXT "Relationship to patient:", IDC_STATIC, 263, 184, 78, 8, SS_RIGHT + EDITTEXT IDC_EDIT_RELATION_SI, 343, 182, 107, 12, ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Insurance Company Address", IDC_STATIC, 259, 69, 198, 62 + RTEXT "Street:", IDC_STATIC, 268, 80, 35, 8, SS_RIGHT + EDITTEXT IDC_EDIT_ADDRESS_SI, 306, 80, 143, 12, ES_AUTOHSCROLL + RTEXT "City:", IDC_STATIC, 268, 96, 35, 8, SS_RIGHT + EDITTEXT IDC_EDIT_CITY_SI, 305, 96, 59, 12, ES_AUTOHSCROLL + RTEXT "State:", IDC_STATIC, 367, 96, 20, 8, SS_RIGHT + EDITTEXT IDC_EDIT_STATE_SI, 390, 96, 13, 12, ES_AUTOHSCROLL | ES_UPPERCASE + RTEXT "Zip:", IDC_STATIC, 404, 96, 15, 8, SS_RIGHT + EDITTEXT IDC_EDIT_ZIP_SI, 422, 96, 26, 12, ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Phone 1:", IDC_STATIC, 268, 112, 35, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PHONE1_SI, 305, 112, 51, 12, ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Phone 2:", IDC_STATIC, 356, 112, 31, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PHONE2_SI, 390, 112, 58, 12, ES_AUTOHSCROLL | ES_NUMBER +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PATIENT DIALOGEX 0, 0, 475, 202 +STYLE DS_3DLOOK | DS_CONTROL | DS_SHELLFONT | WS_CAPTION | WS_CHILDWINDOW | WS_TABSTOP +CAPTION "Patient" +FONT 10, "Tahoma", 400, 0, 0 +{ + GROUPBOX "Patient", IDC_STATIC, 5, 5, 244, 65 + LTEXT "Name (Last, First, Middle):", IDC_STATIC, 14, 16, 95, 8, SS_LEFT + EDITTEXT IDC_EDIT_NAME, 14, 26, 110, 12, ES_AUTOHSCROLL + LTEXT "Also known as / Maiden name:", IDC_STATIC, 136, 16, 105, 8, SS_LEFT + EDITTEXT IDC_EDIT_AKA, 136, 26, 105, 12, ES_AUTOHSCROLL + LTEXT "Date of birth:", IDC_STATIC, 14, 43, 48, 8, SS_LEFT + EDITTEXT IDC_EDIT_DOB1, 14, 53, 17, 12, ES_AUTOHSCROLL | ES_NUMBER + CTEXT "/", IDC_STATIC, 33, 55, 8, 8, SS_CENTER + EDITTEXT IDC_EDIT_DOB2, 44, 53, 17, 12, ES_AUTOHSCROLL | ES_NUMBER + CTEXT "/", IDC_STATIC, 64, 55, 8, 8, SS_CENTER + EDITTEXT IDC_EDIT_DOB3, 74, 53, 17, 12, ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Age:", IDC_STATIC, 102, 43, 22, 8, SS_LEFT + EDITTEXT IDC_EDIT_AGE, 102, 53, 22, 12, ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Social Security Number:", IDC_STATIC, 136, 43, 86, 8, SS_LEFT + EDITTEXT IDC_EDIT_SSN1, 136, 53, 19, 12, ES_AUTOHSCROLL | ES_NUMBER + CTEXT "-", IDC_STATIC, 195, 54, 8, 8, SS_CENTER + EDITTEXT IDC_EDIT_SSN2, 172, 53, 19, 12, ES_AUTOHSCROLL | ES_NUMBER + CTEXT "-", IDC_STATIC, 159, 54, 8, 8, SS_CENTER + EDITTEXT IDC_EDIT_SSN3, 209, 53, 31, 12, ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Sex", IDC_STATIC, 258, 6, 35, 37 + AUTORADIOBUTTON "M", IDC_RB_M, 269, 16, 15, 8, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "F", IDC_RB_F, 269, 30, 15, 8 + GROUPBOX "Language", IDC_STATIC, 311, 6, 159, 37 + AUTORADIOBUTTON "Chinese", IDC_RB_CHINESE, 322, 16, 39, 8, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "English", IDC_RB_ENGLISH, 322, 30, 39, 8 + AUTORADIOBUTTON "French", IDC_RB_FRENCH, 374, 16, 39, 8 + AUTORADIOBUTTON "German", IDC_RB_GERMAN, 374, 30, 39, 8 + AUTORADIOBUTTON "Spanish", IDC_RB_SPANISH, 422, 16, 39, 8 + AUTORADIOBUTTON "Other", IDC_RB_OTHER, 422, 30, 39, 8 + LTEXT "Religon:", IDC_STATIC, 258, 54, 30, 8, SS_LEFT + EDITTEXT IDC_EDIT_RELIGON, 289, 53, 72, 12, ES_AUTOHSCROLL + LTEXT "Church:", IDC_STATIC, 373, 54, 30, 8, SS_LEFT + EDITTEXT IDC_EDIT_CHURCH, 405, 53, 61, 12, ES_AUTOHSCROLL + GROUPBOX "Race", IDC_STATIC, 5, 75, 184, 37 + AUTORADIOBUTTON "African American", IDC_RB_AFRICAN_AMERICAN, 14, 84, 68, 8, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "Native American", IDC_RB_NATIVE_AMERICAN, 14, 98, 68, 8 + AUTORADIOBUTTON "Asian", IDC_RB_ASIAN, 91, 84, 39, 8 + AUTORADIOBUTTON "Caucasian", IDC_RB_CAUCASIAN, 91, 98, 47, 8 + AUTORADIOBUTTON "Hispanic", IDC_RB_HISPANIC, 146, 84, 39, 8 + AUTORADIOBUTTON "Other", IDC_RB_OTHER_RACE, 146, 98, 39, 8 + GROUPBOX "Marital Status", IDC_STATIC, 204, 75, 265, 37 + AUTORADIOBUTTON "Married", IDC_RB_MARRIED, 214, 84, 41, 8, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "Single", IDC_RB_SINGLE, 214, 98, 41, 8 + AUTORADIOBUTTON "Never Married", IDC_RB_NEVER_MARRIED, 269, 84, 65, 8 + AUTORADIOBUTTON "Legally Separated", IDC_RB_LEGALLY_SEPARATED, 269, 98, 73, 8 + AUTORADIOBUTTON "Life Partner", IDC_RB_LIFEPARTNER, 351, 83, 53, 8 + AUTORADIOBUTTON "Divorced", IDC_RB_DIVORCED, 415, 83, 48, 8 + AUTORADIOBUTTON "Widowed", IDC_RB_WIDOWED, 351, 98, 54, 8 + AUTORADIOBUTTON "Other", IDC_RB_OTHER_MARITAL, 415, 98, 39, 8 + GROUPBOX "Address", IDC_STATIC, 5, 119, 144, 77 + RTEXT "Street:", IDC_STATIC, 12, 132, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PATIENT_ADDRESS, 38, 130, 107, 12, ES_AUTOHSCROLL + RTEXT "City:", IDC_STATIC, 12, 148, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PATIENT_CITY, 38, 146, 63, 12, ES_AUTOHSCROLL + RTEXT "State:", IDC_STATIC, 105, 148, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PATIENT_STATE, 131, 146, 13, 12, ES_AUTOHSCROLL | ES_UPPERCASE + RTEXT "Zip:", IDC_STATIC, 12, 164, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PATIENT_ZIP, 38, 162, 26, 12, ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Email:", IDC_STATIC, 77, 164, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMAIL, 103, 162, 42, 12, ES_AUTOHSCROLL + RTEXT "Phone:", IDC_STATIC, 12, 180, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PATIENT_PHONE, 38, 178, 35, 12, ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Cell:", IDC_STATIC, 77, 180, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PATIENT_CELL, 103, 178, 42, 12, ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Employment", IDC_STATIC, 165, 119, 208, 77 + RTEXT "Employer:", IDC_STATIC, 168, 132, 34, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER, 206, 130, 100, 12, ES_AUTOHSCROLL + RTEXT "Street:", IDC_STATIC, 168, 147, 34, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER_STREET, 206, 145, 100, 12, ES_AUTOHSCROLL + RTEXT "City:", IDC_STATIC, 168, 163, 34, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER_CITY, 206, 161, 60, 12, ES_AUTOHSCROLL + RTEXT "State:", IDC_STATIC, 269, 163, 21, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER_STATE, 293, 161, 13, 12, ES_AUTOHSCROLL | ES_UPPERCASE + RTEXT "Zip:", IDC_STATIC, 168, 180, 34, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER_ZIP, 206, 178, 26, 12, ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Phone:", IDC_STATIC, 307, 133, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER_PHONE, 333, 131, 35, 12, ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Ext:", IDC_STATIC, 307, 147, 24, 8, SS_RIGHT + EDITTEXT IDC_EDIT_EMPLOYER_EXT, 333, 145, 35, 12, ES_AUTOHSCROLL | ES_NUMBER + RTEXT "Occupation:", IDC_STATIC, 238, 180, 43, 8, SS_RIGHT + EDITTEXT IDC_EDIT_OCCUPATION, 283, 178, 84, 12, ES_AUTOHSCROLL + GROUPBOX "Primary Care", IDC_STATIC, 385, 119, 85, 77 + LTEXT "Primary Physician:", IDC_STATIC, 395, 132, 66, 8, SS_LEFT + EDITTEXT IDC_EDIT_PHYSICIAN, 395, 145, 71, 12, ES_AUTOHSCROLL + RTEXT "Phone - Extension:", IDC_STATIC, 388, 163, 66, 8, SS_RIGHT + EDITTEXT IDC_EDIT_PHYSICIAN_PHONE, 395, 178, 71, 12, ES_AUTOHSCROLL | ES_NUMBER +} diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews.h b/modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews.h new file mode 100644 index 0000000..4fb3605 --- /dev/null +++ b/modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews.h @@ -0,0 +1,61 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_LISTVIEWS 100 +#define IDC_TAB 102 +#define IDC_PB_BACKWARD 103 +#define IDC_PB_FORWARD 105 +#define IDC_PB_ADDRECORD 107 +#define IDD_PAGE 200 +#define IDC_LISTVIEW 208 +#define IDD_ADDRESS 300 +#define IDC_RB_MALE 301 +#define IDC_RB_FEMALE 302 +#define IDC_EDIT_FNAME 303 +#define IDC_EDIT_LNAME 304 +#define IDC_EDIT_STREET 305 +#define IDC_EDIT_CITY 306 +#define IDC_EDIT_AGE 307 +#define IDC_EDIT_STATE 308 +#define IDC_EDIT_ZIPCODE 309 +#define IDC_PB_EDITRECORD 1001 +#define IDC_CK_INFOTIPS 1002 +#define IDC_CHK_EDITABLE 1003 diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews.rc b/modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews.rc new file mode 100644 index 0000000..3a965d7 --- /dev/null +++ b/modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews.rc @@ -0,0 +1,97 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "oodListViews.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ADDRESS DIALOG 9, 23, 281, 140 +STYLE DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU +CAPTION "Add New Record" +FONT 10, "MS Shell Dlg" +{ + LTEXT "First name:", -1, 11, 26, 39, 8, SS_LEFT + EDITTEXT IDC_EDIT_FNAME, 54, 25, 71, 12, ES_AUTOHSCROLL + LTEXT "Last name:", -1, 134, 26, 40, 8, SS_LEFT + EDITTEXT IDC_EDIT_LNAME, 178, 25, 93, 12, ES_AUTOHSCROLL + LTEXT "Street:", -1, 11, 49, 38, 8, SS_LEFT + EDITTEXT IDC_EDIT_STREET, 54, 48, 217, 12 + LTEXT "City:", -1, 11, 69, 38, 8, SS_LEFT + EDITTEXT IDC_EDIT_CITY, 54, 68, 73, 12 + LTEXT "State:", -1, 134, 69, 21, 8, SS_LEFT + EDITTEXT IDC_EDIT_STATE, 159, 68, 19, 12, ES_UPPERCASE + LTEXT "Zip Code:", -1, 198, 69, 37, 8, SS_LEFT + EDITTEXT IDC_EDIT_ZIPCODE, 240, 68, 31, 12, ES_NUMBER | ES_UPPERCASE + LTEXT "Age:", -1, 11, 92, 19, 8, SS_LEFT + EDITTEXT IDC_EDIT_AGE, 54, 91, 23, 12, ES_NUMBER + AUTORADIOBUTTON "Male", IDC_RB_MALE, 100, 91, 27, 12, WS_GROUP + AUTORADIOBUTTON "Female", IDC_RB_FEMALE, 141, 91, 41, 12 + AUTOCHECKBOX "Record can be edited", IDC_CHK_EDITABLE, 11, 116, 84, 14, BS_VCENTER + DEFPUSHBUTTON "OK", IDOK, 155, 116, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 221, 117, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_LISTVIEWS DIALOG 0, 0, 400, 242 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "List Views" +FONT 10, "MS Shell Dlg" +{ + CONTROL "", IDC_TAB, WC_TABCONTROL, WS_TABSTOP, 10, 10, 380, 175 + AUTOCHECKBOX "Use Info Tips", IDC_CK_INFOTIPS, 10, 194, 81, 13 + PUSHBUTTON "Backward", IDC_PB_BACKWARD, 10, 218, 55, 14 + PUSHBUTTON "Forward", IDC_PB_FORWARD, 72, 218, 55, 14 + PUSHBUTTON "Add Record", IDC_PB_ADDRECORD, 134, 218, 55, 14 + PUSHBUTTON "Edit Record", IDC_PB_EDITRECORD, 197, 218, 55, 14 + DEFPUSHBUTTON "OK", IDOK, 275, 218, 55, 14 + PUSHBUTTON "Cancel", IDCANCEL, 335, 218, 55, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PAGE DIALOG 0, 0, 380, 160 +STYLE DS_CONTROL | DS_SHELLFONT | WS_CHILDWINDOW +FONT 10, "MS Shell Dlg" +{ + CONTROL "", IDC_LISTVIEW, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_EDITLABELS | LVS_LIST | LVS_SHOWSELALWAYS, 3, 3, 368, 154 +} diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews1.bmp b/modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..310956b90d736e00c56a458f4372d20d242653f6 GIT binary patch literal 502 zcmaKm!3}^g2t_gR=pc?^yt|HPM(Y4gx{W6j{LoUZu~MPH>lfDT7|3i#oZ$<6f)6wz z5^>>HG=TxpV9pmJQaDox0YK~{5zXK@+S2;Abf?cOdf)FS6ghFsVtv>=fT{?;^_8Eo p(RopM^8Yx=x6j8GWs#OkOg6a7p;O@x7u&2eU!}%7`@gn%mlr>4ki`H1 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews2.bmp b/modules/windows/oodialog/propertysheet.tabControls/rc/oodListViews2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1f18a031407a956eb4e030264950632bd0ede0a5 GIT binary patch literal 1142 zcmbu7yKTfU42BsXjUXJd!j%~#NS}4C_6TYXFXI7Rc!9&Mz*dF9{FKikB?Fftv?YuD z_>!#epW8bXxncgq_`+ zEX%~L`X}dQUKSTGfwNanJf`U-|6jbe4{`fx`{TRH>N)xTd(O0gy92stylo(`^1w$z z?)cu0HN;8Fr^8)B8X=(?SQ}Vtx-*}UF;@38&jIP$_~i2wco!dnt3QHUy8>-QNG-_9 z&0R>_hs&`cE^2ib)&!%SAGlAa_s?V1LvtSmf7Fh9zmBaX=UQEzDeH9fBaHi&Y674s z=@A;wIkR!5qT2y-jM3uJA9UZ426Q@Gc9cOeuWuCTQmbRp?oVWEv3D)&^|3xqMrXLo I_L7_HFC?l$IsgCw literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/propertySheetDemoListView.bmp b/modules/windows/oodialog/propertysheet.tabControls/rc/propertySheetDemoListView.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2414bdbe33a79efad4289230475e449f7b60984e GIT binary patch literal 2102 zcmeH_F_OYC3`L!oV#_@SC!l8N_x{HT|36udAsJH8?L;%ilA`w|Yk2(KehPNGlya4K z*ZI|%O8cPvo-HJovMk~4)ttF=1Lp?*-v;XUHh1e?z!BK+t&J}9rz%e(KHfoem5R5ZxKu5`SDZSlQa+`=36qy5 zV7n|}*dhZjm~C5rpZ6CYLQ@a$fw!C$c|Z=%_|e}ekHFc^f5e*}`!l;+dddNIiv4-= z9N#GWYj4OujnUveb{aenj~~Sh?ds+NMI3Ijx=Fv{$2@yOBvfN^s}R5UUq7#tjI<#} NXlj0bv&?*PKLOzk55)ig literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/propertySheetDemoTab.bmp b/modules/windows/oodialog/propertysheet.tabControls/rc/propertySheetDemoTab.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7b305ce0e088414a1b84a5d677af90692c33b244 GIT binary patch literal 7734 zcmeH}O>%=U429hrblFuW%bpmlww!7G%6!@3cW`78a%ITzZoUFN+V=6aWTB(s zCy&4`My;hOpK0D)yiAiFyyJep%Mf`*!^vU?-w>#ndC20rup9;?V8UrxIKD3ACl67E zruK$QH8ijH!tXQg%}!3;%NKBKK=Z)U6&yu`zBQZG4(N`>E3dYZFV^yp^95)TD^m@= zD>X=gFB}y$-<35Ig0B@T&*o4fRKblvsX`IM>wqg^OZ^1$X7tysjF#437{?vx*Sj!mJLjk9oz9BUpv%MG}C0qy$hDGL+nEB0#FRX z4pNhFKwVgrF5h3Z0arv>xJ3UAF=(<_CWVwmY&8{Le~N`EQd{|gtP1oSVS!q0O1upD zis|d-*nV(bfux+%X2@8@+486stLm_eX|hu^I;?fL(q)-K7o$Z15L*!yPM$^VbgiZP Zzdi$&Y;Ez{hje6*vUu$)bp4lR;2S3FB)0$n literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/propertySheetDemoTreeView.bmp b/modules/windows/oodialog/propertysheet.tabControls/rc/propertySheetDemoTreeView.bmp new file mode 100644 index 0000000000000000000000000000000000000000..19cb2476f3680e351b0ac86c4262754b05350625 GIT binary patch literal 11894 zcmd^^y>A@H8OFziizO9g!O|58R!I{U{sU+PYy(#M3j(kTz|QrSD+I<7u6!v(wsxg9 zU}04O0uWHj2!>#{X@t=SggZdO_<5dpzIJbUBxNgx>6gd3+4fzR*QLeadG8nIM*(>x3@n5Y7Cfbb+6x%H-WD$9(3!SS)7! zBFq+DFRwK2wfDidBi`OMecx5|i5m*Hx)`4PVG00;CFG4!Hr`UW3H-0W4c?W$K_OYw zgs!F7YXfX>9OxS~19>Ol{=)QqVe)VKHh&^-x4HcZ?^5*b9e^Jn|2BBLHtL&z1h?t> zrh!9Q(6tZDW?b^l{yU9Naw+#N9#P)-B3|FKvG|F+YkiylMjKT4-QfM^_!u3vkUbt4 z#Mydu8i}5QYcUNXMNjC1>k@C zRr-^cd$Rq+buDkobQ7)`s9iu{eJ2gb9zjzR?>H9e9WIRc6eq$kXP+#9Ve*gZhtCR|dTn$%t z8{Xbw0-T@1E3^9mPbX=wl6dDA zQ1X5vpThDq`I3P{83EzTY(*7b$2&ax9_18RttsBymc{Trcym6A4Zv*+uN(<@FO>f7 zneV$MMBbFPt9TcGg8dJSzJGz8>6E@zHwE9K@Y{bsgt#N`=&WWlE`3l6`H?qbW^gBn zSjZH(6NLx7kV$|QkPpIpC*JJ#ygA-bt?Cok%!k|kZ-M3?Xx0*szlkQv8i@eQ$KbXtNyVm#6oj~3cxW35y0GAdrBZL=t+xcJY zmim51`#x7+(Km9c<`2zs@zMM9=J*7+$4Ap9N>SRGHx-qQ`ig*B9;HNo5_uPYQt{R> zfhYV)2V`Ua-L`o{L+C6`|9v|D?teNVEbbdS)Z)J@cLLCQzPE|DJ#FnzwyEuP`bKYu zbLMcqd?()4F2fJV8+d)YjEAFIq2}Z)EH2 zMFGo3-qGFhc_w&kg~B|uoAFK)7VC`lJy@P#LZltV*5RsX>5BeamJ?R|37v_3R3=ZA zR-@_gdj(&0!<`&B1TNn6-^P2=e~S?V)@!1^3J*E7SPJUE?WqEs>t5AkCMj|~uN z#Bnd$)x7CUDsOTF-fXLCajfs3mp7+LZFVqms>8T7Z?CxTg6|N3H@Fcw*4;FP$yX>v z0V=_NFL-Wc{@dn2)a3z+HcI7u5DA&Lq-?jJe+Ah6{ESzLwDH!E>&dDG%8EZBZfhxq z*ZLFk9=!EKe}cVEwcDATFJBD&$>8q8mce?0ch=9MYdwx$LAe8JL=Z#YVJ7ztO0C!~ z?lj=7A<{g{7X-tF26R>hfnyM~ePSXkW+S!)?*~dlqInYB6ZwUA(gRAxg+hda-6utrIyKcjjN_9!Crd(8^h#O){jY8p3%qazHOO2*#y3LD! znwBvW&}PnYgV`^5hcv*ks!;RD>PbqV{~k@40J4*^`JI*qO4I9%R;vQH=e<*EujegQ z+fNQ@gITIVbUl7e18%r*U`NhK-y!_|`Evqwm%`mb-&8)_fq4W99M%9A&_~NoBwlm9 zm-69=uzo=m=0WN6v)L?-4qJ}A_hVHZosf6Fezn3ojBu~#eLq@m5QkOua&UEjIaq$D z_4iS#Kk!uMMb`1=;upW32|b!v;T;{dzZ6dAJ{76Vn>$p%18$Di6~@shyeof_^!;BI z=)XYy$h&HZw2QpyyJ1!SHPNW=Jb)9thb@fu^TW)acm+{Yo1Np5kZtAlAhjm5h@Xo$ z*-Dwvw-TUs<4tD-<0VdcTkq2Z$u? +#include "ticketWizard.h" + +30 DIALOG 4, 12, 196, 143 +STYLE WS_CHILD | WS_VISIBLE | WS_BORDER +FONT 8, "System" +{ + CONTROL "MovieList", 31, "LISTBOX", LBS_NOTIFY | WS_BORDER | LBS_MULTIPLESEL | WS_BORDER | WS_VSCROLL | WS_GROUP | WS_TABSTOP, 6, 20, 93, 105 + CONTROL "Produced", 32, "EDIT", WS_BORDER | WS_GROUP | WS_TABSTOP, 109, 23, 84, 12 + CONTROL "Star", 33, "EDIT", WS_BORDER | WS_GROUP | WS_TABSTOP, 109, 53, 84, 12 + CONTROL "Director", 34, "EDIT", WS_BORDER | WS_GROUP | WS_TABSTOP, 109, 83, 84, 12 + CONTROL "with", 35, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_GROUP | WS_TABSTOP, 109, 113, 84, 33 + GROUPBOX "The upcoming movies", -1, 3, 9, 99, 118, BS_GROUPBOX + LTEXT "Produced by:", -1, 109, 10, 60, 8 + LTEXT "Starring:", -1, 109, 40, 60, 8 + LTEXT "Director:", -1, 109, 70, 83, 8 + LTEXT "with:", -1, 109, 100, 60, 8 +} + +IDD_FONT_PICKER DIALOG 0, 0, 208, 95 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU +CAPTION "Font Selection" +FONT 8, "Ms Shell Dlg 2" +BEGIN + GROUPBOX "Select a font for the upcoming example program", IDC_STATIC, 7, 7, 194, 62 + CTEXT "Font Name:", IDC_STATIC, 13, 20, 80, 8 + CTEXT "Font Size:", IDC_STATIC, 116, 20, 80, 8 + COMBOBOX IDC_COMBO_NAME, 13, 33, 80, 40, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT + COMBOBOX IDC_COMBO_SIZE, 116, 33, 80, 40, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS + DEFPUSHBUTTON "OK", IDOK, 96, 74, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 151, 74, 50, 14 +END diff --git a/modules/windows/oodialog/propertysheet.tabControls/rc/ticketWizardMovie.bmp b/modules/windows/oodialog/propertysheet.tabControls/rc/ticketWizardMovie.bmp new file mode 100644 index 0000000000000000000000000000000000000000..51be6770cd8ef9fa74f3eb0dff825b72d4555849 GIT binary patch literal 43798 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 JB5*bk_c<-Hi@B9AB^Q$`PWB=_d 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 svL!b-s<8^7F9CTE9F@DJX7tq+UT8}vAK& 0 then do + movieCombo~selectIndex(1) + movie = movieCombo~selected + self~setRadioButtons(movie) + end + + return 0 + +-- wizNext() +-- The user clicked the next button. If there is not a theater selected for +-- each selected movie, we warn the user. We use wizNext() rather than +-- killActive() because killActive is invoked both when the user clicks the +-- Back and the Next buttons. If the user is going back, we don't want to put +-- up an annoying message box. +::method wizNext unguarded + expose selectedMovies movieTheaters movieCombo + use arg propSheet + + do movie over selectedMovies + if movieTheaters[movie] == .nil then do + msg = "Warning. You have not selected a movie theater for all".endOfLine"selected movies." || - + .endOfLine~copies(2) || "Are you sure you want to go to the next page?" + title = "Theater Selection is not Complete" + buttons = "YESNO" + icon = "WARNING" + style = "DEFBUTTON2 TASKMODAL" + + ans = MessageDialog(msg, propSheet~dlgHandle, title, buttons, icon, style) + + if ans == .PlainBaseDialog~IDYES then return 0 + + movieCombo~select(movie) + self~setRadioButtons(movie) + return -1 + end + end + + return 0 + +::method queryFromSibling unguarded + expose movieTheaters + use arg arg1, arg2, propSheet + + select + when arg2 == "DATA" then do + -- arg1 is a table whose indexes are the films. Each item is a directory + -- indexes are theater, date, and time. We only fill in the theater index + -- for any movie in the table. We do not care what our status is for the + -- theater, we just fill it in. + + do movie over arg1 + d = arg1[movie] + d~theater = movieTheaters[movie] + end + end + + otherwise do + -- We do not handle any of the other queries. + nop + end + end + -- End select + + return 0 + +::method onComboUpdate + expose movieTheaters movieCombo + + movie = movieCombo~selected + self~setRadioButtons(movie) + +::method onRBClick + expose movieTheaters movieCombo + use arg id, hwnd + + movie = movieCombo~selected + movieTheaters[movie] = self~newRadioButton(id)~getText~changestr("&", "") + +::method setRadioButtons private + expose movieTheaters buttonTable + use arg movie + + movieTheater = movieTheaters[movie] + + if movieTheater == .nil then id = 0 + else id = buttonTable[movieTheater] + + .RadioButton~checkInGroup(self, IDC_RB_CINEMAS_FIRST, IDC_RB_CINEMAS_LAST, id) + + + +-- DaysDlg +-- Dialog for the fourth page (interior page, date selection.) +::class 'DaysDlg' subclass UserPSPdialog + +::method defineDialog + expose buttonTable + + dayNames = .array~of('&Monday', '&Tuesday', '&Wednesday', 'T&hursday', '&Friday', '&Saturday', 'S&unday') + + x = 21; y = 1 + self~createStaticText(-1, x, y, 100, 8, , "Selected movies:") + self~createComboBox(IDC_COMBO_DAYS, x, y + 12, 170, 75, "LIST SORT", "COMBOBOX") + + -- The space on this page is rather tight, so we try to make the group box as + -- narrow as possible without clipping any of the radio buttons. I like a + -- margin of 10 within the group box. + y += 15 * 2 + cx = self~calcWidthRadioButtons(dayNames) + cy = self~sizeY - y + self~createGroupBox(-1, x, y, cx + 20, cy, "", "Day for Movie") + + -- We create the radio buttons in a loop, so we take advantage of that to do + -- the button event connections and other related tasks. + buttonTable = .table~new + first = self~resolveSymbolicID(IDC_RB_DAYS_FIRST) + last = self~resolveSymbolicID(IDC_RB_DAYS_LAST) + + y += 10; x += 10 + do id = first to last + day = dayNames[id - first + 1] + + self~createRadioButton(id, x, y, cx, 12, "", day) + + self~connectButtonEvent(id, "CLICKED", onRBClick) + buttonTable[day~changestr("&", "")] = id + y += 14 + end + + -- The movie bitmap is 238 X 178, convert that to dialog units and place at + -- the lower right corner. + s = .Size~new(238, 178) + self~pixel2dlgUnit(s) + + x = self~sizeX - s~width + y = self~sizeY - s~height + self~createStaticImage(IDC_ST_MOVIE_BMP, x, y, s~width, s~height, "BITMAP SIZEIMAGE CENTERIMAGE") + + self~connectComboBoxEvent(IDC_COMBO_DAYS, "SELENDOK", "onComboUpdate") + +-- calcWidthRadioButtons() +-- Given an array of the labels for a group of radio buttons, calculates the +-- smallest width necessary for the buttons so that the widest label is not +-- clipped. +::method calcWidthRadioButtons private + use strict arg labels + + width = 0 + + do l over labels + size = self~getTextSizeDu(l) + if size~width > width then width = size~width + end + + -- There doesn't seem to be any direct way to find out the width of the radio + -- button bitmap, the little round circle. But, some of the MSDN doc + -- *suggests* that it is 10 x 10 in dlus. + width += 10 + return width + +::method initDialog + expose filmArray movieDays selectedMovies movieCombo + + sd = locate() + staticImage = self~newStatic(IDC_ST_MOVIE_BMP) + size = staticImage~getRealSize + image = .Image~getImage(sd'rc\ticketWizardMovie.bmp', BITMAP, size) + staticImage~setImage(image) + + filmArray = .array~new(20) + self~propSheet~querySiblings(filmArray, "FILMS") + + movieDays = .table~new + do movie over filmArray + movieDays[movie] = .nil + end + + selectedMovies = .array~new + movieCombo = self~newComboBox(IDC_COMBO_DAYS) + +::method setActive unguarded + expose movieCombo selectedMovies filmArray movieDays + use arg propSheet + + propSheet~setWizButtons("BACK NEXT") + + selected = .table~new + selectedMovies~empty + propSheet~querySiblings(selected, "SELECTED") + + movieCombo~deleteAll + + do movie over filmArray + if selected~hasIndex(movie) then do + selectedMovies~append(movie) + movieCombo~add(movie) + end + else do + movieDays[movie] = .nil + end + end + + if selected~items > 0 then do + movieCombo~selectIndex(1) + movie = movieCombo~selected + self~setRadioButtons(movie) + end + + return 0 + +-- wizNext() +-- We check if the user has set the day for each selected movie. If not, we +-- warn the user, let the user decide if he wants to continue or not. +::method wizNext unguarded + expose selectedMovies movieDays movieCombo + use arg propSheet + + do movie over selectedMovies + if movieDays[movie] == .nil then do + msg = "Warning. You have not selected a day to attend the" || .endOfLine || - + "movie for all selected movies." || .endOfLine~copies(2) || - + "Are you sure you want to go to the next page?" + title = "Date Selection is not Complete" + buttons = "YESNO" + icon = "WARNING" + style = "DEFBUTTON2 TASKMODAL" + + ans = MessageDialog(msg, propSheet~dlgHandle, title, buttons, icon, style) + + if ans == .PlainBaseDialog~IDYES then return 0 + + movieCombo~select(movie) + self~setRadioButtons(movie) + return -1 + end + end + + return 0 + +::method queryFromSibling unguarded + expose movieDays + use arg arg1, arg2, propSheet + + select + when arg2 == "DATA" then do + -- arg1 is a table whose indexes are the films. Each item is a directory + -- indexes are theater, date, and time. We only fill in the date index + -- for any movie in the table. We do not care what our status is for the + -- theater, we just fill it in. + + do movie over arg1 + d = arg1[movie] + d~date = movieDays[movie] + end + end + + otherwise do + -- We do not handle any of the other queries. + nop + end + end + -- End select + return 0 + +::method onComboUpdate + expose movieCombo + + movie = movieCombo~selected + self~setRadioButtons(movie) + +::method onRBClick + expose movieDays movieCombo + use arg id, hwnd + + movie = movieCombo~selected + movieDays[movie] = self~newRadioButton(id)~getText~changestr("&", "") + +::method setRadioButtons private + expose movieDays buttonTable + use arg movie + + movieDay = movieDays[movie] + + if movieDay == .nil then id = 0 + else id = buttonTable[movieDay] + + .RadioButton~checkInGroup(self, IDC_RB_DAYS_FIRST, IDC_RB_DAYS_LAST, id) + + + +-- TicketDlg +-- Dialog for the fifth page (interior page, time selection and review.) +::class 'TicketDlg' subclass UserPSPdialog + +::method defineDialog + expose buttonTable + + x = 21; y = 1 + self~createStaticText(-1, x, y, 100, 8, , "Selected movies:") + self~createComboBox(IDC_COMBO_TIMES, x, y + 12, 170, 75, "LIST SORT", "COMBOBOX") + + label = "Theater:" + size = self~getTextSizeDu(label) + + y += 15 *2 + x1 = x + size~width + 1 + cx1 = 170 - size~width - 1 + + self~createStaticText(-1, x, y + 2, size~width, size~height, "RIGHT", label) + self~createBlackFrame(-1, x1, y, cx1, size~height + 6, "") + self~createStaticText(IDC_ST_TIMES_THEATER, x1 + 4, y + 2, cx1 - 8, size~height, "", "") + + y += 20 + self~createStaticText(-1, x, y + 2, size~width, size~height, "RIGHT", "Date:") + self~createBlackFrame(-1, x1, y, cx1, size~height + 6, "") + self~createStaticText(IDC_ST_TIMES_DAY, x1 + 4, y + 2, cx1 - 8, size~height, "", "") + + y += size~height + 6 + 4 + cy = self~sizeY - y + self~createGroupBox(-1, x, y, 60, cy, "", "Time:") + + times = .array~of("11:00", "17:00", "20:00", "22:00") + buttonTable = .table~new + first = self~resolveSymbolicID(IDC_RB_TIMES_FIRST) + last = self~resolveSymbolicID(IDC_RB_TIMES_LAST) + + x += 10; y += 10; cx = 40; cy = 12 + do id = first to last + time = times[id - first + 1] + + self~createRadioButton(id, x, y, cx, cy, "", time) + + self~connectButtonEvent(id, "CLICKED", onRBClick) + buttonTable[time] = id + y +=15 + end + + self~connectComboBoxEvent(IDC_COMBO_TIMES, "SELENDOK", "onComboUpdate") + +::method initDialog + expose filmArray selectedMovies movieTimes movieData movieCombo staticTheater staticDay + + filmArray = .array~new(20) + self~propSheet~querySiblings(filmArray, "FILMS") + + movieTimes = .table~new + do movie over filmArray + movieTimes[movie] = .nil + end + + -- We also need a table to keep track of the selected theaters and days sent + -- to us from the Cinemas and Days pages. + movieData = .table~new + + selectedMovies = .array~new + + movieCombo = self~newComboBox(IDC_COMBO_TIMES) + staticTheater = self~newStatic(IDC_ST_TIMES_THEATER) + staticDay = self~newStatic(IDC_ST_TIMES_DAY) + +::method setActive unguarded + expose filmArray selectedMovies movieCombo movieTimes movieData + use arg propSheet + + propSheet~setWizButtons("BACK NEXT") + + propSheet~querySiblings(movieData, "DATA") + + selected = .table~new + selectedMovies~empty + movieCombo~deleteAll + + propSheet~querySiblings(selected, "SELECTED") + + do movie over filmArray + if selected~hasIndex(movie) then do + movieCombo~add(movie) + selectedMovies~append(movie) + end + else do + movieTimes[movie] = .nil + end + end + + if selected~items > 0 then do + movieCombo~selectIndex(1) + movie = movieCombo~selected + self~setMovieData(movie) + end + + return 0 + +-- wizNext() +-- This is the last page before completion. Here we do not let the user +-- proceed unless every selected movie has each item (theater, day, and time) +-- specified. +::method wizNext unguarded + expose selectedMovies movieTimes movieData movieCombo + use arg propSheet + + -- We make two loops over the selected movies. The first is to force the + -- user to select a time for very selected movie. Once that passes, we then + -- loop over the movie data and check that the day and theater is specified + -- for each selected movie. If we find a piece of information missing in the + -- second loop, we return the user to the proper page to fill in the info. + + do movie over selectedMovies + if movieTimes[movie] == .nil then do + msg = "You have not selected a time to attend the" || .endOfLine || - + "movie:" movie || .endOfLine~copies(2) || - + "You must specify a time to attend each movie." + title = "Time Selection is not Complete" + buttons = "OK" + icon = "EXCLAMATION" + + ans = MessageDialog(msg, propSheet~dlgHandle, title, buttons, icon) + + movieCombo~select(movie) + self~setMovieData(movie) + return -1 + end + end + + do movie over selectedMovies + d = movieData[movie] + if d~theater == .nil then do + msg = "You have not selected a theater for the" || .endOfLine || - + "movie:" movie || .endOfLine~copies(2) || - + "You must specify a theater, day, and time" || .endOfLine || - + "for each movie ticket." + title = "Ticket Information is not Complete" + buttons = "OK" + icon = "EXCLAMATION" + + ans = MessageDialog(msg, propSheet~dlgHandle, title, buttons, icon) + + -- Return the page index of the Cinemas page to switch to that page + return 3 + end + + if d~date == .nil then do + msg = "You have not selected a day to attend the" || .endOfLine || - + "movie:" movie || .endOfLine~copies(2) || - + "You must specify a theater, day, and time" || .endOfLine || - + "for each movie ticket." + title = "Ticket Information is not Complete" + buttons = "OK" + icon = "EXCLAMATION" + + ans = MessageDialog(msg, propSheet~dlgHandle, title, buttons, icon) + + -- Return the page index of the Days page to switch to that page + return 4 + end + end + + return 0 + +::method queryFromSibling unguarded + expose movieTimes + use arg arg1, arg2, propSheet + + select + when arg2 == "DATA" then do + do movie over arg1 + d = arg1[movie] + d~time = movieTimes[movie] + end + end + + otherwise do + nop + end + end + -- End select + + return 0 + +::method onComboUpdate + expose movieCombo + + movie = movieCombo~selected + self~setMovieData(movie) + +::method onRBClick + expose movieTimes movieCombo + use arg id, hwnd + + movie = movieCombo~selected + movieTimes[movie] = self~newRadioButton(id)~getText~changestr("&", "") + +::method setMovieData private + expose movieTimes buttonTable movieData staticTheater staticDay + use arg movie + + movieTime = movieTimes[movie] + + if movieTime == .nil then id = 0 + else id = buttonTable[movieTime] + + .RadioButton~checkInGroup(self, IDC_RB_TIMES_FIRST, IDC_RB_TIMES_LAST, id) + + d = movieData[movie] + + if d~theater == .nil then text = "==> No theater was selected" + else text = d~theater + staticTheater~setText(text) + + if d~date == .nil then text = "==> No day selected" + else text = d~date + staticDay~setText(text) + + + +-- CompletionDlg +-- Dialog for the sixth page (exterior page, review and finish.) +::class 'CompletionDlg' subclass UserPSPDialog + +::method defineDialog + expose sd + + sd = locate() + + -- Watermark bitmap is 164 x 316. The wizard does not stretch the bitmap, + -- its size remains constant. So, the width of the bitmap, in dialog units, + -- changes as the font changes. pixel2dlgUnit() will convert the pixel size + -- of the bitmap to the correct dialog units for the font in use by this + -- dialog. + s = .Size~new(164, 314) + self~pixel2dlgUnit(s) + + x = s~width + 6 -- 6 dlus right of the edge of the watermark bitmap. + y = 8 -- From the Wizard97 specification. + cx = self~sizeX - x -- To the right side of the template, the wizard automatically adds 14 dlus. + cy = 3 * 12 -- Using 12 point font, takes 3 lines for the msg. + + self~createStaticText(IDC_ST_COMPLETE_MSG, x, y, cx, cy, "", "") + + -- Things are a little crowded on this page, so only add 4 dlus of space + -- between the top message and the next control. (Contrast this to the + -- IntroDlg.) + y += cy + 4 + self~createStaticText(-1, x, y, 165, 8, , "Ticket information for your selected movie(s):") + self~createComboBox(IDC_COMBO_COMPLETE, x, y + 12, 165, 63, "LIST SORT PARTIAL", "COMBOBOX") + + label = "Theater:" + size = self~getTextSizeDu(label) + + y += 15 * 2 + x1 = x + size~width + 1 + cx1 = 165 - size~width - 1 + + self~createStaticText(-1, x, y + 2, size~width, size~height, "", label) + self~createBlackFrame(-1, x1, y, cx1, size~height + 6) + self~createStaticText(IDC_ST_COMPLETE_THEATER, x1 + 4, y + 2, cx1 - 8, size~height) + + y += 20 + self~createStaticText(-1, x, y + 2, size~width, size~height, "", "Date:") + self~createBlackFrame(-1, x1, y, cx1, size~height + 6) + self~createStaticText(IDC_ST_COMPLETE_DAY, x1 + 4, y + 2, cx1 - 8, size~height) + + y += 20 + self~createStaticText(-1, x, y + 2, size~width, size~height, "", "Time:") + self~createBlackFrame(-1, x1, y, cx1, size~height + 6) + self~createStaticText(IDC_ST_COMPLETE_TIME, x1 + 4, y + 2, cx1 - 8, size~height) + + -- ticket.bmp is 204 x 80 pixels, convert to dialog units and place it in + -- the lower left corner. At the x margin. + s = .Size~new(204, 80) + self~pixel2dlgUnit(s) + + y = self~sizeY - s~height - 4 + + if .DlgUtil~comCtl32Version < 6 then do + self~createBitmapButton(IDC_PB_TICKET_BMP, x, y, s~width, s~height, "FRAME USEPAL STRETCH GROUP", "Get the Ticket", - + 'onGetTicket', sd"rc\ticketWizardTicket.bmp") + end + else do + self~createPushButton(IDC_PB_TICKET_BMP, x, y, s~width, s~height, "GROUP", "", 'onGetTicket') + end + + self~connectComboBoxEvent(IDC_COMBO_COMPLETE, "SELENDOK", "onComboUpdate") + +::method initDialog + expose movieCombo staticTheater staticDay staticTime sd + + msg = "Thank You For Using the ooRexx Movie Ticket Selectitron Wizard" + font1 = self~createFontEx("Verdana", 12, "BOLD") + + st1 = self~newStatic(IDC_ST_COMPLETE_MSG) + st1~setFont(font1) + st1~setText(msg) + + movieCombo = self~newComboBox(IDC_COMBO_COMPLETE) + staticTheater = self~newStatic(IDC_ST_COMPLETE_THEATER) + staticDay = self~newStatic(IDC_ST_COMPLETE_DAY) + staticTime = self~newStatic(IDC_ST_COMPLETE_TIME) + + if .DlgUtil~comCtl32Version < 6 then return + + bmpButton = self~newPushButton(IDC_PB_TICKET_BMP) + size = bmpButton~getRealSize + size~width -= 10; + size~height -= 10; + + sd = locate() + image = .Image~getImage(sd'rc\ticketWizardTicket.bmp', BITMAP, size) + imageList = .ImageList~create(size, COLOR8, 1, 0) + imageList~add(image) + + align = CENTER + margin = .Rect~new(5) + bmpButton~setImageList(imageList, margin, align) + +::method setActive unguarded + expose movieCombo staticTheater staticDay staticTime info + use arg propSheet + + propSheet~setWizButtons("BACK FINISH") + + info = .table~new + movieCombo~deleteAll + + ret = propSheet~querySiblings(info, "DATA") + + do movie over info + movieCombo~add(movie) + end + + movieCombo~selectIndex(1) + movie = movieCombo~selected + self~setMovieData(movie) + + return 0 + +-- onGetTicket() +-- This method is invoked when the user pushes the fancy bitmap button. We +-- simply, programmatically, press the Finish button because the action to +-- take is the same. +::method onGetTicket unguarded + self~propSheet~pressButton("FINISH") + +-- wizFinish() +-- Invoked when the user presses the Finish button. We use the ticket +-- information to display a, (slightly,) fancy message to the user telling her +-- where and when she can get her ticket(s). +::method wizFinish unguarded + expose info + use arg propSheet + + indexes = info~allIndexes + count = indexes~items + + theaterFirst = info[indexes[1]]~theater + smallTab = " "~copies(4) + doubleSpace = .endOfLine~copies(2) + + if count == 1 then ticketWord = "ticket" + else ticketWord = count "tickets" + + msg = "You can pick your" ticketWord "up now at the" || doubleSpace || - + smallTab || theaterFirst || doubleSpace || - + "box office. Or at" + + if count > 1 then do + theaterList = "" + do i = 2 to count + index = indexes[i] + theaterList ||= smallTab || info[index]~theater || .endOfLine + end + + msg ||= " one of the following" || .endOfLine || - + "theaters:" || doubleSpace || - + theaterList || .endOfLine || - + "within an hour from now." || doubleSpace || doubleSpace + + cost = "$" || (count * 15) "dollars." + end + else do + msg ||= " any other convenient time." || doubleSpace || doubleSpace + cost = "$15 dollars." + end + + msg ||= "Your bank account is debited" cost + + title = "ooRexx Movie Ticket Selectitron" + buttons = "OK" + icon = "INFORMATION" + + ans = MessageDialog(msg, propSheet~dlgHandle, title, buttons, icon) + + return 0 + +::method onComboUpdate + expose movieCombo + + movie = movieCombo~selected + self~setMovieData(movie) + +::method setMovieData private + expose staticTheater staticDay staticTime info + use arg movie + + d = info[movie] + staticTheater~setText(d~theater) + staticDay~setText(d~date) + staticTime~setText(d~time) + + + +-- FontPicker +-- Dialog that allows the user to pick different fonts for the example program. +-- This lets the user see how defineDialog() works with different fonts. +::class 'FontPicker' subclass RcDialog + +::method initAutoDetection + self~noAutoDetection + +::method initDialog + expose nameCB sizeCB + + nameCB = self~newComboBox(IDC_COMBO_NAME) + sizeCB = self~newComboBox(IDC_COMBO_SIZE) + + names = .array~of("Default", "Tahoma", "Courier", "MS Sans Serif") + sizes = .array~of("Default", '8 point', '10 point', '12 point', '16 point') + + do name over names + nameCB~add(name) + end + nameCB~select("Default") + + do size over sizes + sizeCB~add(size) + end + sizeCB~select("Default") + +::method ok + expose nameCB sizeCB + + fontName = nameCB~selected + if fontName == "Default" then fontName = .PlainBaseDialog~getFontName + + fontSize = sizeCB~selected~word(1) + if fontSize == "Default" then fontSize = .PlainBaseDialog~getFontSize + + .PlainBaseDialog~setDefaultFont(fontName, fontSize) + return self~ok:super + + +::routine setFont + + oldFont = .directory~new + oldFont~name = .PlainBaseDialog~getFontName + oldFont~size = .PlainBaseDialog~getFontSize + + sd = locate() + dlg = .FontPicker~new(sd"rc\ticketWizard.rc", IDD_FONT_PICKER, , , , 6) + if dlg~initCode == 0 then do + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + end + + return oldFont + +::routine restoreFont + use strict arg oldFont + .PlainBaseDialog~setDefaultFont(oldFont~name, oldFont~size) + return oldFont + + diff --git a/modules/windows/oodialog/rc/AnimalGame.h b/modules/windows/oodialog/rc/AnimalGame.h new file mode 100644 index 0000000..ae47cae --- /dev/null +++ b/modules/windows/oodialog/rc/AnimalGame.h @@ -0,0 +1,67 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_ANIMALS 103 +#define IDBMP_RHINO 201 +#define IDBMP_TIGER 202 +#define IDBMP_ELEPHANT 203 +#define IDBMP_MOOSE 204 +#define IDBMP_GOAT 205 +#define IDBMP_DOG 206 +#define IDBMP_SEAL 207 +#define IDBMP_HORSE 208 +#define IDBMP_KANGURU 209 +#define IDC_PB_RHINO 2001 +#define IDC_PB_TIGER 2002 +#define IDC_PB_ELEPHANT 2003 +#define IDC_PB_MOOSE 2004 +#define IDC_PB_GOAT 2005 +#define IDC_PB_DOG 2006 +#define IDC_PB_SEAL 2007 +#define IDC_PB_HORSE 2008 +#define IDC_EDIT_RHINO 2021 +#define IDC_EDIT_TIGER 2022 +#define IDC_EDIT_ELEPHANT 2023 +#define IDC_EDIT_MOOSE 2024 +#define IDC_EDIT_GOAT 2025 +#define IDC_EDIT_DOG 2026 +#define IDC_EDIT_SEAL 2027 +#define IDC_EDIT_HORSE 2028 diff --git a/modules/windows/oodialog/rc/AnimalGame.rc b/modules/windows/oodialog/rc/AnimalGame.rc new file mode 100644 index 0000000..d723b18 --- /dev/null +++ b/modules/windows/oodialog/rc/AnimalGame.rc @@ -0,0 +1,111 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include +#include +#include +#include "AnimalGame.h" + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDBMP_DOG BITMAP "..\\bmp\\chihuahu.bmp" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDBMP_ELEPHANT BITMAP "..\\bmp\\eleph2.bmp" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDBMP_GOAT BITMAP "..\\bmp\\goat.bmp" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDBMP_HORSE BITMAP "..\\bmp\\horse.bmp" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDBMP_KANGURU BITMAP "..\\bmp\\kanguru.bmp" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDBMP_MOOSE BITMAP "..\\bmp\\moose.bmp" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDBMP_RHINO BITMAP "..\\bmp\\rhinoce.bmp" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDBMP_SEAL BITMAP "..\\bmp\\sealion.bmp" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDBMP_TIGER BITMAP "..\\bmp\\tiger.bmp" + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ANIMALS DIALOG 1, 0, 393, 314 +STYLE DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU +CAPTION "What animals are these?" +FONT 9, "Arial" +{ + EDITTEXT IDC_EDIT_RHINO, 10, 113, 92, 13, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_TIGER, 104, 113, 92, 13, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_ELEPHANT, 198, 113, 92, 13, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_MOOSE, 292, 113, 92, 13, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_GOAT, 10, 236, 92, 13, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_DOG, 104, 236, 92, 13, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_SEAL, 198, 236, 92, 13, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_HORSE, 292, 236, 92, 13, ES_AUTOHSCROLL + PUSHBUTTON "Rhino", IDC_PB_RHINO, 10, 10, 92, 100, BS_BITMAP + PUSHBUTTON "Tiger", IDC_PB_TIGER, 104, 10, 92, 100, BS_BITMAP + PUSHBUTTON "Elephant", IDC_PB_ELEPHANT, 198, 10, 92, 100, BS_BITMAP + PUSHBUTTON "Moose", IDC_PB_MOOSE, 292, 10, 92, 100, BS_BITMAP + PUSHBUTTON "Goat", IDC_PB_GOAT, 10, 134, 92, 100, BS_BITMAP + PUSHBUTTON "Dog", IDC_PB_DOG, 104, 134, 92, 100, BS_BITMAP + PUSHBUTTON "Seal", IDC_PB_SEAL, 198, 134, 92, 100, BS_BITMAP + PUSHBUTTON "Horse", IDC_PB_HORSE, 292, 134, 92, 100, BS_BITMAP + PUSHBUTTON "Help Me", IDHELP, 10, 290, 50, 14 + GROUPBOX "Write in the name of each animal below its picture", IDC_STATIC, 75, 262, 239, 42 + LTEXT "Tips: Click on an animal's picture to get a hint. Click Ok when finished, or to see which answers are correct / incorrect.", IDC_STATIC, 92, 280, 217, 20, SS_LEFT + DEFPUSHBUTTON "OK", IDOK, 333, 271, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 333, 290, 50, 14 +} diff --git a/modules/windows/oodialog/rc/calculator.rc b/modules/windows/oodialog/rc/calculator.rc new file mode 100644 index 0000000..f64bd0a --- /dev/null +++ b/modules/windows/oodialog/rc/calculator.rc @@ -0,0 +1,117 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**************************************************************************** +calculator.rc + +produced by IBM Object REXX Resource Workshop + +*****************************************************************************/ +#include + +#define DIALOG_1 100 +#define BNo1 101 +#define BNo2 102 +#define BNo3 103 +#define BNo4 104 +#define BNo5 105 +#define BNo6 106 +#define BNo7 107 +#define BNo8 108 +#define BNo9 109 +#define BNo0 110 +#define BCalc 111 +#define BClear 112 +#define TLine 113 +#define BSign 114 +#define BPoint 115 +#define BDivide 116 +#define BTimes 117 +#define BMinus 118 +#define BPlus 119 +#define BArcSin 120 +#define BSqrt 121 +#define BLog 122 +#define BPi 123 +#define BSinus 124 +#define BCosinus 125 +#define BTangens 126 +#define BArcCos 127 +#define BBackspace 128 +#define BArcTan 129 +#define BLog10 130 + +DIALOG_1 DIALOG 13, 20, 222, 212 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX +CAPTION "Calculator" +FONT 10, "MS Shell Dlg" +{ + EDITTEXT TLine, 13, 13, 188, 14, ES_READONLY | WS_BORDER | WS_TABSTOP + PUSHBUTTON "1", BNo1, 20, 39, 14, 14 + PUSHBUTTON "2", BNo2, 46, 39, 14, 14 + PUSHBUTTON "3", BNo3, 72, 39, 14, 14 + PUSHBUTTON "4", BNo4, 20, 65, 14, 14 + PUSHBUTTON "5", BNo5, 46, 65, 14, 14 + PUSHBUTTON "6", BNo6, 72, 65, 14, 14 + PUSHBUTTON "7", BNo7, 20, 91, 14, 14 + PUSHBUTTON "8", BNo8, 46, 91, 14, 14 + PUSHBUTTON "9", BNo9, 72, 91, 14, 14 + PUSHBUTTON "0", BNo0, 20, 117, 14, 14 + PUSHBUTTON "+/-", BSign, 46, 117, 14, 14 + PUSHBUTTON ".", BPoint, 72, 117, 14, 14 + PUSHBUTTON "/", BDivide, 111, 39, 14, 14 + PUSHBUTTON "*", BTimes, 111, 65, 14, 14 + PUSHBUTTON "-", BMinus, 111, 91, 14, 14 + PUSHBUTTON "+", BPlus, 111, 117, 14, 14 + PUSHBUTTON "Sqrt", BSqrt, 137, 39, 27, 14 + PUSHBUTTON "Log", BLog, 137, 65, 27, 14 + PUSHBUTTON "Log10", BLog10, 137, 91, 27, 14 + PUSHBUTTON "Pi", BPi, 137, 117, 27, 14 + PUSHBUTTON "<-", BBackspace, 177, 39, 24, 14 + PUSHBUTTON "Clear", BClear, 177, 65, 24, 14 + DEFPUSHBUTTON "=", BCalc, 177, 91, 24, 14 + PUSHBUTTON "Exit", IDOK, 177, 117, 24, 14 + PUSHBUTTON "Sin", BSinus, 20, 150, 27, 14 + PUSHBUTTON "Cos", BCosinus, 60, 150, 27, 14 + PUSHBUTTON "Tan", BTangens, 100, 150, 27, 14 + PUSHBUTTON "ArcSin", BArcSin, 20, 176, 27, 14 + PUSHBUTTON "ArcCos", BArcCos, 60, 176, 27, 14 + PUSHBUTTON "ArcTan", BArcTan, 100, 176, 27, 14 + LTEXT "ooRexx ooDialog Demo Calculator", -1, 152, 152, 50, 41 + CONTROL "", -1, "static", SS_GRAYFRAME | WS_CHILD | WS_VISIBLE, 13, 33, 81, 106 + CONTROL "", -1, "static", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE, 6, 7, 210, 197 +} diff --git a/modules/windows/oodialog/rc/exercise.rc b/modules/windows/oodialog/rc/exercise.rc new file mode 100644 index 0000000..537a320 --- /dev/null +++ b/modules/windows/oodialog/rc/exercise.rc @@ -0,0 +1,66 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/********************************************************************** + +exercise.rc + +produced by IBM Resource Workshop + +***********************************************************************/ +#include + +#define DIALOG_1 1 + +100 DIALOG 26, 28, 263, 163 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Exercise Dialog" +FONT 10, "MS Shell Dlg" +{ + CONTROL "Entryline", 10, "EDIT", WS_BORDER | WS_TABSTOP, 56, 8, 198, 14 + CONTROL "ComboBox", 11, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 59, 36, 193, 77 + AUTORADIOBUTTON "I &like OREXX", 12, 7, 66, 57, 12, BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "I &dont like OREXX", 13, 7, 79, 72, 12 + AUTOCHECKBOX "Checkbox", 14, 7, 98, 60, 12 + CONTROL "List", 15, "LISTBOX", LBS_STANDARD | WS_TABSTOP, 86, 63, 159, 57 + DEFPUSHBUTTON "OK", 1, 83, 139, 50, 14 + PUSHBUTTON "Cancel", 2, 143, 139, 50, 14 + PUSHBUTTON "Help", 9, 203, 139, 50, 14 + LTEXT "Field 1", -1, 9, 11, 43, 8 + LTEXT "Combo", -1, 9, 37, 44, 8 +} + diff --git a/modules/windows/oodialog/rc/ldvideo.h b/modules/windows/oodialog/rc/ldvideo.h new file mode 100644 index 0000000..50a5f96 --- /dev/null +++ b/modules/windows/oodialog/rc/ldvideo.h @@ -0,0 +1,56 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_VIDEO_DLG 102 +#define IDC_EDIT_TAPE_NO 1000 +#define IDC_EDIT_TAPE_LABEL 3002 +#define IDC_EDIT_FILM1 3003 +#define IDC_EDIT_FILM2 3004 +#define IDC_EDIT_FILM3 3005 +#define IDC_EDIT_FILM4 3006 +#define IDC_CB_LOCATION 3007 +#define IDC_LB_LENT_TO 3008 +#define IDC_CK_LONGPLAY 3009 +#define IDC_CK_HIFI 3010 +#define IDC_CK_WRITEPROTECT 3011 +#define IDC_RB_C120 3012 +#define IDC_RB_C180 3013 +#define IDC_RB_C240 3014 diff --git a/modules/windows/oodialog/rc/ldvideo.rc b/modules/windows/oodialog/rc/ldvideo.rc new file mode 100644 index 0000000..82c2b74 --- /dev/null +++ b/modules/windows/oodialog/rc/ldvideo.rc @@ -0,0 +1,81 @@ +/*----------------------------------------------------------------------------*/ +r/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "ldvideo.h" + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_VIDEO_DLG DIALOG 67, 32, 288, 251 +STYLE DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU +CAPTION "Video Archive" +FONT 10, "MS Shell Dlg" +{ + EDITTEXT IDC_EDIT_TAPE_NO, 64, 17, 42, 13, ES_AUTOHSCROLL + PUSHBUTTON "&Search", 3001, 110, 16, 37, 15 + EDITTEXT IDC_EDIT_TAPE_LABEL, 64, 37, 85, 13, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_FILM1, 80, 72, 175, 13, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_FILM2, 80, 92, 175, 13, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_FILM3, 80, 111, 175, 13, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_FILM4, 80, 130, 175, 13, ES_AUTOHSCROLL + COMBOBOX IDC_CB_LOCATION, 80, 168, 119, 43, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT + LISTBOX IDC_LB_LENT_TO, 80, 188, 119, 49, WS_TABSTOP | WS_HSCROLL | WS_VSCROLL | LBS_NOINTEGRALHEIGHT | LBS_SORT | LBS_NOTIFY + AUTOCHECKBOX "Long&play", IDC_CK_LONGPLAY, 172, 15, 45, 10 + AUTOCHECKBOX "&Hifi - quality", IDC_CK_HIFI, 172, 28, 53, 10 + AUTOCHECKBOX "&Writeprotect", IDC_CK_WRITEPROTECT, 172, 41, 55, 10 + AUTORADIOBUTTON "C120", IDC_RB_C120, 232, 15, 31, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "C180", IDC_RB_C180, 232, 27, 31, 10 + AUTORADIOBUTTON "C240", IDC_RB_C240, 232, 40, 31, 10 + DEFPUSHBUTTON "OK", 1, 217, 166, 50, 14 + PUSHBUTTON "Cancel", 2, 217, 188, 50, 14 + LTEXT "Tape&number", 2008, 18, 18, 43, 11, SS_LEFT + LTEXT "Tape label", 2006, 18, 38, 38, 11, SS_LEFT + LTEXT "Film &1", 2001, 36, 74, 23, 11, SS_LEFT + LTEXT "Film 2", 2002, 36, 93, 22, 11, SS_LEFT + LTEXT "Film 3", 2003, 36, 112, 23, 11, SS_LEFT + LTEXT "Film 4", 2004, 36, 131, 24, 11, SS_LEFT + LTEXT "&Location", 2005, 36, 169, 32, 11, SS_LEFT + LTEXT "Lent to", 2007, 36, 188, 26, 11, SS_LEFT + GROUPBOX "Specification", -1, 12, 4, 145, 51 + GROUPBOX "Titles", -1, 12, 61, 261, 89 + GROUPBOX "Location and Possession", -1, 12, 156, 261, 86 + GROUPBOX "Tape&information", -1, 165, 3, 105, 51, WS_GROUP +} diff --git a/modules/windows/oodialog/rc/oodStandardDialogs.h b/modules/windows/oodialog/rc/oodStandardDialogs.h new file mode 100644 index 0000000..e74f75c --- /dev/null +++ b/modules/windows/oodialog/rc/oodStandardDialogs.h @@ -0,0 +1,69 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDI_APP_ICON 500 +#define IDD_STDDLGS 103 +#define IDC_RB_CHECKLIST 1003 +#define IDC_RB_INPUTBOX 1006 +#define IDC_RB_INTEGERBOX 1007 +#define IDC_RB_MULTIINPUTBOX 1011 +#define IDC_RB_LISTCHOICE 1012 +#define IDC_RB_MULTILISTCHOICE 1013 +#define IDC_RB_PASSWORDBOX 1017 +#define IDC_RB_SINGLESELECTION 1018 +#define IDC_RB_TIMEDMESSAGE 1019 + +#define IDD_STDRTNS 104 +#define IDI_APP_ICON_R 600 +#define IDC_RB_CHECKLIST_R 1022 +#define IDC_RB_ASKDIALOG_R 1023 +#define IDC_RB_INPUTBOX_R 1024 +#define IDC_RB_INTEGERBOX_R 1025 +#define IDC_RB_MULTIINPUTBOX_R 1026 +#define IDC_RB_LISTCHOICE_R 1027 +#define IDC_RB_MULTILISTCHOICE_R 1028 +#define IDC_RB_PASSWORDBOX_R 1029 +#define IDC_RB_SINGLESELECTION_R 1030 +#define IDC_RB_TIMEDMESSAGE_R 1031 +#define IDC_RB_ERRORDIALOG_R 1032 +#define IDC_RB_FILENAMEDIALOG_R 1033 +#define IDC_RB_INFODIALOG_R 1034 +#define IDC_RB_MESSAGEDIALOG_R 1035 diff --git a/modules/windows/oodialog/rc/oodStandardDialogs.rc b/modules/windows/oodialog/rc/oodStandardDialogs.rc new file mode 100644 index 0000000..f6da8ea --- /dev/null +++ b/modules/windows/oodialog/rc/oodStandardDialogs.rc @@ -0,0 +1,95 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "oodStandardDialogs.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_STDDLGS DIALOGEX 0, 0, 413, 201 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "User Input Common Dialog Library" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + LTEXT "The ooDialog framework provides a number of easy to use dialogs that obtain user input in a standard way. These dialogs allow programmers to include simple graphical elements in their Rexx applications and collect user input in a standard way.", IDC_STATIC, 77, 10, 258, 37, SS_LEFT + GROUPBOX "Select the Common Dialog to Display", IDC_STATIC, 11, 58, 392, 107 + AUTORADIOBUTTON "CheckList Dialog", IDC_RB_CHECKLIST, 25, 79, 90, 10 + AUTORADIOBUTTON "InputBox Dialog", IDC_RB_INPUTBOX, 159, 79, 90, 10 + AUTORADIOBUTTON "Integer Dialog", IDC_RB_INTEGERBOX, 272, 79, 90, 10 + AUTORADIOBUTTON "ListChoice Dialog", IDC_RB_LISTCHOICE, 25, 107, 90, 10 + AUTORADIOBUTTON "MultiInputBox Dialog", IDC_RB_MULTIINPUTBOX, 159, 107, 90, 10 + AUTORADIOBUTTON "MultiListChoice Dialog", IDC_RB_MULTILISTCHOICE, 272, 107, 90, 10 + AUTORADIOBUTTON "PasswordBox Dialog", IDC_RB_PASSWORDBOX, 25, 134, 90, 10 + AUTORADIOBUTTON "SingleSelection Dialog", IDC_RB_SINGLESELECTION, 159, 134, 90, 10 + AUTORADIOBUTTON "TimedMessage Dialog", IDC_RB_TIMEDMESSAGE, 272, 134, 90, 10 + DEFPUSHBUTTON "Display Selected Dialog", IDOK, 161, 177, 90, 14 + PUSHBUTTON "Close", IDCANCEL, 353, 177, 50, 14 +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_STDRTNS DIALOGEX 0, 0, 413, 201 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "User Input Common Public Routines" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + LTEXT "The ooDialog framework provides a number of easy to use public routines that obtain user input in a standard way. These routines allow the use of simple graphical elements in Rexx applications that collect user input in a standard way.", IDC_STATIC, 10, 10, 393, 18, SS_LEFT + GROUPBOX "Select the Common Public Routine to Display", IDC_STATIC, 11, 33, 392, 139 + AUTORADIOBUTTON "AskDialog Routine", IDC_RB_ASKDIALOG_R, 25, 56, 90, 10 + AUTORADIOBUTTON "CheckList Routine", IDC_RB_CHECKLIST_R, 159, 56, 90, 10 + AUTORADIOBUTTON "ErrorDialog Routine", IDC_RB_ERRORDIALOG_R, 272, 56, 90, 10 + AUTORADIOBUTTON "FileNameDialog Routine", IDC_RB_FILENAMEDIALOG_R, 25, 79, 90, 10 + AUTORADIOBUTTON "InfoDialog Routine", IDC_RB_INFODIALOG_R, 159, 79, 90, 10 + AUTORADIOBUTTON "InputBox Routine", IDC_RB_INPUTBOX_R, 272, 79, 90, 10 + AUTORADIOBUTTON "IntegerBox Routine", IDC_RB_INTEGERBOX_R, 25, 103, 90, 10 + AUTORADIOBUTTON "ListChoice Routine", IDC_RB_LISTCHOICE_R, 159, 103, 90, 10 + AUTORADIOBUTTON "MessageDialog Routine", IDC_RB_MESSAGEDIALOG_R, 272, 103, 90, 10 + AUTORADIOBUTTON "MultiInputBox Routine", IDC_RB_MULTIINPUTBOX_R, 25, 128, 90, 10 + AUTORADIOBUTTON "MultiListChoice Routine", IDC_RB_MULTILISTCHOICE_R, 159, 128, 90, 10 + AUTORADIOBUTTON "PasswordBox Routine", IDC_RB_PASSWORDBOX_R, 272, 128, 90, 10 + AUTORADIOBUTTON "SingleSelection Routine", IDC_RB_SINGLESELECTION_R, 25, 152, 90, 10 + AUTORADIOBUTTON "TimedMessage Routine", IDC_RB_TIMEDMESSAGE_R, 159, 152, 90, 10 + DEFPUSHBUTTON "Display Selected Routine", IDOK, 161, 177, 90, 14 + PUSHBUTTON "Close", IDCANCEL, 353, 177, 50, 14 +} + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_APP_ICON_R ICON ".\\oodStandardRoutines.ico" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_APP_ICON ICON ".\\oodStandardDialog.ico" diff --git a/modules/windows/oodialog/rc/oodpbar.rc b/modules/windows/oodialog/rc/oodpbar.rc new file mode 100644 index 0000000..173dfb5 --- /dev/null +++ b/modules/windows/oodialog/rc/oodpbar.rc @@ -0,0 +1,76 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**************************************************************************** + +oodpbar.rc + +*****************************************************************************/ + +#include + +#define IDD_ONE 100 +#define IDC_PBAR_A 110 +#define IDC_PBAR_B 111 +#define IDC_PBAR_C 112 +#define IDC_PBAR_D 113 +#define IDC_PBAR_E 114 + +IDD_ONE DIALOG 13, 25, 280, 180 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Progress Bars" +FONT 10, "MS Shell Dlg" +{ + CONTROL "", IDC_PBAR_A, "msctls_progress32", PBS_VERTICAL | WS_CHILD | WS_VISIBLE | WS_BORDER, 19, 22, 13, 130 + CONTROL "", IDC_PBAR_B, "msctls_progress32", PBS_SMOOTH | PBS_VERTICAL | WS_CHILD | WS_VISIBLE, 59, 22, 13, 130 + CONTROL "", IDC_PBAR_C, "msctls_progress32", PBS_VERTICAL | WS_CHILD | WS_VISIBLE | WS_BORDER, 99, 22, 13, 130 + CONTROL "", IDC_PBAR_D, "msctls_progress32", PBS_SMOOTH | PBS_VERTICAL | WS_CHILD | WS_VISIBLE, 139, 22, 13, 130 + CONTROL "", IDC_PBAR_E, "msctls_progress32", PBS_VERTICAL | WS_CHILD | WS_VISIBLE | WS_BORDER, 179, 22, 13, 130 + DEFPUSHBUTTON "Step", IDOK, 223, 13, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 223, 31, 50, 14 + PUSHBUTTON "Help", IDHELP, 223, 53, 50, 14 + LTEXT "0", 11, 14, 160, 18, 8 + LTEXT "0", 21, 54, 160, 18, 8 + LTEXT "0", 31, 94, 160, 18, 8 + LTEXT "0", 41, 136, 160, 18, 8 + LTEXT "0", 51, 175, 160, 18, 8 + LTEXT "100", -1, 14, 10, 22, 8 + LTEXT "100", -1, 54, 10, 26, 8 + LTEXT "100", -1, 94, 10, 26, 8 + LTEXT "100", -1, 135, 10, 26, 8 + LTEXT "100", -1, 175, 10, 26, 8 +} diff --git a/modules/windows/oodialog/rc/oophil1.rc b/modules/windows/oodialog/rc/oophil1.rc new file mode 100644 index 0000000..d259f74 --- /dev/null +++ b/modules/windows/oodialog/rc/oophil1.rc @@ -0,0 +1,70 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * oophil1.rc The resource script for the set up dialog for oophil.rex + */ + +#include +#include + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +101 DIALOG 86, 68, 211, 125 +STYLE DS_MODALFRAME | DS_SETFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU +CAPTION "Philosophers' Forks Setup" +FONT 10, "MS Shell Dlg" +{ + EDITTEXT 101, 87, 11, 36, 12, ES_NUMBER + CONTROL "", 107, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_SETBUDDYINT, 111, 11, 12, 12 + EDITTEXT 102, 87, 37, 36, 12, ES_NUMBER + CONTROL "", 108, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_SETBUDDYINT, 111, 37, 12, 12 + EDITTEXT 103, 87, 62, 36, 12, ES_NUMBER + CONTROL "", 109, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY | UDS_SETBUDDYINT, 111, 62, 12, 12 + CONTROL "", -1, WC_STATIC, SS_BLACKFRAME, 134, 7, 68, 50 + AUTORADIOBUTTON "&Left hand first", 104, 137, 11, 60, 12 + AUTORADIOBUTTON "&Right hand first", 105, 137, 26, 62, 12 + AUTORADIOBUTTON "&Any hand first", 106, 137, 41, 59, 12 + LTEXT "&Sleeping time (100 ms)", -1, 7, 13, 76, 8, NOT WS_GROUP | SS_LEFT + LTEXT "&Eating time (100 ms)", -1, 7, 39, 71, 8, NOT WS_GROUP | SS_LEFT + LTEXT "&Number of repeats", -1, 7, 64, 71, 8, NOT WS_GROUP | SS_LEFT + CONTROL "", -1, WC_STATIC, SS_BLACKFRAME, 3, 85, 141, 34 + AUTO3STATE "Button", 110, 5, 87, 138, 30, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | NOT WS_TABSTOP + DEFPUSHBUTTON "OK", 1, 153, 64, 50, 14 + PUSHBUTTON "Cancel", 2, 153, 84, 50, 14 + PUSHBUTTON "&Help", 9, 153, 104, 50, 14 +} diff --git a/modules/windows/oodialog/rc/oophil2.rc b/modules/windows/oodialog/rc/oophil2.rc new file mode 100644 index 0000000..bb0d748 --- /dev/null +++ b/modules/windows/oodialog/rc/oophil2.rc @@ -0,0 +1,75 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog\Samples\rc\oophil2.rc Philosophers' Forks Animation */ +/*--------------------------------------------------------------------*/ + +#include + +100 DIALOG 0, 0, 282, 236 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Philosophers' Forks Animation" +FONT 10, "MS Shell Dlg" +{ + AUTO3STATE "Button", 101, 108, 4, 65, 65, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 102, 216, 33, 65, 65, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 103, 193, 145, 65, 65, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 104, 26, 145, 65, 65, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 105, 1, 33, 65, 65, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 106, 186, 31, 15, 38, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 107, 262, 145, 15, 38, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 108, 134, 192, 15, 38, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 109, 6, 145, 15, 38, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 110, 79, 31, 15, 38, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 111, 130, 71, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 112, 238, 99, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 113, 215, 211, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 114, 48, 211, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 115, 23, 99, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 120, 91, 94, 102, 70, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 121, 108, 71, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 122, 153, 71, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 131, 216, 99, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 132, 261, 99, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 141, 193, 211, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 142, 238, 211, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 151, 26, 211, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 152, 71, 211, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 161, 1, 99, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "Button", 162, 46, 99, 20, 19, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Stop", 1, 126, 170, 31, 14 +} diff --git a/modules/windows/oodialog/rc/sample.rc b/modules/windows/oodialog/rc/sample.rc new file mode 100644 index 0000000..84d3ea0 --- /dev/null +++ b/modules/windows/oodialog/rc/sample.rc @@ -0,0 +1,63 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog\Samples\rc\sample.rc ooDialog Samples Main */ +/*--------------------------------------------------------------------*/ + +#include + +100 DIALOG 4, 32, 465, 281 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Open Object Rexx ooDialog Samples" +FONT 10, "MS Shell Dlg" +{ + PUSHBUTTON "E&xit", 2, 8, 254, 50, 14 + PUSHBUTTON "About", 9, 68, 254, 50, 14 + AUTO3STATE "video", 101, 155, 15, 85, 50, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "pet", 102, 259, 15, 85, 50, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "philosoph", 103, 155, 83, 85, 50, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "inst", 104, 259, 83, 85, 50, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "walker", 105, 155, 151, 85, 50, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "bandit", 106, 259, 151, 85, 50, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "user", 107, 155, 217, 85, 50, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "category", 108, 259, 217, 85, 50, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "tree", 109, 363, 15, 85, 50, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "list", 110, 363, 83, 85, 50, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "bar", 111, 363, 151, 85, 50, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTO3STATE "prop", 112, 363, 217, 85, 50, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP +} + diff --git a/modules/windows/oodialog/rc/walker.h b/modules/windows/oodialog/rc/walker.h new file mode 100644 index 0000000..6abba85 --- /dev/null +++ b/modules/windows/oodialog/rc/walker.h @@ -0,0 +1,55 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#define IDD_WALKER 100 +#define IDC_EDIT_MOVEX 101 +#define IDC_EDIT_MOVEY 102 +#define IDC_EDIT_DELAY 103 +#define IDC_CB_SMOOTH 104 +#define IDC_CB_GOTCHA 106 +#define IDC_PB_RESTART 107 +#define IDC_DRAW_BUTTON 105 + +#define ID_BMP_FIG1 201 +#define ID_BMP_FIG2 202 +#define ID_BMP_FIG3 203 +#define ID_BMP_FIG4 204 +#define ID_BMP_FIG5 205 +#define ID_BMP_FIG6 206 +#define ID_BMP_FIG7 207 +#define ID_BMP_FIG8 208 + diff --git a/modules/windows/oodialog/rc/walker.rc b/modules/windows/oodialog/rc/walker.rc new file mode 100644 index 0000000..ba633e7 --- /dev/null +++ b/modules/windows/oodialog/rc/walker.rc @@ -0,0 +1,71 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* samples\ooDialog\rc\walker.rc Animation demo */ +/*--------------------------------------------------------------------*/ + +#include +#include + +IDD_WALKER DIALOG 7, 19, 347, 255 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Animation Demonstration - Sprites with Open Object Rexx" +FONT 10, "MS Shell Dlg" +{ + EDITTEXT IDC_EDIT_MOVEX, 45, 23, 25, 12, ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP + EDITTEXT IDC_EDIT_MOVEY, 118, 23, 25, 12, ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP + EDITTEXT IDC_EDIT_DELAY, 199, 23, 38, 12, WS_BORDER | WS_TABSTOP + AUTOCHECKBOX "&Smooth corner wrap", IDC_CB_SMOOTH, 260, 22, 77, 15 + AUTOCHECKBOX "&Quit on 'Got-cha'", IDC_CB_GOTCHA, 12, 237, 77, 15 + PUSHBUTTON "Restart", IDC_PB_RESTART, 230, 237, 50, 14, WS_DISABLED + DEFPUSHBUTTON "OK", IDOK, 290, 237, 50, 14 + CONTROL "Button1", IDC_DRAW_BUTTON, "BUTTON", BS_OWNERDRAW | WS_TABSTOP, 3, 62, 341, 164 + CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE, 1, 58, 345, 170 + LTEXT "Move &X:", -1, 12, 25, 30, 9 + LTEXT "Move &Y:", -1, 87, 25, 28, 9 + LTEXT "&Delay:", -1, 172, 24, 24, 10 + GROUPBOX "Move sequence", -1, 1, 6, 345, 40, BS_GROUPBOX | WS_CHILD | WS_VISIBLE +} + +ID_BMP_FIG1 BITMAP "..\\bmp\\wlkfig1.bmp" +ID_BMP_FIG2 BITMAP "..\\bmp\\wlkfig2.bmp" +ID_BMP_FIG3 BITMAP "..\\bmp\\wlkfig3.bmp" +ID_BMP_FIG4 BITMAP "..\\bmp\\wlkfig4.bmp" +ID_BMP_FIG5 BITMAP "..\\bmp\\wlkfig5.bmp" +ID_BMP_FIG6 BITMAP "..\\bmp\\wlkfig6.bmp" +ID_BMP_FIG7 BITMAP "..\\bmp\\wlkfig7.bmp" +ID_BMP_FIG8 BITMAP "..\\bmp\\wlkfig8.bmp" diff --git a/modules/windows/oodialog/res/AnimalGame.dll b/modules/windows/oodialog/res/AnimalGame.dll new file mode 100644 index 0000000000000000000000000000000000000000..95990d36d82e6d1633bee04ca297e0222fc9fd52 GIT binary patch literal 264192 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 F{{>$-OOXHo literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/res/res.mak b/modules/windows/oodialog/res/res.mak new file mode 100644 index 0000000..6dc9932 --- /dev/null +++ b/modules/windows/oodialog/res/res.mak @@ -0,0 +1,71 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +#/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ +# NMAKE-compatible MAKE file for ooDialog resource DLLs + +rcflags_common = /DWIN32 /v + +all: oowalk2.dll AnimalGame.dll ..\propertySheet.tabControls\rc\PropertySheetDemo.dll \ + ..\propertySheet.tabControls\rc\TabOwnerDemo.dll ..\resizableDialogs\ResizingAdmin\rc\PropertySheetDemo.dll + +oowalk2.dll: oowalk2.res + link /NOLOGO $(@B).res /NOENTRY /DLL /MACHINE:$(MACHINE) -out:$(@B).dll + +AnimalGame.dll: AnimalGame.res + link /NOLOGO $(@B).res /NOENTRY /DLL /MACHINE:$(MACHINE) -out:$(@B).dll + +..\propertySheet.tabControls\rc\PropertySheetDemo.dll: PropertySheetDemo.res + link /NOLOGO $(@B).res /NOENTRY /DLL /MACHINE:$(MACHINE) -out:..\propertySheet.tabControls\rc\$(@B).dll + +..\propertySheet.tabControls\rc\TabOwnerDemo.dll: TabOwnerDemo.res + link /NOLOGO $(@B).res /NOENTRY /DLL /MACHINE:$(MACHINE) -out:..\propertySheet.tabControls\rc\$(@B).dll + +..\resizableDialogs\ResizingAdmin\rc\PropertySheetDemo.dll: PropertySheetDemo.res + link /NOLOGO $(@B).res /NOENTRY /DLL /MACHINE:$(MACHINE) -out:..\resizableDialogs\ResizingAdmin\rc\$(@B).dll + +# Create .res from .rc +oowalk2.res: ..\rc\walker.rc + rc $(rcflags_common) -r -fo$(@B).res ..\rc\walker.rc + +AnimalGame.res: ..\rc\AnimalGame.rc + rc $(rcflags_common) -r -fo$(@B).res ..\rc\AnimalGame.rc + +PropertySheetDemo.res: ..\propertySheet.tabControls\rc\PropertySheetDemo.rc + rc $(rcflags_common) -r -fo$(@B).res ..\propertySheet.tabControls\rc\PropertySheetDemo.rc + +TabOwnerDemo.res: ..\propertySheet.tabControls\rc\TabOwnerDemo.rc + rc $(rcflags_common) -r -fo$(@B).res ..\propertySheet.tabControls\rc\TabOwnerDemo.rc diff --git a/modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemo.h b/modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemo.h new file mode 100644 index 0000000..ba1a58e --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemo.h @@ -0,0 +1,51 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2010-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* + * Symbolic resource IDs for the dlgAreaUDemo (dlgAreUDemo.rex and + * dlgAreaUDemoTwo.rex) programs. + */ + +#define IDC_ST_STATUS 111 +#define IDC_EDIT 112 +#define IDC_PB_0 113 +#define IDC_PB_1 114 +#define IDC_PB_2 115 +#define IDC_PB_3 116 +#define IDC_PB_4 117 +#define IDC_PB_5 118 +#define IDC_PB_6 119 diff --git a/modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemo.rex b/modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemo.rex new file mode 100755 index 0000000..5ca13e7 --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemo.rex @@ -0,0 +1,101 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2006-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* DlgAreaDemo.Rex -- Demonstrate DlgArea & DlgAreaU Classes -- Feb 2006 */ + +sd = locate() +.application~useGlobalConstDir("O", sd'dlgAreaUDemo.h') + +MyDlg=.MyDialog~new +MyDlg~execute('ShowTop') + +return 0 + +::requires "ooDialog.cls" +/* ========================================================================= */ +::class MyDialog Subclass UserDialog +/* ========================================================================= */ +::method init +/* ------------------------------------------------------------------------- */ + forward class (super) continue + success=self~createCenter(250,250,'My Resizable Dialog',, + 'ThickFrame MinimizeBox MaximizeBox',,, + 'MS Sans Serif',8) + if \success then do + self~initCode = 1 + return + end + + self~connectResize('OnResize', .true) + +/* ------------------------------------------------------------------------- */ +::method defineDialog +/* ------------------------------------------------------------------------- */ +expose u + +u=.dlgAreaU~new(self) /* whole dlg */ +if u~lastError \= .nil then call errorDialog u~lastError + +u~noResizePut(IDC_PB_0) +e=.dlgArea~new(u~x , u~y , u~w('70%'), u~h('90%')) /* edit area */ +s=.dlgArea~new(u~x , u~y('90%'), u~w('70%'), u~hr ) /* status area */ +b=.dlgArea~new(u~x('70%'), u~y , u~wr , u~hr ) /* button area */ + +self~createEdit(IDC_EDIT, e~x, e~y, e~w, e~h, 'multiline', 'text') +self~createStaticText(IDC_ST_STATUS, s~x, s~y, s~w, s~h, , 'Status info appears here') + +self~createPushButton(IDC_PB_0, b~x, b~y('00%'), b~w, b~h('9%'), , 'Button' 0, 'Button'||0) +self~createPushButton(IDC_PB_1, b~x, b~y('10%'), b~w, b~h('9%'), , 'Button' 1, 'Button'||1) +self~createPushButton(IDC_PB_2, b~x, b~y('20%'), b~w, b~h('9%'), , 'Button' 2, 'Button'||2) +self~createPushButton(IDC_PB_3, b~x, b~y('30%'), b~w, b~h('9%'), , 'Button' 3, 'Button'||3) +self~createPushButton(IDC_PB_4, b~x, b~y('40%'), b~w, b~h('9%'), , 'Button' 4, 'Button'||4) +self~createPushButton(IDC_PB_5, b~x, b~y('50%'), b~w, b~h('9%'), , 'Button' 5, 'Button'||5) +self~createPushButton(IDC_PB_6, b~x, b~y('60%'), b~w, b~h('9%'), , 'Button' 6, 'Button'||6) +self~createPushButton(IDOK, b~x, b~y('90%'), b~w, b~h('9%'), 'DEFAULT', 'Ok') + +/* ------------------------------------------------------------------------- */ +::method onResize +/* ------------------------------------------------------------------------- */ +expose u +use arg dummy,sizeinfo +u~resize(self,sizeinfo) + +/* ------------------------------------------------------------------------- */ +::method unknown +/* ------------------------------------------------------------------------- */ +use arg msgname, args +if msgname~abbrev("BUTTON") then + self~newStatic(IDC_ST_STATUS)~setText('You Pressed Button' msgname~right(1)) diff --git a/modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemoThree.rex b/modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemoThree.rex new file mode 100755 index 0000000..0fcdf93 --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemoThree.rex @@ -0,0 +1,282 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2006-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * DlgAreaDemoThree.Rex + * + * Demonstrates a second approach to resizable dialogs. Essentially what this + * approach does is to defer the redrawing of the dialog controls until the + * user has finished resizing the dialog. + * + * This example is exactly like DlgAreaDemoTwo.rex, except it also demonstrates + * how to prevent the user from resizing the dialog smaller than a minimum + * size. Look at the connectResizing() method in init() and the onResizing() + * method for the code that does this. + * + * To better understand this example completely, please read the header + * comments in the DlgAreaDemoTwo.rex example. + */ + + sd = locate() + .application~useGlobalConstDir("O", sd'dlgAreaUDemo.h') + + dlg = .ResizableDialog~new + dlg~execute('ShowTop') + + return 0 + +::requires "ooDialog.cls" + +::class 'ResizableDialog' subclass UserDialog + +::method init + + forward class (super) continue + success = self~createCenter(250, 250, 'My Flicker Free Resizable Dialog', - + 'ThickFrame MinimizeBox MaximizeBox', , - + 'MS Sans Serif', 8) + if \ success then do + self~initCode = 1 + return + end + + self~connectResize('onResize', .true) + self~connectResizing('onResizing') + self~connectSizeMoveEnded('onSizeMoveEnded') + + +::method defineDialog + expose u sizing minMaximized + + u = .dlgAreaU~new(self) + if u~lastError \= .nil then call errorDialog u~lastError + + -- Tell the DialogAreaU object to not invoke the update method. + u~updateOnResize = .false + + -- We use these variables to track when to redraw, or not. + sizing = .false + minMaximized = .false + + u~noResizePut(IDC_PB_0) + e = .dlgArea~new(u~x , u~y , u~w('70%'), u~h('90%')) -- edit area + s = .dlgArea~new(u~x , u~y('90%'), u~w('70%'), u~hr ) -- status area + b = .dlgArea~new(u~x('70%'), u~y , u~wr , u~hr ) -- button area + + self~createEdit('IDC_EDIT', e~x, e~y, e~w, e~h, 'multiline') + self~createStaticText('IDC_ST_STATUS', s~x, s~y, s~w, s~h, , 'Status info appears here') + + self~createPushButton('IDC_PB_0', b~x, b~y('00%'), b~w, b~h('9%'), , 'Button' 0 , 'Button'||0) + self~createPushButton('IDC_PB_1', b~x, b~y('10%'), b~w, b~h('9%'), , 'Button' 1 , 'Button'||1) + self~createPushButton('IDC_PB_2', b~x, b~y('20%'), b~w, b~h('9%'), , 'Button' 2 , 'Button'||2) + self~createPushButton('IDC_PB_3', b~x, b~y('30%'), b~w, b~h('9%'), , 'Button' 3 , 'Button'||3) + self~createPushButton('IDC_PB_4', b~x, b~y('40%'), b~w, b~h('9%'), , 'Button' 4 , 'Button'||4) + self~createPushButton('IDC_PB_5', b~x, b~y('50%'), b~w, b~h('9%'), , 'Button' 5 , 'Button'||5) + self~createPushButton('IDC_PB_6', b~x, b~y('60%'), b~w, b~h('9%'), , 'Button' 6 , 'Button'||6) + self~createPushButton('IDOK', b~x, b~y('90%'), b~w, b~h('9%'), 'DEFAULT', 'Ok') + + +::method initDialog + expose minWidth minHeight + + -- The underlying edit controls internally resize themselves as the dialog + -- they are contained in is resized. We don't want that, so we disable that + -- behavior in the underlying edit control. + self~newEdit(IDC_EDIT)~disableInternalResize + + -- We will restrict the minimum width and minimum height to our original + -- width and height + minWidth = self~pixelCX + minHeight = self~pixelCY + + +-- The RESIZING event happens when the user is resizing the dialog, but *before* +-- the size of the dialog is actually changed. The first arg is a .RECT object +-- that describes the new size. If we change the coordinates in the rectangle, +-- and reply .true. The new size of the dialog will be our changed coordinates. +-- +-- Here, if the new size is smaller than we want, we just change the rectangle +-- coordinates to our minimum size. The 'direction' argument tells us which +-- edge of the dialog the user is dragging. We use that to decide which +-- coordinate(s) to change. +-- +-- A maximum size for the dialog could be enforced in a similar way. +::method onResizing unguarded + expose minWidth minHeight + use arg r, direction + + select + when direction == 'TOP' then do + if r~bottom - r~top < minHeight then do + r~top = r~bottom - minHeight + return .true + end + end + when direction == 'BOTTOM' then do + if r~bottom - r~top < minHeight then do + r~bottom = r~top + minHeight + return .true + end + end + when direction == 'LEFT' then do + if r~right - r~left < minWidth then do + r~left = r~right - minWidth + return .true + end + end + when direction == 'RIGHT' then do + if r~right - r~left < minWidth then do + r~right = r~left + minWidth + return .true + end + end + when direction == 'BOTTOMLEFT' then do + didChange = .false + + if r~bottom - r~top < minHeight then do + r~bottom = r~top + minHeight + didChange = .true + end + + if r~right - r~left < minWidth then do + r~left = r~right - minWidth + didChange = .true + end + + return didChange + end + when direction == 'BOTTOMRIGHT' then do + didChange = .false + + if r~bottom - r~top < minHeight then do + r~bottom = r~top + minHeight + didChange = .true + end + + if r~right - r~left < minWidth then do + r~right = r~left + minWidth + didChange = .true + end + + return didChange + end + when direction == 'TOPLEFT' then do + didChange = .false + + if r~bottom - r~top < minHeight then do + r~top = r~bottom - minHeight + didChange = .true + end + + if r~right - r~left < minWidth then do + r~left = r~right - minWidth + didChange = .true + end + + return didChange + end + when direction == 'TOPRIGHT' then do + didChange = .false + + if r~bottom - r~top < minHeight then do + r~top = r~bottom - minHeight + didChange = .true + end + + if r~right - r~left < minWidth then do + r~right = r~left + minWidth + didChange = .true + end + + return didChange + end + otherwise + nop + end + -- End select + return .false + +::method onResize unguarded + expose u sizing minMaximized lastSizeInfo + use arg sizingType, sizeinfo + + -- Save the size information so we know the final size of the dialog. + lastSizeInfo = sizeInfo + + -- The size / move ended event does not occur when the user maximizes, + -- minimizes, or restores from maximized / minimized. Because of that, we + -- need to redraw the client area under those conditions. + + if sizingType == self~SIZE_MAXIMIZED | sizingType == self~SIZE_MINIMIZED then do + minMaximized = .true + if sizingType == self~SIZE_MAXIMIZED then do + u~resize(self, sizeinfo) + self~redrawClient(.true) + end + end + else if sizingType == self~SIZE_RESTORED, minMaximized then do + minMaximized = .false + u~resize(self, sizeinfo) + self~redrawClient(.true) + end + else do + -- We are resizing now. + sizing = .true + end + + return 0 + + +::method onSizeMoveEnded unguarded + expose u sizing lastSizeInfo + + -- If we were resizing, force the dialog controls to redraw themselves. + if sizing then do + u~resize(self, lastSizeInfo) + self~redrawClient(.true) + end + + -- We are not resizing anymore. + sizing = .false + return 0 + + +::method unknown + use arg msgName, args + + if msgName~abbrev("BUTTON") then + self~newStatic(IDC_ST_STATUS)~setText('You Pressed Button' msgName~right(1)) diff --git a/modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemoTwo.rex b/modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemoTwo.rex new file mode 100755 index 0000000..fc8cffe --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/DialogAreaU/dlgAreaUDemoTwo.rex @@ -0,0 +1,194 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2006-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * DlgAreaDemoTwo.Rex + * + * Demonstrates a second approach to resizable dialogs. Essentially what this + * approach does is to defer the redrawing of the dialog controls until the + * user has finished resizing the dialog. + * + * By default, the DialogAreaU class calls a dialog method (the update method) + * that forces all the dialog controls to redraw themselves every time a resize + * event ocurrs. This causes the constant flicker seen in DlgAreaDemo.rex. + * + * The approach taken here is to tell the DialogAreaU object to *not* invoke + * the update method during the resize event. This is done by setting the + * updateOnResize attribute to false in the DialogAreaU object. + * + * Then we connect the size / move ended event to a method in our dialog. This + * event is called exactly once when the user has stopped resizing or moving + * the dialog. + * + * We keep track of whether the user is resizing, or not. When we get the size + * move ended event, if the user was resizing, we invoke the redrawClient + * method of the dialog, forcing all the dialog controls to redraw themselves + * in their new, final, position. + * + * This eliminates the flicker, but also makes it appear as though the dialog + * controls are not changing while the user is actively resizing. When the + * user stops resizing, the dialog controls "magically" appear in their new + * size and position. + * + * Which approach is better is probably a matter of personal preference. + * + * After some use of this example program, a refinement to the above algorithm + * was made. This is what is used now. Since no repainting of the dialog + * controls is done until the last resize event, there is no sense in re- + * calculating the size and position of each control on every resize event. + * + * Rather than invoke u~resize(self, sizeinfo) every single time in onResize() + * u~resize is only invoked when the dialog client area is going to be forced + * to redraw. + */ + + sd = locate() + .application~useGlobalConstDir("O", sd'dlgAreaUDemo.h') + + dlg = .ResizableDialog~new + dlg~execute('ShowTop') + + return 0 + +::requires "ooDialog.cls" + +::class 'ResizableDialog' subclass UserDialog + +::method init + + forward class (super) continue + success = self~createCenter(250, 250, 'My Flicker Free Resizable Dialog', - + 'ThickFrame MinimizeBox MaximizeBox', , - + 'MS Sans Serif', 8) + if \ success then do + self~initCode = 1 + return + end + + self~connectResize('onResize', .true) + self~connectSizeMoveEnded('onSizeMoveEnded') + + +::method defineDialog + expose u sizing minMaximized + + u = .dlgAreaU~new(self) + if u~lastError \= .nil then call errorDialog u~lastError + + -- Tell the DialogAreaU object to not invoke the update method. + u~updateOnResize = .false + + -- We use these variables to track when to redraw, or not. + sizing = .false + minMaximized = .false + + u~noResizePut(IDC_PB_0) + e = .dlgArea~new(u~x , u~y , u~w('70%'), u~h('90%')) -- edit area + s = .dlgArea~new(u~x , u~y('90%'), u~w('70%'), u~hr ) -- status area + b = .dlgArea~new(u~x('70%'), u~y , u~wr , u~hr ) -- button area + + self~createEdit(IDC_EDIT, e~x, e~y, e~w, e~h, 'multiline') + self~createStaticText(IDC_ST_STATUS, s~x, s~y, s~w, s~h, , 'Status info appears here') + + self~createPushButton(IDC_PB_0, b~x, b~y('00%'), b~w, b~h('9%'), , 'Button' 0 , 'Button'||0) + self~createPushButton(IDC_PB_1, b~x, b~y('10%'), b~w, b~h('9%'), , 'Button' 1 , 'Button'||1) + self~createPushButton(IDC_PB_2, b~x, b~y('20%'), b~w, b~h('9%'), , 'Button' 2 , 'Button'||2) + self~createPushButton(IDC_PB_3, b~x, b~y('30%'), b~w, b~h('9%'), , 'Button' 3 , 'Button'||3) + self~createPushButton(IDC_PB_4, b~x, b~y('40%'), b~w, b~h('9%'), , 'Button' 4 , 'Button'||4) + self~createPushButton(IDC_PB_5, b~x, b~y('50%'), b~w, b~h('9%'), , 'Button' 5 , 'Button'||5) + self~createPushButton(IDC_PB_6, b~x, b~y('60%'), b~w, b~h('9%'), , 'Button' 6 , 'Button'||6) + self~createPushButton(IDOK, b~x, b~y('90%'), b~w, b~h('9%'), 'DEFAULT', 'Ok') + + +::method initDialog + + -- The underlying edit controls internally resize themselves as the dialog + -- they are contained in is resized. We don't want that, so we disable that + -- behavior in the underlying edit control. + self~newEdit(IDC_EDIT)~disableInternalResize + + +::method onResize unguarded + expose u sizing minMaximized lastSizeInfo + use arg sizingType, sizeinfo + + -- Save the size information so we know the final size of the dialog. + lastSizeInfo = sizeInfo + + -- The size / move ended event does not occur when the user maximizes, + -- minimizes, or restores from maximized / minimized. Because of that, we + -- need to redraw the client area under those conditions. + + if sizingType == self~SIZE_MAXIMIZED | sizingType == self~SIZE_MINIMIZED then do + minMaximized = .true + if sizingType == self~SIZE_MAXIMIZED then do + u~resize(self, sizeinfo) + self~redrawClient(.true) + end + end + else if sizingType == self~SIZE_RESTORED, minMaximized then do + minMaximized = .false + u~resize(self, sizeinfo) + self~redrawClient(.true) + end + else do + -- We are resizing now. + sizing = .true + end + + return 0 + + +::method onSizeMoveEnded unguarded + expose u sizing lastSizeInfo + + -- If we were resizing, force the dialog controls to redraw themselves. + if sizing then do + u~resize(self, lastSizeInfo) + self~redrawClient(.true) + end + + -- We are not resizing anymore. + sizing = .false + return 0 + + +::method unknown + use arg msgName, args + + if msgName~abbrev("BUTTON") then + self~newStatic(IDC_ST_STATUS)~setText('You Pressed Button' msgName~right(1)) diff --git a/modules/windows/oodialog/resizableDialogs/ReadMe.txt b/modules/windows/oodialog/resizableDialogs/ReadMe.txt new file mode 100644 index 0000000..b234805 --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/ReadMe.txt @@ -0,0 +1,20 @@ + + + Resizable Dialogs + ================= + + +There are 2 basic ways to produce resizable dialogs in ooDialog. + +One way is to use the DlgArea and its subclass, DlgAreaU. Note that the +DlgArea class in itself does not produce a resizable dialog. It is the +DlgAreaU subclass that effectively allows resizing. + +The other way is to have a dialog class inherit the ResizingAdmin +subclass. + +This subdirectory tree contains two subdirectories that contain example +programs showing how to use both methods. Not surprisingly, the +subdirectory, DlgAreaU contains examples using the DlgAreaU method and +the subdirectory, ResizingAdmin, contains examples showing how to use +the ResizingAdmin mixin class to produce resizable dialogs. diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/PropertySheetDemo.rex b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/PropertySheetDemo.rex new file mode 100755 index 0000000..61d8048 --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/PropertySheetDemo.rex @@ -0,0 +1,922 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** Propery Sheet / Dialog Controls Example + * + * This example demonstrates how to use the PropertySheetDialog and has examples + * of using 5 dialog controls, the: List View, Tree View, Progress Bar, Track + * Bar, and Tab. + * + * Note that this example is meant to demonstrate creating a resizable + * PropertySheetDialog dialog. It is exactly the same as the + * + * oodialog\propertySheet.tabControls\PropertySheetDemo.rex + * + * example, except it is resizable. + */ + + sd = locate() + .application~setDefaults("O", sd"rc\PropertySheetDemo.h", .false) + + -- Create the 5 dialog pages. + p1 = .ListViewDlg~new(sd"rc\PropertySheetDemo.rc", IDD_LISTVIEW_DLG) + p2 = .TreeViewDlg~new(sd"rc\PropertySheetDemo.rc", IDD_TREEVIEW_DLG) + p3 = .ProgressBarDlg~new(sd"rc\PropertySheetDemo.rc", IDD_PROGRESSBAR_DLG) + p4 = .TrackBarDlg~new(sd"rc\PropertySheetDemo.rc", IDD_TRACKBAR_DLG) + p5 = .TabDlg~new(sd"rc\PropertySheetDemo.rc", IDD_TAB_DLG) + + -- Create the PropertySheetDialog using an array of the 5 dialog pages. The + -- order of the pages in the array will be the order of the pages in the tab + -- control of the property sheet. + pages = .array~of(p1, p2, p3, p4, p5) + propDlg = .PropertySheetDemoDlg~new(pages, "NOAPPLYNOW", "ooRexx Property Sheet with Controls") + + -- Do any customization of the property sheet dialog by setting the values of + -- the appropriate attributes. However, for this example we do not do any + -- customization. + + -- Show the property sheet. + propDlg~execute + + return 0 + +::requires "ooDialog.cls" + +::class 'ListViewDlg' subclass RcPSPDialog inherit ResizingAdmin + +::method defineSizing + + -- The only control in this dialog is the list-view. We define its sizing + -- so that each edge of the list-view maintains the same distance to its + -- corresponding edeg of the dialog: + self~controlSizing(IDC_LV_MAIN, - + .array~of('STATIONARY', 'LEFT'), - + .array~of('STATIONARY', 'TOP'), - + .array~of('STATIONARY', 'RIGHT'), - + .array~of('STATIONARY', 'BOTTOM') - + ) + + -- A value must be returned from the defineSizing() method. O allows the + -- dialog to continue, any other value is a failure and the dialog will be + -- ended. + return 0 + + +::method initDialog + expose lv + + -- Instantiate a Rexx list view object that represents the underlying + -- Windows list-view. The list-view style is report. + lv = self~newListView(IDC_LV_MAIN) + + -- Set the column headers + lv~insertColumn(0, "Symbol", 40) + lv~insertColumn(1, "Quote", 50) + lv~insertColumn(2, "Year high", 50) + lv~insertColumn(3, "Year low", 50) + lv~insertColumn(4, "Description", 120) + + -- Set the images for the items in the list-view. The list-view control was + -- created without the SHAREIMAGES styles, so it takes care of releasing the + -- image list when the program ends. + image = .Image~getImage(.application~srcDir"rc\propertySheetDemoListView.bmp") + imageList = .ImageList~create(.Size~new(16, 16), COLOR8, 4, 0) + if \image~isNull, \imageList~isNull then do + imageList~add(image) + lv~setImageList(imageList, SMALL) + + -- The image list makes a copy of the bitmap, so we can release it now + -- to free up some (small) amount of system resources. This is not + -- necessary, the OS will release the resource automatically when the + -- program ends. + image~release + end + + -- Fill the list-view with random data. + do ch = "A"~c2d to "Z"~c2d + q = random(200) + yh = random(400) + yh = max(yh, q) + yl = random(100) + yl = min(yl, q) + lv~addRow( , random(3), "_" || ch~d2c~copies(3) || "_", "$" || q, "$" || yh, "$" || yl, - + ch~d2c~copies(3) "is a fictitious company.") + end + + -- Add full row select and the ability to drag and drop the columns to the + -- list-view. + lv~addExtendedStyle("FULLROWSELECT HEADERDRAGDROP") + + -- Connect 2 list-view events to Rexx methods in this dialog. The double- + -- click on a list-view item, and the click on a column header events. + self~connectListViewEvent(IDC_LV_MAIN, "ACTIVATE", "onActivate") + self~connectListViewEvent(IDC_LV_MAIN, "COLUMNCLICK") + +-- Invoked when a list-view item is double-clicked. We display a message and +-- set the focus to the next item in the list. +::method onActivate + expose lv + + selectedItem = lv~focused + symbol = lv~itemText(selectedItem) + price = lv~itemText(selectedItem, 1) + + question = "You have selected the stock with symbol" symbol". Do you want to order" || .endOfLine || - + "50 shares of stock at" price"?" + placeOrder = MessageDialog(question, self~hwnd, "Place Order for Stock", "YESNO", "QUESTION", "DEFBUTTON2" ) + + cost = 50 * price~substr(2) + if placeOrder == self~constDir["IDYES"] then do + j = MessageDialog("Okay, your bank account will be debited $"cost "dollars.", self~hwnd, - + "Order Confirmation", "OK", "INFORMATION") + end + else do + j = MessageDialog("That saved you $"cost "dollars.", self~hwnd, "Order Canceled", "OK", "EXCLAMATION") + end + + lv~deselect(selectedItem) + selectedItem += 1 + lv~focus(selectedItem) + lv~select(selectedItem) + +-- Invoked when a column header of the list-view is clicked. We just show a +-- message box so that the user has some feedback. +::method OnColumnClick + use arg id, column + j = MessageDialog("Column" column + 1 "was clicked in control" id, self~hwnd, "List-View Notification") + + + +::class 'TreeViewDlg' subclass RcPSPDialog inherit ResizingAdmin + +::method initDialog + + -- Instantiate a Rexx tree view object that represents the Windows tree-view + -- control. + tv = self~newTreeView(IDC_TV_MAIN) + + -- Create and set the ImageList for the tree view items + image = .Image~getImage(.application~srcDir"rc\propertySheetDemoTreeView.bmp") + imageList = .ImageList~create(.Size~new(32, 32), COLOR8, 10, 0) + if \image~isNull, \imageList~isNull then do + imageList~add(image) + tv~setImageList(imageList, NORMAL) + image~release + end + + -- Add the tree view items. Toys will be the root (the first argument is + -- not omitted. Subitems are added by omitting the first arguments. The + -- number of arguments omitted indicates the depth of the subitem. + -- + -- The last numeric argument in some of the items is the index for the icon + -- for that item in the image list. Those items without a number will not + -- display an icon. + + tv~add("Toys", 1) + tv~add(, "Indoor", 14) + tv~add(, , "Boys", 19) + tv~add(, , , "Cowboys", 13) + tv~add(, , , "Cars", 8) + tv~add(, , , "Starwars", 9) + tv~add(, , "Girls", 0) + tv~add(, , , "Barby", 19) + tv~add(, , , "Painting", 15) + tv~add(, , , "Cooking", 13) + tv~add(, , "Adults", 17) + tv~add(, , , "Poker", 15) + tv~add(, , "Technical", 16) + tv~add(, , , "Racing cars", 8) + tv~add(, , , "Trains", 7) + tv~add(, "Outdoor", 11) + tv~add(, , "Water", 22) + tv~add(, , , "Ball", 5) + tv~add(, , , "Soft tennis", 6) + tv~add(, , "Sand", 12) + tv~add(, , , "Shovel", 12) + tv~add(, , , "Bucket", 19) + tv~add(, , , "Sandbox", 12) + tv~add(, , "Technical", 16) + tv~add(, , , "Trains", 7) + tv~add(, , , "Remote controlled", 8) + tv~add("Office Articles", 2) + tv~add( , "Tools", 16) + tv~add( , "Books", 19) + tv~add( , , "Introduction", 14) + tv~add( , , "Advanced Programming", 17) + tv~add( , , "Tips & Tricks", 16) + tv~add("Hardware", 4) + tv~add( , "Garden", 0) + tv~add( , "Handyman", 18) + tv~add( , "Household", 18) + tv~add("Furniture", 3) + tv~add( , "Standard", 12) + tv~add( , "Luxury", 21) + + -- Connecting the begin drag event and using the default tree drag handler + -- allows us to suppport drag and drop (using the default behaviour. + self~connectTreeViewEvent(IDC_TV_MAIN, "BeginDrag", "DefTreeDragHandler") + + +::class 'ProgressBarDlg' subclass RcPSPDialog inherit ResizingAdmin + +-- Define the sizing for the controls. Note that for the progress bars, we want +-- to use the default sizing so that they resize proportionally. But, we want +-- the static labels to be fixed in size and pinned to the progress bar the +-- label is for. +-- +-- The individual sizing for a control is added to the sizing table in the order +-- the sizings are defined. Then, during a resize event, the windows are sized +-- in the order they occur in the table. For any control sizing definition, the +-- pin to window has to *precede* the control in the table. Otherwise resizing +-- would not work correctly. +-- +-- What this means is that we can not pin a static control to its progress bar +-- unless the progress bar is already in the table. The defaultSizing() method +-- allows us to put a control in to the table with a minimum amount of typing. +-- +-- We also show both ways of defing the edges of a control. Using individual +-- method calls for each edge, or using the single method call, controlSizing(). +::method defineSizing + + self~noMinSize + + self~useDefaultSizing(IDC_PBAR_PROCESSA) + self~useDefaultSizing(IDC_PBAR_PROCESSB) + self~useDefaultSizing(IDC_PBAR_PROCESSC) + self~useDefaultSizing(IDC_PBAR_PROCESSD) + self~useDefaultSizing(IDC_PBAR_PROCESSE) + + self~controlLeft( IDC_ST_PROCESSA, 'STATIONARY', 'XCENTER', IDC_PBAR_PROCESSA) + self~controlTop( IDC_ST_PROCESSA, 'STATIONARY', 'TOP', IDC_PBAR_PROCESSA) + self~controlRight( IDC_ST_PROCESSA, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_PROCESSA, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_PROCESSB, 'STATIONARY', 'XCENTER', IDC_PBAR_PROCESSB) + self~controlTop( IDC_ST_PROCESSB, 'STATIONARY', 'TOP', IDC_PBAR_PROCESSB) + self~controlRight( IDC_ST_PROCESSB, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_PROCESSB, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_PROCESSC, 'STATIONARY', 'XCENTER', IDC_PBAR_PROCESSC) + self~controlTop( IDC_ST_PROCESSC, 'STATIONARY', 'TOP', IDC_PBAR_PROCESSC) + self~controlRight( IDC_ST_PROCESSC, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_PROCESSC, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_PROCESSD, 'STATIONARY', 'XCENTER', IDC_PBAR_PROCESSD) + self~controlTop( IDC_ST_PROCESSD, 'STATIONARY', 'TOP', IDC_PBAR_PROCESSD) + self~controlRight( IDC_ST_PROCESSD, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_PROCESSD, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_PROCESSE, 'STATIONARY', 'XCENTER', IDC_PBAR_PROCESSE) + self~controlTop( IDC_ST_PROCESSE, 'STATIONARY', 'TOP', IDC_PBAR_PROCESSE) + self~controlRight( IDC_ST_PROCESSE, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_PROCESSE, 'MYTOP', 'TOP') + + self~controlSizing(IDC_ST_PERCENTA, - + .array~of('STATIONARY', 'XCENTER', IDC_PBAR_PROCESSA), - + .array~of('STATIONARY', 'BOTTOM', IDC_PBAR_PROCESSA), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_ST_PERCENTB, - + .array~of('STATIONARY', 'XCENTER', IDC_PBAR_PROCESSB), - + .array~of('STATIONARY', 'BOTTOM', IDC_PBAR_PROCESSB), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_ST_PERCENTC, - + .array~of('STATIONARY', 'XCENTER', IDC_PBAR_PROCESSC), - + .array~of('STATIONARY', 'BOTTOM', IDC_PBAR_PROCESSC), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_ST_PERCENTD, - + .array~of('STATIONARY', 'XCENTER', IDC_PBAR_PROCESSD), - + .array~of('STATIONARY', 'BOTTOM', IDC_PBAR_PROCESSD), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_ST_PERCENTE, - + .array~of('STATIONARY', 'XCENTER', IDC_PBAR_PROCESSE), - + .array~of('STATIONARY', 'BOTTOM', IDC_PBAR_PROCESSE), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + return 0 + + + +::method initDialog + expose threadsStarted processes + + threadsStarted = 0 + processes = .array~of('animateProgressA', 'animateProgressB', 'animateProgressC', - + 'animateProgressD', 'animateProgressE') + + +-- The setActive event notification is sent by the property sheet to the page +-- that is about to become the active page. It is sent before the page is +-- visible. This allows the page to do any initialization necessary. For this +-- program, we use the notification to start the progress bar animation threads. +::method setActive unguarded + expose threadsStarted processes + use arg propSheet + + reply 0 + + -- If no threads are running, start a thread to run each progress bar + -- asynchronously. + if threadsStarted < 1 then do + threadsStarted = processes~items + do methodName over processes + self~start(methodName) + end + end + +-- This is the generic method that simulates some type of processing that takes +-- a long time. The progress of this processing is displayed by the progress +-- bar. to simulate a process of which the progress is displayed by a progress bar */ +::method animateProgress unguarded + use arg progressBar, label, step, iterations, tsleep + + progressBar~setRange(0, iterations * step) + progressBar~setStep(step) + do i = 1 to iterations + progressBar~step + if (iterations * step == 100) then label~setText(i * step "%") + else label~setText(i * step) + + call msSleep tsleep + if \ self~isDialogActive then return + end + +-- The following 5 methods are started asynchronously to animate the progress +-- bars. +::method animateProgressA unguarded + expose threadsStarted pbA labelA + + if \ pbA~isA(.ProgressBar) then do + pbA = self~newProgressBar(IDC_PBAR_PROCESSA) + labelA = self~newStatic(IDC_ST_PERCENTA) + end + + self~animateProgress(pbA, labelA, 5, 20, 600) + threadsStarted -= 1 + +::method animateProgressB unguarded + expose threadsStarted pbB labelB + + if \ pbB~isA(.ProgressBar) then do + pbB = self~newProgressBar(IDC_PBAR_PROCESSB) + labelB = self~newStatic(IDC_ST_PERCENTB) + end + + self~animateProgress(pbB, labelB, 1, 100, 150) + threadsStarted -= 1 + +::method animateProgressC unguarded + expose threadsStarted pbC labelC + + if \ pbC~isA(.ProgressBar) then do + pbC = self~newProgressBar(IDC_PBAR_PROCESSC) + labelC = self~newStatic(IDC_ST_PERCENTC) + end + + self~animateProgress(pbC, labelC, 2, 50, 200) + threadsStarted -= 1 + +::method animateProgressD unguarded + expose threadsStarted pbD labelD + + if \ pbD~isA(.ProgressBar) then do + pbD = self~newProgressBar(IDC_PBAR_PROCESSD) + labelD = self~newStatic(IDC_ST_PERCENTD) + end + + self~animateProgress(pbD, labelD, 10, 40, 300) + threadsStarted -= 1 + +::method animateProgressE unguarded + expose threadsStarted pbE labelE + + if \ pbE~isA(.ProgressBar) then do + pbE = self~newProgressBar(IDC_PBAR_PROCESSE) + labelE = self~newStatic(IDC_ST_PERCENTE) + end + + self~animateProgress(pbE, labelE, 20, 50, 500) + threadsStarted -= 1 + + +::class 'TrackBarDlg' subclass RcPSPDialog inherit ResizingAdmin + +-- Define the sizing of the controls. Here, we have the 2 static frames that +-- surround the trackbars grow proportionally to the dialog, which is the +-- deault. Then we pin the controls inside of a static frame to the static +-- frame. +-- +-- For the horizontal trackbars, it makes sense for them to stretch horizontally +-- as the dialog widens. But there is no point in them stretching vertially as +-- the dialog get taller. The actual part of the control that is drawn keeps +-- the same vertical height. +-- +-- The reverse is true for the vertical trackbars, they should stretch +-- vertically and remain fixed horizontally. +-- +-- All the static labels should remain fixed in size. The labels for the +-- horizontal trackbars are pinned to the bottoms of their trackbars and pinned +-- proportionally to the left of their trackbars. The labels for the vertical +-- trackbars are pinned to the top of their trackbars and to the center of their +-- trackbars. +-- +-- For the horizontal trackbars: the top trakbar is pinned to the top of its +-- frame, the bottom to the bottom of its frame, and the middle trackbar is +-- pinned to the vertical center of its frame. +-- +-- For the vertical trackbars: the left trackbar is pinned to the left of its +-- frame, the right is pinned to the right of its frame, and the middle trackbar +-- is pinned to the horizontal center of its frame. +::method defineSizing + + self~noMinSize + + self~useDefaultSizing(IDC_ST_FRAME_LEFT) + + self~controlLeft( IDC_TB_HORZ_BOTTOM, 'STATIONARY', 'LEFT', IDC_ST_FRAME_LEFT) + self~controlTop( IDC_TB_HORZ_BOTTOM, 'STATIONARY', 'TOP', IDC_ST_FRAME_LEFT) + self~controlRight( IDC_TB_HORZ_BOTTOM, 'STATIONARY', 'RIGHT', IDC_ST_FRAME_LEFT) + self~controlBottom(IDC_TB_HORZ_BOTTOM, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_HORZ_BOTTOM, 'PROPORTIONAL', 'LEFT', IDC_TB_HORZ_BOTTOM) + self~controlTop( IDC_ST_HORZ_BOTTOM, 'STATIONARY', 'BOTTOM', IDC_TB_HORZ_BOTTOM) + self~controlRight( IDC_ST_HORZ_BOTTOM, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_HORZ_BOTTOM, 'MYTOP', 'TOP') + + self~controlLeft( IDC_TB_HORZ_TOP, 'STATIONARY', 'LEFT', IDC_ST_FRAME_LEFT) + self~controlTop( IDC_TB_HORZ_TOP, 'STATIONARY', 'YCENTER', IDC_ST_FRAME_LEFT) + self~controlRight( IDC_TB_HORZ_TOP, 'STATIONARY', 'RIGHT', IDC_ST_FRAME_LEFT) + self~controlBottom(IDC_TB_HORZ_TOP, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_HORZ_TOP, 'PROPORTIONAL', 'LEFT', IDC_TB_HORZ_TOP) + self~controlTop( IDC_ST_HORZ_TOP, 'STATIONARY', 'BOTTOM', IDC_TB_HORZ_TOP) + self~controlRight( IDC_ST_HORZ_TOP, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_HORZ_TOP, 'MYTOP', 'TOP') + + self~controlLeft( IDC_TB_HORZ_BOTH, 'STATIONARY', 'LEFT', IDC_ST_FRAME_LEFT) + self~controlTop( IDC_TB_HORZ_BOTH, 'STATIONARY', 'BOTTOM', IDC_ST_FRAME_LEFT) + self~controlRight( IDC_TB_HORZ_BOTH, 'STATIONARY', 'RIGHT', IDC_ST_FRAME_LEFT) + self~controlBottom(IDC_TB_HORZ_BOTH, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_HORZ_BOTH, 'PROPORTIONAL', 'LEFT', IDC_TB_HORZ_BOTH) + self~controlTop( IDC_ST_HORZ_BOTH, 'STATIONARY', 'BOTTOM', IDC_TB_HORZ_BOTH) + self~controlRight( IDC_ST_HORZ_BOTH, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_HORZ_BOTH, 'MYTOP', 'TOP') + + self~useDefaultSizing(IDC_ST_FRAME_RIGHT) + + self~controlLeft( IDC_TB_VERT_RIGHT, 'STATIONARY', 'LEFT', IDC_ST_FRAME_RIGHT) + self~controlTop( IDC_TB_VERT_RIGHT, 'STATIONARY', 'TOP', IDC_ST_FRAME_RIGHT) + self~controlRight( IDC_TB_VERT_RIGHT, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_TB_VERT_RIGHT, 'STATIONARY', 'BOTTOM', IDC_ST_FRAME_RIGHT) + + self~controlLeft( IDC_ST_VERT_RIGHT, 'STATIONARY', 'XCENTER', IDC_TB_VERT_RIGHT) + self~controlTop( IDC_ST_VERT_RIGHT, 'STATIONARY', 'TOP', IDC_TB_VERT_RIGHT) + self~controlRight( IDC_ST_VERT_RIGHT, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_VERT_RIGHT, 'MYTOP', 'TOP') + + self~controlLeft( IDC_TB_VERT_LEFT, 'STATIONARY', 'XCENTER', IDC_ST_FRAME_RIGHT) + self~controlTop( IDC_TB_VERT_LEFT, 'STATIONARY', 'TOP', IDC_ST_FRAME_RIGHT) + self~controlRight( IDC_TB_VERT_LEFT, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_TB_VERT_LEFT, 'STATIONARY', 'BOTTOM', IDC_ST_FRAME_RIGHT) + + self~controlLeft( IDC_ST_VERT_LEFT, 'STATIONARY', 'XCENTER', IDC_TB_VERT_LEFT) + self~controlTop( IDC_ST_VERT_LEFT, 'STATIONARY', 'TOP', IDC_TB_VERT_LEFT) + self~controlRight( IDC_ST_VERT_LEFT, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_VERT_LEFT, 'MYTOP', 'TOP') + + self~controlLeft( IDC_TB_VERT_BOTH, 'STATIONARY', 'RIGHT', IDC_ST_FRAME_RIGHT) + self~controlTop( IDC_TB_VERT_BOTH, 'STATIONARY', 'TOP', IDC_ST_FRAME_RIGHT) + self~controlRight( IDC_TB_VERT_BOTH, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_TB_VERT_BOTH, 'STATIONARY', 'BOTTOM', IDC_ST_FRAME_RIGHT) + + self~controlLeft( IDC_ST_VERT_BOTH, 'STATIONARY', 'XCENTER', IDC_TB_VERT_BOTH) + self~controlTop( IDC_ST_VERT_BOTH, 'STATIONARY', 'TOP', IDC_TB_VERT_BOTH) + self~controlRight( IDC_ST_VERT_BOTH, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_VERT_BOTH, 'MYTOP', 'TOP') + + return 0 + + +::method initDialog + expose font1 trackBars tbLabels + + -- As we initialize each track bar we'll stash the Rexx object in a table + -- for easy access later, indexed by its numeric resource id. The same + -- thing is done for the static control that is the label for the track bar. + trackBars = .table~new + tbLabels = .table~new + + -- For the horizonatal track bars we'll use a big font for the label. + font1 = self~CreateFontEx("Arial", 24, "BOLD") + + -- The symbolic IDs for the track bars / labels are named after the style + -- of the track bar. Vertical or horizontal and where the ticks are placed. + + -- Initialize the horizontal track bar with ticks on the bottom. + tb = self~newTrackBar(IDC_TB_HORZ_BOTTOM) + label = self~newStatic(IDC_ST_HORZ_BOTTOM) + + tb~setTickFrequency(10) + tb~setPos(20, .true) + label~setText(20) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_BOTTOM] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the horizontal track bar with ticks on the top. + tb = self~newTrackBar(IDC_TB_HORZ_TOP) + label = self~newStatic(IDC_ST_HORZ_TOP) + + tb~initRange(0, 200) + tb~setTickFrequency(50) + tb~setPos(40, .true) + label~setText(40) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_TOP] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the horizontal track bar with ticks on the both sides. + tb = self~newTrackBar(IDC_TB_HORZ_BOTH) + label = self~newStatic(IDC_ST_HORZ_BOTH) + + tb~initSelRange(20, 60) + tb~setTickFrequency(10) + tb~setPos(80, .true) + label~setText(80) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_BOTH] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the right. + tb = self~newTrackBar(IDC_TB_VERT_RIGHT) + label = self~newStatic(IDC_ST_VERT_RIGHT) + + tb~setTickFrequency(10) + tb~setPos(30, .true) + label~setText(30) + + id = self~constDir[IDC_TB_VERT_RIGHT] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the left. + tb = self~newTrackBar(IDC_TB_VERT_LEFT) + label = self~newStatic(IDC_ST_VERT_LEFT) + + tb~setTickFrequency(10) + tb~initRange(0,400) + tb~setLineStep(5) + tb~setPageStep(50) + tb~setPos(90, .true) + label~setText(90) + + id = self~constDir[IDC_TB_VERT_LEFT] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the both sides. + tb = self~newTrackBar(IDC_TB_VERT_BOTH) + label = self~newStatic(IDC_ST_VERT_BOTH) + + tb~setTickFrequency(5) + tb~setPos(70, .true) + label~setText(70) + + id = self~constDir[IDC_TB_VERT_BOTH] + trackBars[id] = tb + tbLabels[id] = label + + -- Connect the event notification that is sent when a track bar is moved to + -- the onEndTrack() method. That method will update the text label for the + -- track bar with the new postition. + self~connectTrackBarEvent(IDC_TB_HORZ_BOTH, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_HORZ_TOP, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_HORZ_BOTTOM, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_RIGHT, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_LEFT, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_BOTH, "EndTrack", "onEndTrack") + +-- Update the static contol that shows the position for a slider when the +-- user is done moving it. +::method onEndTrack + expose trackBars tbLabels + use arg code, hwndTrackBar + + -- hwndTrackBar is the handle to the track bar that was moved. Get its + -- resource ID and use that as an index into the table of track bar objects + -- and the table of the labels. + id = self~getControlID(hwndTrackBar) + tbLabels[id]~setText(trackBars[id]~pos) + +-- We use the leaving() method to clean up (delete) the font we created. In +-- this program there is really no need to do this. As soon as the interpreter +-- terminates, the OS cleans up the resources automatically. The only time +-- cleaning up resources makes sense is in a long-running program that creates +-- and ends a lot of dialogs. Then, over time, the memory usge of the program +-- would keep growing. +::method leaving + expose font1 + self~deleteFont(font1) + + +::class 'TabDlg' subclass RcPSPDialog inherit ResizingAdmin + +::method defineSizing + + self~controlSizing(IDC_TAB_MAIN, - + .array~of('STATIONARY', 'LEFT'), - + .array~of('STATIONARY', 'TOP'), - + .array~of('STATIONARY', 'RIGHT'), - + .array~of('STATIONARY', 'BOTTOM') - + ) + + return 0 + + +::method initDialog + expose font2 font3 imageList iconsRemoved needWrite pb tc + + -- Set the iconsRemoved and needWrite to false. These flags are used in + -- the OnDrawTabRect() method. + iconsRemoved = .false + needWrite = .false + + -- Connect the draw event of the owner-drawn button. This is sent when the + -- button needs to be drawn. Then connect the selection changed event of the + -- tab control. This is sent when the user clicks on a different tab. + self~connectDraw(IDC_PB_OWNERDRAW, "onDrawTabRect") + self~connectTabEvent(IDC_TAB_MAIN, "SELCHANGE", "onTabSelChange") + + pb = self~newPushButton(IDC_PB_OWNERDRAW) + tc = self~newTab(IDC_TAB_MAIN) + if tc == .nil then return + + -- Create a font used to display the name of the color in the owner-drawn + -- button. Create another font used to display some informative text. + font2 = self~createFontEX("Arial", 48, "BOLD ITALIC") + font3 = self~createFontEx("Arial", 16, "BOLD") + + -- Add all the tabs, including the index into the image list for an icon for + -- each tab. + tc~AddFullSeq("Red", 0, ,"Green", 1, , "Moss", 2, , "Blue", 3, , "Purple", 4, , "Cyan", 5, , "Gray", 6) + + -- Create a COLORREF (pure white) and load our bitmap. The bitmap is a + -- series of 16x16 images, each one a colored letter. + cRef = .Image~colorRef(255, 255, 255) + image = .Image~getImage(.application~srcDir"rc\propertySheetDemoTab.bmp") + + -- This is sort of a trick. The ooDialog framework invokes the initDialog() + -- method when it is notified by the Windows PropertySheet that it is + -- creating the dialog for a page. But, the operating system does not size + -- and position the dialog until the ooDialog framework returns from the + -- notification. So, at this exact point of execution, this dialog has not + -- been sized and positioned. If we call placeButton() and then return from + -- initDialog(), the button is not sized and positioned correctly, because + -- this dialog has not been sized and positioned by the PropertySheet yet. + -- + -- Instead, we return from initDialog() here, by using an early reply. Then + -- we continue to create our imag list and invoke placeButton(). By the time + -- placeButton() executes, this dialog has been sized and positioned, and our + -- button sized and positioned correctly. + reply 0 + + -- Create our image list, as a masked image list. + flags = 'COLOR24 MASK' + imageList = .ImageList~create(.Size~new(16, 16), flags, 10, 0) + if \image~isNull, \imageList~isNull then do + -- The bitmap is added and the image list deduces the number of images + -- from the width of the bitmap. For each image, the image list creates a + -- mask using the color ref. In essence, the mask is used to turn each + -- white pixel in the image to transparent. In this way, only the letter + -- part of the image shows and the rest of the image lets the under-lying + -- color show through. + imageList~addMasked(image, cRef) + tc~setImageList(imageList) + + -- The image list makes a copy of each image added to it. So, we can now + -- release the original image to free up some small amount of system + -- resoureces. + image~release + end + else do + iconsRemoved = .true + end + + self~placeButton + + + +-- We will position and size the owner-draw button so that it exactly covers +-- the display area of the tab control. +::method placeButton unguarded + expose tc pb + + -- We could be invoked before the underlying dialog has been created. + if \ tc~isA(.Tab) then return 0 + + r = tc~windowRect + tc~calcDisplayRect(r) + s = .Size~new(r~right - r~left, r~bottom - r~top) + + + -- Map the display area's position on the screen, to the client co-ordinates + -- of this control dialog. + p = .Point~new(r~left, r~top) + self~screen2client(p) + + pb~setWindowPos(tc~hwnd, p~x, p~y, s~width, s~height, "SHOWWINDOW NOOWNERZORDER") + + return + + +-- When a new tab is selected, we have the owner-drawn button update itself. +-- This causes the button to redraw and the onDrawTabRect() method gets invoked, +-- which actually does the drawing. +::method onTabSelChange + button = self~newPushButton(IDC_PB_OWNERDRAW) + button~update + + +-- Fill the owner-drawn button with the color matching the tab's label and write +-- the name of the color. +::method onDrawTabRect + expose font2 font3 imageList iconsRemoved needWrite + use arg id + + button = self~newPushButton(id) + if button == .nil then return + tc = self~newTab(IDC_TAB_MAIN) + if tc == .nil then return + + -- Each time the 'Gray' tab is selected, we remove the tab icons. Then, when + -- one of the other tabs is selected we set the image list back. + currentTab = tc~selected + if currentTab == 'Gray' then do + tc~setImageList(.nil) + iconsRemoved = .true + needWrite = .true + end + else do + if iconsRemoved then do + tc~setImageList(imageList) + iconsRemoved = .false + needWrite = .true + end + end + + -- Get the button's device context, create pen and brush, and assign pen, + -- brush and font to the device context. + dc = button~getDC + pen = button~createPen(1, "SOLID", 0) + brush = button~createBrush(tc~SelectedIndex + 1) + + oldPen = button~objectToDc(dc, pen) + oldBrush = button~objectToDc(dc, brush) + oldFont = button~fontToDC(dc, font2) + button~transparentText(dc) + + -- Draw a filled in rectangle, with a border of 5 around it, and write text. + size = button~getRealSize + button~rectangle(dc, 5, 5, size~width - 5, size~height - 5, "FILL") + button~writeDirect(dc, trunc(size~width / 4), trunc(size~height / 4), tc~Selected) + + -- Add informative text if needed. + if needWrite then do + button~fontToDC(dc, font3) + x = trunc(size~width / 4) + y = trunc(size~height / 2) + + if currentTab == 'Gray' then + button~writeDirect(dc, x, y, "(Tab icons are removed)") + else + button~writeDirect(dc, x, y, "(Tab icons are restored)") + needWrite = .false + end + + -- Restore pen, brush, and font, then release the device context. + button~objectToDc(dc, oldPen) + button~objectToDc(dc, oldBrush) + button~fontToDC(dc, oldFont) + button~opaqueText(dc) + + button~deleteObject(pen) + button~deleteObject(brush) + button~freeDC(dc) + +-- We use the leaving() method to clean up (delete) the fonts and the image list +-- we created. In this program there is really no need to do this. As soon as +-- the interpreter terminates, the OS cleans up the resources automatically. +-- The only time cleaning up resources makes sense is in a long-running program +-- that creates and ends a lot of dialogs. Then, over time, the memory usge of +-- the program would keep growing. +::method leaving + expose font2 font3 imageList + + self~deleteFont(font2) + self~deleteFont(font3) + imageList~release + +::class 'PropertySheetDemoDlg' subclass PropertySheetDialog inherit ResizingAdmin + +-- Define the sizing for the controls in the property sheet dialog. Note that +-- the control ID for the tab control is provided by a constant from the +-- PropertySheetDialog class. The Ok and Cancel push buttons have the usual IDs +-- supplied by the operatting system. +-- +-- We set the sizing for the tab control so that it keeps a fixed margin all the +-- way around it. This makes the tab control expand to take up as much space in +-- the dialog as it can. The buttons are fixed in size and pinned to the bottom +-- right corner of the dialog. +::method defineSizing + + self~controlSizing(self~IDC_TAB_IN_PROPSHEET, - + .array~of('STATIONARY', 'LEFT'), - + .array~of('STATIONARY', 'TOP'), - + .array~of('STATIONARY', 'RIGHT'), - + .array~of('STATIONARY', 'BOTTOM') - + ) + + self~controlSizing(IDCANCEL, - + .array~of('STATIONARY', 'RIGHT'), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + -- Pin the left of the Ok button to the left of the Cancel button + self~controlSizing(IDOK, - + .array~of('STATIONARY', 'LEFT', IDCANCEL), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + ret = self~wantSizeEnded('onSizeEnded', .true) + + return 0; + + + +-- The onSizeEnded() method is invoked when the user has resized the dialog and +-- that sizing is ended. At this point the TabDlg dialog needs to recalculate +-- and position the owner-drawn button. +::method onSizeEnded unguarded + self~pages[5]~placeButton + return 0 + + diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/TabDemo.rex b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/TabDemo.rex new file mode 100755 index 0000000..fe329e1 --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/TabDemo.rex @@ -0,0 +1,1294 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** Tab Control / Dialog Controls / ControlDialog Example + * + * This example demonstrates how to use the ControlDialog class to provide the + * pages / content of a Tab control. It is basically the same as the + * PropertySheetDemo.rex example, but uses a Tab control with ControlDialog + * objects rather than using a PropertySheetDialog. + * + * Note that this example is meant to demonstrate creating a resizable dialog + * that has a tab control with ControlDialog dialogs as pages. It is exactly + * the same as the + * + * oodialog\propertySheet.tabControls\TabDemo.rex + * + * example, except it is resizable. + */ + + sd = locate() + .application~setDefaults("O", sd"rc\PropertySheetDemo.h", .false) + + -- The original version of this example would take a longish period of time to + -- appear on the screen. Too much was being done in the initDialog() method + -- of the .NewControlsDialog. To improve the time between starting the + -- program and the dialog's appearance on the screen, several steps were + -- taken. + -- + -- 1.) All dialogs were made ResDialog dialogs. + -- + -- 2.) The instantiation of the dialogs used for the pages of the tab control + -- was moved out of the initDialog() method and placed here. Some of the + -- work done in the initDialog() method was moved to the prep() method, + -- which is invoked before the dialog is started executing. + -- + -- 3.) The dialog is created with the VISIBLE style. This causes the dialog + -- to appear on the screen before the list view is populated, rather than + -- having the list view populated first and then showing the dialog. + -- + -- Instantiate all the control dialogs and pass them to the prep() method in + -- an array. + t1 = .ListViewDlg~new(sd"rc\PropertySheetDemo.dll", IDD_LISTVIEW_DLG) + t2 = .TreeViewDlg~new(sd"rc\PropertySheetDemo.dll", IDD_TREEVIEW_DLG) + t3 = .ProgressBarDlg~new(sd"rc\PropertySheetDemo.rc", IDD_PROGRESSBAR_DLG) + t4 = .TrackBarDlg~new(sd"rc\PropertySheetDemo.dll", IDD_TRACKBAR_DLG) + t5 = .TabDlg~new(sd"rc\PropertySheetDemo.dll", IDD_TAB_DLG) + + tabContent = .array~of(t1, t2, t3, t4, t5) + + -- Create the main dialog. + dlg = .NewControlsDialog~new(sd'rc\PropertySheetDemo.dll', IDD_NEWCONTROLS_DLG) + + -- Invoke the prep() methods of the list view and progress bar dialogs to do + -- some initial set up before we start executing the main dialog. Note that + -- the list view (t1) dialog needs to have its owner dialog set before + -- invoking the prep method. + t1~ownerDialog = dlg + t1~prep + t3~prep + + -- Invoke the main dialog's prep() method to do some initial set up before the + -- dialog is started executing. + dlg~prep(tabContent) + + -- Show and run the dialog. + dlg~execute('SHOWTOP', IDI_DLG_OODIALOG) + + return 0 + +::requires "ooDialog.cls" + +::class 'NewControlsDialog' subclass ResDialog inherit ResizingAdmin + +::attribute tabContent + +::method defineSizing + + -- In order for the ResizingAdmin to properly size ControlDialog dialogs + -- used as pages in a tab control, it must be informed of the dialogs and + -- what tab control they are in. We do that by creating an array of their + -- IDs and pass the tab control's resource ID and the array to the + -- pagedTab() method. + -- + -- Note that the dialog IDs must be the dlgID attribute of the dialogs. In + -- this case the resource ID of the dialog has the same value as the dlgID + -- attribute, but this is not always the case. Please read the doc tor the + -- dlgID attribute in the ooDialog reference manual to understand this. + + dlgIDs = .array~of(IDD_LISTVIEW_DLG, IDD_TREEVIEW_DLG, IDD_PROGRESSBAR_DLG, - + IDD_TRACKBAR_DLG, IDD_TAB_DLG) + self~pagedTab(IDC_TAB, dlgIDs) + + -- Now, we have 5 controls in this the main dialog. The tab control and 4 + -- push buttons. We define the sizing for all edges of the tab control at + -- one time. We want the tab control edges to remain the same distance + -- from each corresponding edge of the dialog. So we use a stationary pin + -- type. The pin to window is the dialog, which is the default, so we do + -- not need to specify the third index in the array. + self~controlSizing(IDC_TAB, - + .array~of('STATIONARY', 'LEFT'), - + .array~of('STATIONARY', 'TOP'), - + .array~of('STATIONARY', 'RIGHT'), - + .array~of('STATIONARY', 'BOTTOM') - + ) + + -- For the 4 push buttons, we want them to remain fixed in size, with the + -- Previous and Next buttons pinned to the bottom left of the dialog and the + -- Ok and Cancel buttons pinned to the right bottom of the dialog. + -- + -- There is probably some clever use of the default sizing that could reduce + -- the number of lines of code here, but it is sometimes better to just + -- spell everything out in code so that it is obvious what is happening. + + self~controlSizing(IDC_PB_PREVIOUS, - + .array~of('STATIONARY', 'LEFT'), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + -- Pin the left of the Next button to the right of the Previous button + self~controlSizing(IDC_PB_NEXT, - + .array~of('STATIONARY', 'RIGHT', IDC_PB_PREVIOUS), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + -- Ror the Ok and Cancel buttons, we just do a sort of 'mirror-image' of + -- what we just did for the Previous and Next buttons. + + self~controlSizing(IDCANCEL, - + .array~of('STATIONARY', 'RIGHT'), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + -- Pin the left of the Ok button to the left of the Cancel button + self~controlSizing(IDOK, - + .array~of('STATIONARY', 'LEFT', IDCANCEL), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + -- We register to recieve a notification when the sizing of the dialog has + -- ended. We need this event so we can invoke the placeButton() method in + -- our child, TabDlg, dialog. In the TabDlg dialog, there is an owner-drawn + -- button that serves as the context of the tab control. That button needs + -- to be sized and positioned so that it completely occupies the display + -- rectangle of the tab control. Besides the initial sizing of the button, + -- the sizing also has to take place every time the size of dialog has + -- changed. The placeButton() method does the sizing, but the TabDlg dialog + -- has no way to know *when* the sizing should be done. Only this, the main + -- dialog, has a way to know when the sizing should take place. + self~wantSizeEnded('onSizeEnded', .true) + + -- We must return 0 from this method to continue. + return 0 + +/** prep() + * + * This method is invoked before the dialog is executed. It does some initial + * set up that would normally be done (by the author) in initDialog(). The + * tabContent argument is an array of the 5 ControlDialog dialogs used as the + * content for the 5 pages of the tab control. This array is saved in the + * tabContent attribute so the dialogs can be accessed when needed. + */ +::method prep + expose tabContent lastSelected havePositioned + use strict arg tabContent + + -- The havePositioned array is used to determine if the page dialogs have been + -- positioned or not. Mark all 5 dialogs as not having been positioned yet. + havePositioned = .array~of(.false, .false, .false, .false, .false) + + -- No tab has been selected yet + lastSelected = 0 + + -- Connect the event handling methods to the events we are interested in. + self~connectButtonEvent(IDC_PB_PREVIOUS, CLICKED, onPrevious) + self~connectButtonEvent(IDC_PB_NEXT, CLICKED, onNext) + self~connectTabEvent(IDC_TAB, SELCHANGE, onNewTab) + + +/** initDialog() + * + * Initialize the underlying Windows dialog. This includes setting up the tab + * control tabs, executing the dialog used for the first tab, and positioning + * the dialog over the display area of the tab control. There are 5 + * .ControlDialog dialogs. The dialogs are used for the display + * area of the tab control, one control dialog for each tab of the tab control. + */ +::method initDialog + expose tabContent tabControl pbNext pbPrevious needCalculation + + needCalculation = .true + + -- Start executing the control dialog for the first tab in the tab control. + -- We can not resize and reposition the control dialog until the underlying + -- dialog is created, so we get it started, then do our other tasks. + dlg = tabContent[1] + dlg~execute + + -- Add the tabs to the tab control. + tabControl = self~newTab(IDC_TAB) + tabControl~addSequence("List View", "Tree View", "Progress Bar", "Track Bar", "Tab") + + -- Save a reference to the push buttons. + pbNext = self~newPushButton(IDC_PB_NEXT) + pbPrevious = self~newPushButton(IDC_PB_PREVIOUS) + + -- Position and show the control dialog used for the first page of the tab. + self~positionAndShow(1) + + +/** calculateDisplayArea() + * + * Tab controls contain two areas, the tabs themselves and the display area. + * The display area is where the content for each tab is drawn. + * + * We need to match the control dialog(s) size and position with the display + * area size and position. There are two approaches here: + * + * We could calculate the size of the largest dialog, resize the tab control to + * match, and position the control dialog over the display area. + * + * We can get the size and position of the tab control's display area and resize + * and reposition the control dialog(s) to match. This is the approach we use + * here. + */ +::method calculateDisplayArea private + expose tabControl displayRect + + -- Given a rectangle describing the tab control's size and position, the tab + -- control itself will calculate the display area's size and position. + r = tabControl~windowRect + tabControl~calcDisplayRect(r) + + -- Save the size of the display area, we need it later. + s = .Size~new(r~right - r~left, r~bottom - r~top) + + -- Now we need to map the display area's position on the screen, to the client + -- co-ordinates of the main dialog. The control dialog(s) are children windows + -- of the main dialog, which is why we need to use the client-area of the + -- dialog, not the client area of the tab control. + p = .Point~new(r~left, r~top) + self~screen2client(p) + + -- Create our display rectangle. This is used in setWindowPosition(), which + -- takes a point / size rectangle. ooDialog defines a point / size rectangle + -- as using the left and top attributes for the position of the upper left + -- corner of a rectangle, using the right attribute for the width of the + -- rectangle, and using the bottom attribute for the height of the rectangle. + displayRect = .Rect~new(p~x, p~y, s~width, s~height) + + +/** positionAndShow() + * + * Used to resize and reposition one of the control dialogs so it occupies the + * display area of the tab control. + * + */ +::method positionAndShow private + expose tabControl tabContent displayRect lastSelected havePositioned needCalculation + use strict arg index + + -- We can not position the control dialog until the underlying Windows dialog + -- is created. If the system is heavily loaded for some reason, this may not + -- have happened yet. We need to wait for it. + dlg = tabContent[index] + do i = 1 to 10 + if dlg~hwnd <> 0 then leave + z = SysSleep(.01) + end + + if dlg~hwnd == 0 then do + say "Error creating dialog for the tab with index:" index", aborting" + return self~cancel + end + + if lastSelected <> 0 then tabContent[lastSelected]~hide + + -- Determine the position and size of the display area of the tab control. + -- Note: in the non-resizable example program, we only calculate the display + -- rect once. Here we need to calculate it every time the dialog has been + -- resized. To avoid calculating the display rectangle over and over when it + -- is not needed, we track when the dialog has been resized using the + -- needCalculation variable and only do the calculation when necessary. + if needCalculation then do + self~calculateDisplayArea + needCalculation = .false + end + + -- Now resize and reposition the control dialog to the tab control's display + -- area. We need to position the control dialog *above* the tab control in + -- the Z-order so that it shows. + dlg~setWindowPos(tabControl~hwnd, displayRect, "SHOWWINDOW NOOWNERZORDER") + + -- Normally this redraw is not needed. But, for resizable dialogs, when the + -- main dialog is resized before the page dialog has been started, when the + -- page dialog is started and sized to the display rect, it does not always + -- paint correctly. Invoking the redraw() method seems to fix that problem. + -- Here we use the start() method to invoke redraw() on another thread, which + -- seems to fix things the best. + self~start('REDRAW') + + lastSelected = index + havePositioned[index] = .true + + self~checkButtons + + +-- The onSizeEnded() method is invoked when the user has resized the dialog and +-- that sizing is ended. At this point the TabDlg dialog needs to recalculate +-- and position the owner-drawn button. Also, at this point we need to +-- recalculate the display +::method onSizeEnded unguarded + expose tabContent needCalculation + + needCalculation = .true + + tabContent[5]~placeButton + + return 0 + + +::method onNewTab + expose tabControl tabContent havePositioned lastSelected + + index = tabControl~selectedIndex + 1 + dlg = tabContent[index] + + if havePositioned[index] then do + last = tabContent[lastSelected] + last~hide + dlg~show + lastSelected = index + end + else do + dlg~ownerDialog = self + dlg~execute + self~positionAndShow(index) + if index == 5 then dlg~placeButton + end + + -- The activateThreads() method only starts the threads running when they are + -- not already running. So, we just invoke the method every time the dialog + -- is shown. That way if they had already been activated, but finished, they + -- are restarted when the dialog is shown. + if index == 3 then dlg~activateThreads + + self~checkButtons + + +::method onNext + expose tabControl + + tabControl~selectIndex(tabControl~selectedIndex + 1) + self~onNewTab + + +::method onPrevious + expose tabControl + + tabControl~selectIndex(tabControl~selectedIndex - 1) + self~onNewTab + + +::method checkButtons private + expose tabControl pbNext pbPrevious + + index = tabControl~selectedIndex + 1 + if index == 1 then do + pbPrevious~disable + pbNext~enable + end + else if index == 5 then do + pbPrevious~enable + pbNext~disable + end + else do + pbPrevious~enable + pbNext~enable + end + + +::method cancel + expose tabContent + + do dlg over tabContent + dlg~endExecution(.false) + end + + return self~cancel:super + +::method ok + expose tabContent + + do dlg over tabContent + dlg~endExecution(.true) + end + + return self~ok:super + + + +::class 'ListViewDlg' subclass ResControlDialog inherit ResizingAdmin + +::method defineSizing + + -- The only control in this dialog is the list-view. We define its sizing + -- so that each edge of the list-view maintains the same distance to its + -- corresponding edeg of the dialog: + self~controlSizing(IDC_LV_MAIN, - + .array~of('STATIONARY', 'LEFT'), - + .array~of('STATIONARY', 'TOP'), - + .array~of('STATIONARY', 'RIGHT'), - + .array~of('STATIONARY', 'BOTTOM') - + ) + + -- A value must be returned from the defineSizing() method. O allows the + -- dialog to continue, any other values is a failure and the dialog will be + -- ended. + return 0 + + +::method initDialog + expose lv imageList listData + + -- Instantiate a Rexx list view object that represents the underlying + -- Windows list-view. The list-view style is report. + lv = self~newListView(IDC_LV_MAIN) + + -- Set the column headers + lv~insertColumn(0, "Symbol", 40) + lv~insertColumn(1, "Quote", 50) + lv~insertColumn(2, "Year high", 50) + lv~insertColumn(3, "Year low", 50) + lv~insertColumn(4, "Description", 120) + + lv~setImageList(imageList, SMALL) + + -- Fill the list-view with random data. + do row over listData + lv~addRow( , row[1], row[2], row[3], row[4], row[5], row[6]) + end + + -- Add full row select and the ability to drag and drop the columns to the + -- list-view. + lv~addExtendedStyle("FULLROWSELECT HEADERDRAGDROP") + + -- There is a known redrawing problem when a list view is used in a tab + -- control. ooDialog has an internal fix for that (see initUpdateListView.) + -- But, when the list view is the first page of the tab control, the list + -- view needs to have gained the focus before the dialog is covered up by + -- another window, for the fix to work. Assigning the focus here prevents + -- the very rare occurrence of a user opening the dialog, immediately + -- switching to another window, and then switching back to the dialog, and + -- the fix not working. + lv~assignFocus + +/** onActivate + * + * Invoked when a list-view item is double-clicked. We display a message and + * set the focus to the next item in the list. + */ +::method onActivate + expose lv + + selectedItem = lv~focused + symbol = lv~itemText(selectedItem) + price = lv~itemText(selectedItem, 1) + + question = "You have selected the stock with symbol" symbol". Do you want to order" || .endOfLine || - + "50 shares of stock at" price"?" + placeOrder = MessageDialog(question, self~hwnd, "Place Order for Stock", "YESNO", "QUESTION", "DEFBUTTON2" ) + + cost = 50 * price~substr(2) + if placeOrder == self~constDir["IDYES"] then do + j = MessageDialog("Okay, your bank account will be debited $"cost "dollars.", self~hwnd, - + "Order Confirmation", "OK", "INFORMATION") + end + else do + j = MessageDialog("That saved you $"cost "dollars.", self~hwnd, "Order Canceled", "OK", "EXCLAMATION") + end + + lv~deselect(selectedItem) + selectedItem += 1 + lv~focus(selectedItem) + lv~select(selectedItem) + + +/** onColumnClick() + * + * Invoked when a column header of the list-view is clicked. We just show a + * message box so that the user has some feedback. + */ +::method onColumnClick + use arg id, column + + msg = "Column" column + 1 "was clicked in control" id + j = MessageDialog(msg, self~hwnd, "List-View Notification") + + +/** prep() + * + * Does some initial set up for the list view dialog. This is moved out of the + * initDialog() method to, perhaps, help populate the list view a little + * quicker. + */ +::method prep + expose imageList listData + + -- Initialize the internal fix for the list-view redrawing problem when a + -- list-view is used in a tab control. + self~initUpdateListView(IDC_LV_MAIN) + + -- Create the image list for the list-view. The image list will consist of + -- 4 images. The images are used as the icons for each item in the list + -- view. Each item is assigned 1 image, at random, when the item is added + -- to the list-view. + -- + -- The list-view control is created without the SHAREIMAGES styles, so it + -- takes care of releasing the image list when the program ends. + image = .Image~getImage(.application~srcDir"rc\propertySheetDemoListView.bmp") + imageList = .ImageList~create(.Size~new(16, 16), COLOR8, 4, 0) + if \image~isNull, \imageList~isNull then do + imageList~add(image) + + -- The image list makes a copy of the bitmap, so we can release it now + -- to free up some (small) amount of system resources. This is not + -- necessary, the OS will release the resource automatically when the + -- program ends. + image~release + end + + -- Create the data for each item (row) in the list view. The rows are + -- added to the list view in the initDialog() method + listData = .array~new(26) + do ch = "A"~c2d to "Z"~c2d + q = random(200) + yh = random(400) + yh = max(yh, q) + yl = random(100) + yl = min(yl, q) + row = .array~new(6) + row[1] = random(3) + row[2] = "_" || ch~d2c~copies(3) || "_" + row[3] = "$" || q + row[4] = "$" || yh + row[5] = "$" || yl + row[6] = ch~d2c~copies(3) "is a fictitious company." + listData~append(row) + end + + -- Connect 2 list-view events to Rexx methods in this dialog. The double- + -- click on a list-view item, and the click on a column header events. + self~connectListViewEvent(IDC_LV_MAIN, "ACTIVATE", "onActivate") + self~connectListViewEvent(IDC_LV_MAIN, "COLUMNCLICK") + + +::class 'TreeViewDlg' subclass ResControlDialog inherit ResizingAdmin + +-- ::method defineSizing + -- The tree-view is the only control in this dialog. We could take the same + -- approach we did in the ListViewDlg and stationary pin the edges of the + -- tree-view to the edges of the dialog so that the tree-view takes up as + -- much space as possible. But, the default proportional pinning of the + -- edges actually looks good for this dialog. So, we just use the default + -- sizing. + + +::method initDialog + + -- Instantiate a Rexx tree view object that represents the Windows tree-view + -- control. + tv = self~newTreeView(IDC_TV_MAIN) + + -- Create and set the ImageList for the tree view items + image = .Image~getImage(.application~srcDir"rc\propertySheetDemoTreeView.bmp") + imageList = .ImageList~create(.Size~new(32, 32), COLOR8, 10, 0) + if \image~isNull, \imageList~isNull then do + imageList~add(image) + tv~setImageList(imageList, NORMAL) + image~release + end + + -- Add the tree view items. Toys will be the root (the first argument is + -- not omitted. Subitems are added by omitting the first arguments. The + -- number of arguments omitted indicates the depth of the subitem. + -- + -- The last numeric argument in some of the items is the index for the icon + -- for that item in the image list. Those items without a number will not + -- display an icon. + + tv~add("Toys", 1) + tv~add(, "Indoor", 14) + tv~add(, , "Boys", 19) + tv~add(, , , "Cowboys", 13) + tv~add(, , , "Cars", 8) + tv~add(, , , "Starwars", 9) + tv~add(, , "Girls", 0) + tv~add(, , , "Barby", 19) + tv~add(, , , "Painting", 15) + tv~add(, , , "Cooking", 13) + tv~add(, , "Adults", 17) + tv~add(, , , "Poker", 15) + tv~add(, , "Technical", 16) + tv~add(, , , "Racing cars", 8) + tv~add(, , , "Trains", 7) + tv~add(, "Outdoor", 11) + tv~add(, , "Water", 22) + tv~add(, , , "Ball", 5) + tv~add(, , , "Soft tennis", 6) + tv~add(, , "Sand", 12) + tv~add(, , , "Shovel", 12) + tv~add(, , , "Bucket", 19) + tv~add(, , , "Sandbox", 12) + tv~add(, , "Technical", 16) + tv~add(, , , "Trains", 7) + tv~add(, , , "Remote controlled", 8) + tv~add("Office Articles", 2) + tv~add( , "Tools", 16) + tv~add( , "Books", 19) + tv~add( , , "Introduction", 14) + tv~add( , , "Advanced Programming", 17) + tv~add( , , "Tips & Tricks", 16) + tv~add("Hardware", 4) + tv~add( , "Garden", 0) + tv~add( , "Handyman", 18) + tv~add( , "Household", 18) + tv~add("Furniture", 3) + tv~add( , "Standard", 12) + tv~add( , "Luxury", 21) + + -- Connecting the begin drag event and using the default tree drag handler + -- allows us to suppport drag and drop (using the default behaviour. + self~connectTreeViewEvent(IDC_TV_MAIN, "BeginDrag", "DefTreeDragHandler") + + +::class 'ProgressBarDlg' subclass RcControlDialog inherit ResizingAdmin + +-- Define the sizing for the controls. Note that for the progress bars, we want +-- to use the default sizing so that they resize proportionally. But, we want +-- the static labels to be fixed in size and pinned to the progress bar the +-- label is for. +-- +-- The individual sizing for a control is added to the sizing table in the order +-- the sizings are defined. Then, during a resize event, the windows are sized +-- in the order they occur in the table. For any control sizing definition, the +-- pin to window has to *precede* the control in the table. Otherwise resizing +-- would not work correctly. +-- +-- What this means is that we can not pin a static control to its progress bar +-- unless the progress bar is already in the table. The defaultSizing() method +-- allows us to put a control in to the table with a minimum amount of typing. +-- +-- We also show both ways of defing the edges of a control. Using individual +-- method calls for each edge, or using the single method call, controlSizing(). +::method defineSizing + + self~noMinSize + + self~useDefaultSizing(IDC_PBAR_PROCESSA) + self~useDefaultSizing(IDC_PBAR_PROCESSB) + self~useDefaultSizing(IDC_PBAR_PROCESSC) + self~useDefaultSizing(IDC_PBAR_PROCESSD) + self~useDefaultSizing(IDC_PBAR_PROCESSE) + + self~controlLeft( IDC_ST_PROCESSA, 'STATIONARY', 'XCENTER', IDC_PBAR_PROCESSA) + self~controlTop( IDC_ST_PROCESSA, 'STATIONARY', 'TOP', IDC_PBAR_PROCESSA) + self~controlRight( IDC_ST_PROCESSA, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_PROCESSA, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_PROCESSB, 'STATIONARY', 'XCENTER', IDC_PBAR_PROCESSB) + self~controlTop( IDC_ST_PROCESSB, 'STATIONARY', 'TOP', IDC_PBAR_PROCESSB) + self~controlRight( IDC_ST_PROCESSB, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_PROCESSB, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_PROCESSC, 'STATIONARY', 'XCENTER', IDC_PBAR_PROCESSC) + self~controlTop( IDC_ST_PROCESSC, 'STATIONARY', 'TOP', IDC_PBAR_PROCESSC) + self~controlRight( IDC_ST_PROCESSC, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_PROCESSC, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_PROCESSD, 'STATIONARY', 'XCENTER', IDC_PBAR_PROCESSD) + self~controlTop( IDC_ST_PROCESSD, 'STATIONARY', 'TOP', IDC_PBAR_PROCESSD) + self~controlRight( IDC_ST_PROCESSD, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_PROCESSD, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_PROCESSE, 'STATIONARY', 'XCENTER', IDC_PBAR_PROCESSE) + self~controlTop( IDC_ST_PROCESSE, 'STATIONARY', 'TOP', IDC_PBAR_PROCESSE) + self~controlRight( IDC_ST_PROCESSE, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_PROCESSE, 'MYTOP', 'TOP') + + self~controlSizing(IDC_ST_PERCENTA, - + .array~of('STATIONARY', 'XCENTER', IDC_PBAR_PROCESSA), - + .array~of('STATIONARY', 'BOTTOM', IDC_PBAR_PROCESSA), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_ST_PERCENTB, - + .array~of('STATIONARY', 'XCENTER', IDC_PBAR_PROCESSB), - + .array~of('STATIONARY', 'BOTTOM', IDC_PBAR_PROCESSB), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_ST_PERCENTC, - + .array~of('STATIONARY', 'XCENTER', IDC_PBAR_PROCESSC), - + .array~of('STATIONARY', 'BOTTOM', IDC_PBAR_PROCESSC), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_ST_PERCENTD, - + .array~of('STATIONARY', 'XCENTER', IDC_PBAR_PROCESSD), - + .array~of('STATIONARY', 'BOTTOM', IDC_PBAR_PROCESSD), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_ST_PERCENTE, - + .array~of('STATIONARY', 'XCENTER', IDC_PBAR_PROCESSE), - + .array~of('STATIONARY', 'BOTTOM', IDC_PBAR_PROCESSE), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + return 0 + + +::method prep + expose threadsStarted processes + + threadsStarted = 0 + processes = .array~of('animateProgressA', 'animateProgressB', 'animateProgressC', - + 'animateProgressD', 'animateProgressE') + + +-- This message is sent to us by the owner dialog, the .NewControlsDialog dialog +-- to notify us that we are about to become visible. We use the notification to +-- start the progress bar animation threads. +::method activateThreads unguarded + expose threadsStarted processes + + reply 0 + + -- If no threads are running, start a thread to run each progress bar + -- asynchronously. + if threadsStarted < 1 then do + threadsStarted = processes~items + do methodName over processes + self~start(methodName) + end + end + +-- This is a generic method that simulates some type of processing that takes a +-- long time. The progress of this processing is displayed by the progress bar. +::method animateProgress unguarded + use arg progressBar, label, step, iterations, tsleep + + progressBar~setRange(0, iterations * step) + progressBar~setStep(step) + do i = 1 to iterations + progressBar~step + if (iterations * step == 100) then label~setText(i * step "%") + else label~setText(i * step) + + call msSleep tsleep + if \ self~isDialogActive then return + end + +-- The following 5 methods are started asynchronously to animate the progress +-- bars. +::method animateProgressA unguarded + expose threadsStarted pbA labelA + + if \ pbA~isA(.ProgressBar) then do + pbA = self~newProgressBar(IDC_PBAR_PROCESSA) + labelA = self~newStatic(IDC_ST_PERCENTA) + end + + self~animateProgress(pbA, labelA, 5, 20, 600) + threadsStarted -= 1 + +::method animateProgressB unguarded + expose threadsStarted pbB labelB + + if \ pbB~isA(.ProgressBar) then do + pbB = self~newProgressBar(IDC_PBAR_PROCESSB) + labelB = self~newStatic(IDC_ST_PERCENTB) + end + + self~animateProgress(pbB, labelB, 1, 100, 150) + threadsStarted -= 1 + +::method animateProgressC unguarded + expose threadsStarted pbC labelC + + if \ pbC~isA(.ProgressBar) then do + pbC = self~newProgressBar(IDC_PBAR_PROCESSC) + labelC = self~newStatic(IDC_ST_PERCENTC) + end + + self~animateProgress(pbC, labelC, 2, 50, 200) + threadsStarted -= 1 + +::method animateProgressD unguarded + expose threadsStarted pbD labelD + + if \ pbD~isA(.ProgressBar) then do + pbD = self~newProgressBar(IDC_PBAR_PROCESSD) + labelD = self~newStatic(IDC_ST_PERCENTD) + end + + self~animateProgress(pbD, labelD, 10, 40, 300) + threadsStarted -= 1 + +::method animateProgressE unguarded + expose threadsStarted pbE labelE + + if \ pbE~isA(.ProgressBar) then do + pbE = self~newProgressBar(IDC_PBAR_PROCESSE) + labelE = self~newStatic(IDC_ST_PERCENTE) + end + + self~animateProgress(pbE, labelE, 20, 50, 500) + threadsStarted -= 1 + + +::class 'TrackBarDlg' subclass ResControlDialog inherit ResizingAdmin + +-- Define the sizing of the controls. Here, we have the 2 static frames that +-- surround the trackbars grow proportionally to the dialog, which is the +-- deault. Then we pin the controls inside of a static frame to the static +-- frame. +-- +-- For the horizontal trackbars, it makes sense for them to stretch horizontally +-- as the dialog widens. But there is no point in them stretching vertially as +-- the dialog get taller. The actual part of the control that is drawn keeps +-- the same vertical height. +-- +-- The reverse is true for the vertical trackbars, the should stretch vertically +-- and remain fixed horizontally. +-- +-- All the static labels should remain fixed in size. The labels for the +-- horizontal trackbars are pinned to the bottoms of their trackbars and pinned +-- proportionally to the left of their trackbars. The labels for the vertical +-- trackbars are pinned to the top of their trackbars and to the center of their +-- trackbars. +-- +-- For the horizontal trackbars: the top trakbar is pinned to the top of its +-- frame, the bottom to the bottom of its frame, and the middle trackbar is +-- pinned to the vertical center of its frame. +-- +-- For the vertical trackbars: the left trackbar is pinned to the left of its +-- frame, the right is pinned to the right of its frame, and the middle trackbar +-- is pinned to the horizontal center of its frame. +::method defineSizing + + self~noMinSize + + self~useDefaultSizing(IDC_ST_FRAME_LEFT) + + self~controlLeft( IDC_TB_HORZ_BOTTOM, 'STATIONARY', 'LEFT', IDC_ST_FRAME_LEFT) + self~controlTop( IDC_TB_HORZ_BOTTOM, 'STATIONARY', 'TOP', IDC_ST_FRAME_LEFT) + self~controlRight( IDC_TB_HORZ_BOTTOM, 'STATIONARY', 'RIGHT', IDC_ST_FRAME_LEFT) + self~controlBottom(IDC_TB_HORZ_BOTTOM, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_HORZ_BOTTOM, 'PROPORTIONAL', 'LEFT', IDC_TB_HORZ_BOTTOM) + self~controlTop( IDC_ST_HORZ_BOTTOM, 'STATIONARY', 'BOTTOM', IDC_TB_HORZ_BOTTOM) + self~controlRight( IDC_ST_HORZ_BOTTOM, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_HORZ_BOTTOM, 'MYTOP', 'TOP') + + self~controlLeft( IDC_TB_HORZ_TOP, 'STATIONARY', 'LEFT', IDC_ST_FRAME_LEFT) + self~controlTop( IDC_TB_HORZ_TOP, 'STATIONARY', 'YCENTER', IDC_ST_FRAME_LEFT) + self~controlRight( IDC_TB_HORZ_TOP, 'STATIONARY', 'RIGHT', IDC_ST_FRAME_LEFT) + self~controlBottom(IDC_TB_HORZ_TOP, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_HORZ_TOP, 'PROPORTIONAL', 'LEFT', IDC_TB_HORZ_TOP) + self~controlTop( IDC_ST_HORZ_TOP, 'STATIONARY', 'BOTTOM', IDC_TB_HORZ_TOP) + self~controlRight( IDC_ST_HORZ_TOP, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_HORZ_TOP, 'MYTOP', 'TOP') + + self~controlLeft( IDC_TB_HORZ_BOTH, 'STATIONARY', 'LEFT', IDC_ST_FRAME_LEFT) + self~controlTop( IDC_TB_HORZ_BOTH, 'STATIONARY', 'BOTTOM', IDC_ST_FRAME_LEFT) + self~controlRight( IDC_TB_HORZ_BOTH, 'STATIONARY', 'RIGHT', IDC_ST_FRAME_LEFT) + self~controlBottom(IDC_TB_HORZ_BOTH, 'MYTOP', 'TOP') + + self~controlLeft( IDC_ST_HORZ_BOTH, 'PROPORTIONAL', 'LEFT', IDC_TB_HORZ_BOTH) + self~controlTop( IDC_ST_HORZ_BOTH, 'STATIONARY', 'BOTTOM', IDC_TB_HORZ_BOTH) + self~controlRight( IDC_ST_HORZ_BOTH, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_HORZ_BOTH, 'MYTOP', 'TOP') + + self~useDefaultSizing(IDC_ST_FRAME_RIGHT) + + self~controlLeft( IDC_TB_VERT_RIGHT, 'STATIONARY', 'LEFT', IDC_ST_FRAME_RIGHT) + self~controlTop( IDC_TB_VERT_RIGHT, 'STATIONARY', 'TOP', IDC_ST_FRAME_RIGHT) + self~controlRight( IDC_TB_VERT_RIGHT, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_TB_VERT_RIGHT, 'STATIONARY', 'BOTTOM', IDC_ST_FRAME_RIGHT) + + self~controlLeft( IDC_ST_VERT_RIGHT, 'STATIONARY', 'XCENTER', IDC_TB_VERT_RIGHT) + self~controlTop( IDC_ST_VERT_RIGHT, 'STATIONARY', 'TOP', IDC_TB_VERT_RIGHT) + self~controlRight( IDC_ST_VERT_RIGHT, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_VERT_RIGHT, 'MYTOP', 'TOP') + + self~controlLeft( IDC_TB_VERT_LEFT, 'STATIONARY', 'XCENTER', IDC_ST_FRAME_RIGHT) + self~controlTop( IDC_TB_VERT_LEFT, 'STATIONARY', 'TOP', IDC_ST_FRAME_RIGHT) + self~controlRight( IDC_TB_VERT_LEFT, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_TB_VERT_LEFT, 'STATIONARY', 'BOTTOM', IDC_ST_FRAME_RIGHT) + + self~controlLeft( IDC_ST_VERT_LEFT, 'STATIONARY', 'XCENTER', IDC_TB_VERT_LEFT) + self~controlTop( IDC_ST_VERT_LEFT, 'STATIONARY', 'TOP', IDC_TB_VERT_LEFT) + self~controlRight( IDC_ST_VERT_LEFT, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_VERT_LEFT, 'MYTOP', 'TOP') + + self~controlLeft( IDC_TB_VERT_BOTH, 'STATIONARY', 'RIGHT', IDC_ST_FRAME_RIGHT) + self~controlTop( IDC_TB_VERT_BOTH, 'STATIONARY', 'TOP', IDC_ST_FRAME_RIGHT) + self~controlRight( IDC_TB_VERT_BOTH, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_TB_VERT_BOTH, 'STATIONARY', 'BOTTOM', IDC_ST_FRAME_RIGHT) + + self~controlLeft( IDC_ST_VERT_BOTH, 'STATIONARY', 'XCENTER', IDC_TB_VERT_BOTH) + self~controlTop( IDC_ST_VERT_BOTH, 'STATIONARY', 'TOP', IDC_TB_VERT_BOTH) + self~controlRight( IDC_ST_VERT_BOTH, 'MYLEFT', 'LEFT') + self~controlBottom(IDC_ST_VERT_BOTH, 'MYTOP', 'TOP') + + return 0 + + + +::method initDialog + expose font1 trackBars tbLabels + + -- As we initialize each track bar we'll stash the Rexx object in a table + -- for easy access later, indexed by its numeric resource id. The same + -- thing is done for the static control that is the label for the track bar. + trackBars = .table~new + tbLabels = .table~new + + -- For the horizonatal track bars we'll use a big font for the label. + font1 = self~CreateFontEx("Arial", 24, "BOLD") + + -- The symbolic IDs for the track bars / labels are named after the style + -- of the track bar. Vertical or horizontal and where the ticks are placed. + + -- Initialize the horizontal track bar with ticks on the bottom. + tb = self~newTrackBar(IDC_TB_HORZ_BOTTOM) + label = self~newStatic(IDC_ST_HORZ_BOTTOM) + + tb~setTickFrequency(10) + tb~setPos(20, .true) + label~setText(20) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_BOTTOM] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the horizontal track bar with ticks on the top. + tb = self~newTrackBar(IDC_TB_HORZ_TOP) + label = self~newStatic(IDC_ST_HORZ_TOP) + + tb~initRange(0, 200) + tb~setTickFrequency(50) + tb~setPos(40, .true) + label~setText(40) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_TOP] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the horizontal track bar with ticks on the both sides. + tb = self~newTrackBar(IDC_TB_HORZ_BOTH) + label = self~newStatic(IDC_ST_HORZ_BOTH) + + tb~initSelRange(20, 60) + tb~setTickFrequency(10) + tb~setPos(80, .true) + label~setText(80) + label~setFont(font1) + + id = self~constDir[IDC_TB_HORZ_BOTH] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the right. + tb = self~newTrackBar(IDC_TB_VERT_RIGHT) + label = self~newStatic(IDC_ST_VERT_RIGHT) + + tb~setTickFrequency(10) + tb~setPos(30, .true) + label~setText(30) + + id = self~constDir[IDC_TB_VERT_RIGHT] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the left. + tb = self~newTrackBar(IDC_TB_VERT_LEFT) + label = self~newStatic(IDC_ST_VERT_LEFT) + + tb~setTickFrequency(10) + tb~initRange(0,400) + tb~setLineStep(5) + tb~setPageStep(50) + tb~setPos(90, .true) + label~setText(90) + + id = self~constDir[IDC_TB_VERT_LEFT] + trackBars[id] = tb + tbLabels[id] = label + + -- Initialize the vertical track bar with ticks on the both sides. + tb = self~newTrackBar(IDC_TB_VERT_BOTH) + label = self~newStatic(IDC_ST_VERT_BOTH) + + tb~setTickFrequency(5) + tb~setPos(70, .true) + label~setText(70) + + id = self~constDir[IDC_TB_VERT_BOTH] + trackBars[id] = tb + tbLabels[id] = label + + -- Connect the event notification that is sent when a track bar is moved to + -- the onEndTrack() method. That method will update the text label for the + -- track bar with the new postition. + self~connectTrackBarEvent(IDC_TB_HORZ_BOTH, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_HORZ_TOP, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_HORZ_BOTTOM, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_RIGHT, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_LEFT, "EndTrack", "onEndTrack") + self~connectTrackBarEvent(IDC_TB_VERT_BOTH, "EndTrack", "onEndTrack") + +-- Update the static contol that shows the position for a slider when the +-- user is done moving it. +::method onEndTrack + expose trackBars tbLabels + use arg code, hwndTrackBar + + -- hwndTrackBar is the handle to the track bar that was moved. Get its + -- resource ID and use that as an index into the table of track bar objects + -- and the table of the labels. + id = self~getControlID(hwndTrackBar) + tbLabels[id]~setText(trackBars[id]~pos) + +-- We use the leaving() method to clean up (delete) the font we created. In +-- this program there is really no need to do this. As soon as the interpreter +-- terminates, the OS cleans up the resources automatically. The only time +-- cleaning up resources makes sense is in a long-running program that creates +-- and ends a lot of dialogs. Then, over time, the memory usge of the program +-- would keep growing. +::method leaving + expose font1 + self~deleteFont(font1) + + +::class 'TabDlg' subclass ResControlDialog inherit ResizingAdmin + +::method defineSizing + + self~controlSizing(IDC_TAB_MAIN, - + .array~of('STATIONARY', 'LEFT'), - + .array~of('STATIONARY', 'TOP'), - + .array~of('STATIONARY', 'RIGHT'), - + .array~of('STATIONARY', 'BOTTOM') - + ) + + return 0 + + +::method initDialog + expose font2 font3 imageList iconsRemoved needWrite pb tc + + -- Set the iconsRemoved and needWrite to false. These flags are used in + -- the OnDrawTabRect() method. + iconsRemoved = .false + needWrite = .false + + -- Connect the draw event of the owner-drawn button. This is sent when the + -- button needs to be drawn. Then connect the selection changed event of the + -- tab control. This is sent when the user clicks on a different tab. + self~connectDraw(IDC_PB_OWNERDRAW, "onDrawTabRect") + self~connectTabEvent(IDC_TAB_MAIN, "SELCHANGE", "onTabSelChange") + + pb = self~newPushButton(IDC_PB_OWNERDRAW) + tc = self~newTab(IDC_TAB_MAIN) + if tc == .nil then return + + -- Create a font used to display the name of the color in the owner-drawn + -- button. Create another font used to display some informative text. + font2 = self~createFontEX("Arial", 48, "BOLD ITALIC") + font3 = self~createFontEx("Arial", 16, "BOLD") + + -- Add all the tabs, including the index into the image list for an icon for + -- each tab. + tc~AddFullSeq("Red", 0, ,"Green", 1, , "Moss", 2, , "Blue", 3, , "Purple", 4, , "Cyan", 5, , "Gray", 6) + + -- Create a COLORREF (pure white) and load our bitmap. The bitmap is a + -- series of 16x16 images, each one a colored letter. + cRef = .Image~colorRef(255, 255, 255) + image = .Image~getImage(.application~srcDir"rc\propertySheetDemoTab.bmp") + + -- Create our image list, as a masked image list. + flags = 'COLOR24 MASK' + imageList = .ImageList~create(.Size~new(16, 16), flags, 10, 0) + if \image~isNull, \imageList~isNull then do + -- The bitmap is added and the image list deduces the number of images + -- from the width of the bitmap. For each image, the image list creates a + -- mask using the color ref. In essence, the mask is used to turn each + -- white pixel in the image to transparent. In this way, only the letter + -- part of the image shows and the rest of the image lets the under-lying + -- color show through. + imageList~addMasked(image, cRef) + tc~setImageList(imageList) + + -- The image list makes a copy of each image added to it. So, we can now + -- release the original image to free up some small amount of system + -- resoureces. + image~release + end + else do + iconsRemoved = .true + end + + -- In a stand-alone dialog, we would size and position the content of the + -- tab control here. But, this dialog is itself the content of the tab + -- control in the main dialog. And, at this point, the main dialog has not + -- sized and positioned us. + -- + -- If we call placeButton() at this point, the button won't be sized + -- correctly, because we are not yet sized. Rather, for this program, the + -- main dialog invokes our placeButton() method at the proper time. Only + -- the main dialog knows what that proper time is. + + +-- This method sizes the owner-drawn button so that it is the size of the +-- display rectangle of the tab control. The process has to be done after this +-- dialog has been sized and positioned by the main dialog. This dialog can not +-- know when that has happened, only the main dialog knows that. So, it is the +-- main dialog that invokes this method. +::method placeButton unguarded + expose pb tc + + -- We could be invoked before the underlying dialog has been created. + if \ tc~isA(.Tab) then return 0 + + -- Have the tab control calculate its display area's size and position. + r = tc~windowRect + tc~calcDisplayRect(r) + s = .Size~new(r~right - r~left, r~bottom - r~top) + + -- Map the display area's position on the screen, to the client co-ordinates + -- of this control dialog. + p = .Point~new(r~left, r~top) + self~screen2client(p) + + -- Now resize and reposition the button so it exactly over-lays the display + -- area of the tab control. We specify that the tab control window is behind + -- the button and use the flag that prevents the button's owner window, this + -- z-order from changing. This leaves the tab control on top of the dialog, + -- and our push button on top of the tab control. Which of course is what we + -- want. + pb~setWindowPos(tc~hwnd, p~x, p~y, s~width, s~height, "SHOWWINDOW NOOWNERZORDER") + + return 0 + + +-- When a new tab is selected, we have the owner-drawn button update itself. +-- This causes the button to redraw and the onDrawTabRect() method gets invoked, +-- which actually does the drawing. +::method onTabSelChange + expose pb + pb~update + + +-- Fill the owner-drawn button with the color matching the tab's label and write +-- the name of the color. +::method onDrawTabRect + expose font2 font3 imageList iconsRemoved needWrite + use arg id + + button = self~newPushButton(id) + if button == .nil then return + tc = self~newTab(IDC_TAB_MAIN) + if tc == .nil then return + + -- Each time the 'Gray' tab is selected, we remove the tab icons. Then, when + -- one of the other tabs is selected we set the image list back. + currentTab = tc~selected + if currentTab == 'Gray' then do + tc~setImageList(.nil) + iconsRemoved = .true + needWrite = .true + end + else do + if iconsRemoved then do + tc~setImageList(imageList) + iconsRemoved = .false + needWrite = .true + end + end + + -- Get the button's device context, create pen and brush, and assign pen, + -- brush and font to the device context. + dc = button~getDC + pen = button~createPen(1, "SOLID", 0) + brush = button~createBrush(tc~SelectedIndex + 1) + + oldPen = button~objectToDc(dc, pen) + oldBrush = button~objectToDc(dc, brush) + oldFont = button~fontToDC(dc, font2) + button~transparentText(dc) + + -- Draw a filled in rectangle, with a border of 5 around it, and write text. + size = button~getRealSize + button~rectangle(dc, 5, 5, size~width - 5, size~height - 5, "FILL") + button~writeDirect(dc, trunc(size~width / 4), trunc(size~height / 4), tc~Selected) + + -- Add informative text if needed. + if needWrite then do + button~fontToDC(dc, font3) + x = trunc(size~width / 4) + y = trunc(size~height / 2) + + if currentTab == 'Gray' then + button~writeDirect(dc, x, y, "(Tab icons are removed)") + else + button~writeDirect(dc, x, y, "(Tab icons are restored)") + needWrite = .false + end + + -- Restore pen, brush, and font, then release the device context. + button~objectToDc(dc, oldPen) + button~objectToDc(dc, oldBrush) + button~fontToDC(dc, oldFont) + button~opaqueText(dc) + + button~deleteObject(pen) + button~deleteObject(brush) + button~freeDC(dc) + +-- We use the leaving() method to clean up (delete) the fonts and the image list +-- we created. In this program there is really no need to do this. As soon as +-- the interpreter terminates, the OS cleans up the resources automatically. +-- The only time cleaning up resources makes sense is in a long-running program +-- that creates and ends a lot of dialogs. Then, over time, the memory usge of +-- the program would keep growing. +::method leaving + expose font2 font3 imageList + + self~deleteFont(font2) + self~deleteFont(font3) + imageList~release + diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/augmentedResize.rex b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/augmentedResize.rex new file mode 100755 index 0000000..3442d23 --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/augmentedResize.rex @@ -0,0 +1,306 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * The augmentedResize.rex example has the same initial dialog layout as the + * basicResize.rex example. However, to give a better appearance to the dialog + * as it is enlarged or shrunk, the precise way each dialog control is to be + * changed is defined in the program code. + * + * All code that defines the sizing of the resizable dialog has to be defined + * in the defineSizing() method. This method is invoked automatically by the + * ooDialog framework. The default implementation of the method does nothing. + * The method is meant to be over-ridden by the programmer to change the + * default sizing parameters of the ResizingAdmin class. The method is invoked + * before the underlying dialog is created. The programmer can not inovke any + * method that requires the underlying dialog to exist from the defineSizing() + * method. + */ + + -- Get the directory our source code files are located in. + sd = locate() + + -- Use the global .constDir, only, for symbolic IDs, load the symbols from + -- the basicResize.h file. + .application~setDefaults('O', sd'rc\basicResize.h', .false) + + dlg = .ResizableDlg~new(sd"rc\basicResize.rc", IDD_RESIZABLE) + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +return 0 +-- End of entry point. + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" + +-- Inherit the ResizingAdmin class to make resizing available. +::class 'ResizableDlg' subclass RcDialog inherit ResizingAdmin + +/** defineSizing() + * + * This method is invoked automatically by the ooDialog framework. A default + * implmentation is provided. That implmentation does not do anything. To + * change how the default implmentation works, the program must over-ride the + * defineSizing() method and invoke ResizingAdmin methods to change the + * defaults. + * + * Each dialog control must be referenced by its resource ID. The ID can be + * numeric or symbolic. This is no different than any other use of ooDialog. + * + * The basic premise of the resizing admin is that each side, left, top, right, + * etc., of every control window can be "pinned" to the side of another window. + * By default each side is pinned to a side of the dialog window itself. But, + * any side of a dialog control window can be pinned to a side of any other + * dialog control in the dialog. + * + * There are several different "types" of pins. The programmer defines the + * "sizing" of any dialog control by defining how each "edge" of the control + * should be sized. The definition consists of: the id of the control, which + * side of the control is to be pined, which side of another window the control + * edge is pinned to, the type of the pin, and the ID of the other window. For + * instance: + * + * The left side of a button control could be "pinned" to the left side of the + * dialog window using a 'proportional' pin. + * + * or + * + * The right side of a list-view control could be "pinned" the left side of an + * edit control using a 'stationary' pin. + * + * The control windows are identified by the resource ID of the control. The + * dialog window is identified by a special constant provided by the + * ResizingAdmin class, the IDC_DEFAULT_PINTO_WINDOW constant. + * + * The edges (sides) of windows are identified by the keywords: LEFT, TOP, + * RIGHT, and BOTTOM. In addition there are two other edge keywords: XCENTER + * and YCENTER. + * + * XCENTER specifies that the edge is pinned to the horizontal center of the + * pinned to edge. YCENTER specifies that the edge is pinned to the vertical + * center of the pinned to edge. + * + * The types of pins are identified by the kewords: PROPORTIONAL, STATIONARY, + * MYTOP, and MYLEFT. + * + * PROPORTIONAL : The distance between the edge and the pinned to edge grows, + * (or shrinks,) proportionally to the size of the pinned to + * window. + * + * STATIONARY : The distance between the edge and the pinned to edge remains + * equal to what it was when the dialog was initially created. + * + * MYLEFT : A special keyword, can only be used for the right edge of a + * control. Pins the right edge of the control to its left + * edge. This has the effect of keeping the width of the + * control constant. + * + * MYTOP : A special keyword, can only be used for the bottom edge of a + * control. Pins the bottom edge of the control to its top + * edge. This has the effect of keeping the height of the + * control constant. + * + * The ooDialog framework uses an algorithm to resize / reposition the dialog + * control windows that virtually eliminates flicker. This code requires that + * the sizing for every control in the dialog be specified. When the underlying + * dialog is first created, the framework enumerates every dialog control. If a + * a control did not have its sizing defined by the programmer, the framework + * assigns the default sizing to the control and adds the sizing definition to + * the end of the sizing definitions list. + * + * When the sizing event notification is received, the ooDialog framework + * resizes and repositions every dialog control in the order of the sizing + * defintions in the list. + * + * Because of this, any "pinned to" window must come before the window that pins + * to it in the list. I.e., if a side of a list-view control is to be "pinned" + * to the left side of an edit control, the sizing definition for the edit + * control must be specified before the sizing definition for the list-view is + * specified. Sizing definitions are placed in the list in the order the + * programmer defines the control sizing. The sizing definitions for all + * controls not defined by the programmer are appended to the end of the list, + * in the order they are enumerated by the operating system. + * + * The code in the following defineSizing() method shows how to apply the above + * explanation. The ooDialog reference manual should be consulted for the + * complete documentation on the ResizingAdmin class. + */ +::method defineSizing + + -- Assign the IDC_DEFAULT_PINTO_WINDOW constant to a short variable name. + -- This is just done here to keep the code a little more readable. In + -- addition, IDC_DEFAULT_PINTO_WINDOW is the default. In almost all cases, + -- IDC_DEFAULT_PINTO_WINDOW can simply be omitted. + + ID_DLG = self~IDC_DEFAULT_PINTO_WINDOW + + -- The sizing for each edge of a dialog control can be specified + -- individually. Here we define the sizing for the list-view. It is pinned + -- to the left top corner and right bottom corner of the dialog. This means + -- the pixel distance between the edges of the list-view and the edges of + -- the dialog will remain constant. + + self~controlLeft(IDC_LV_MAIN, 'STATIONARY', 'LEFT', ID_DLG) + self~controlTop(IDC_LV_MAIN, 'STATIONARY', 'TOP', ID_DLG) + self~controlRight(IDC_LV_MAIN, 'STATIONARY', 'RIGHT', ID_DLG) + self~controlBottom(IDC_LV_MAIN, 'STATIONARY', 'BOTTOM', ID_DLG) + + -- The complete sizing for a single control can be specified at one time. + -- The first argument must be the resource ID of the control. Following + -- that are four arguments defining the sizing for the 4 edges of the + -- control. The must be in order: left top right bottom. However, each + -- argument is optional. If it is omitted, the default sizing for that edge + -- is used. + -- + -- Each of the 4 arguments must be an array. The fist item in the array is + -- required and is the type of pin. The second item in the array is also + -- required. It is the edge of the other window that the edge of the + -- control is pinned to. The third item in the array is the id of the + -- window that the control's edge is pinned to. This item can be omitted, + -- it defaults to the dialog window. + -- + -- This definition pins the Test push button to the right top corner of the + -- dialog. Since it is a 'stationary' pin the push button will 'stay' in + -- place. The right side of the button is pinned to its own left side. + -- This makes the width of the button constant, it will not change as the + -- dialog is sized. The bottom edge of the button is pinned to its top. + -- This makes the height of the button constant. + -- + -- Note that when the pin type is MYLEFT or MYRIGHT, the other 2 + -- specifications, the edge and window, are always ignored. However, the + -- controlSizing() method requires that the first 2 items in the array not + -- be omitted. + self~controlSizing(IDC_PB_TEST, - + .array~of('STATIONARY', 'RIGHT', IDC_LV_MAIN), - + .array~of('STATIONARY', 'TOP'), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + -- The following just defines the sizing for all of the rest of the + -- controls. + + self~controlSizing(IDC_GB_TEST, - + .array~of('STATIONARY', 'LEFT'), - + .array~of('STATIONARY', 'BOTTOM', IDC_LV_MAIN), - + .array~of('STATIONARY', 'RIGHT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_EDIT_LABELS, - + .array~of('PROPORTIONAL', 'LEFT', IDC_GB_TEST), - + .array~of('STATIONARY', 'TOP', IDC_GB_TEST), - + .array~of('STATIONARY', 'RIGHT', IDC_GB_TEST), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_ST_LABELS, - + .array~of('STATIONARY', 'LEFT', IDC_EDIT_LABELS), - + .array~of('STATIONARY', 'TOP', IDC_GB_TEST), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_ST_NAMES, - + .array~of('STATIONARY', 'LEFT', IDC_GB_TEST), - + .array~of('STATIONARY', 'TOP', IDC_GB_TEST), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_EDIT_NAMES, - + .array~of('STATIONARY', 'LEFT', IDC_ST_NAMES), - + .array~of('STATIONARY', 'TOP', IDC_GB_TEST), - + .array~of('STATIONARY', 'LEFT', IDC_ST_LABELS), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_ST_PLACES, - + .array~of('STATIONARY', 'LEFT', IDC_GB_TEST), - + .array~of('STATIONARY', 'TOP', IDC_GB_TEST), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDC_EDIT_PLACES, - + .array~of('STATIONARY', 'LEFT', IDC_ST_PLACES), - + .array~of('STATIONARY', 'TOP', IDC_GB_TEST), - + .array~of('STATIONARY', 'LEFT', IDC_EDIT_NAMES), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDOK, - + .array~of('STATIONARY', 'RIGHT'), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDCANCEL, - + .array~of('STATIONARY', 'RIGHT'), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + return 0 + + +/** initDialog() + * + * This is just a typical initDialog() method. We merely put some items into + * the list-view to give the dialog some texture. + */ +::method initDialog + + self~newGroupBox(IDC_GB_TEST)~setText('Group Box Stationary Left / Right') + + list = self~newListView(IDC_LV_MAIN) + list~setView('REPORT') + + columnNames = .array~of("Line", "Number") + list~addExtendedStyle("FULLROWSELECT GRIDLINES CHECKBOXES HEADERDRAGDROP") + + list~InsertColumn(0, "Row (Column 1)", 95) + list~InsertColumn(1, "Column 2", 95) + list~InsertColumn(2, "Column 3", 95) + + do i = 1 to 200 + list~addRow(i, , "Line" i, "Column" 2, "Column" 3) + end diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/basicResize.rex b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/basicResize.rex new file mode 100755 index 0000000..c228375 --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/basicResize.rex @@ -0,0 +1,66 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * A basic example of using the ResizingAdmin mixin class to produce a resizable + * dialog. The example shows that any dialog can be made resizable, simply by + * inheriting ResizingAdmin, and doing nothing else. + * + * The defaults for ResizingAdmin will resize all controls in the dialog + * proportionally. This works well for any dialog, in that all controls will + * show without overlap. + */ + + sd = locate() + + -- Use the global .constDir for symbolic IDs, load them from basicResize.h + .application~setDefaults('O', sd'rc\basicResize.h', .false) + + dlg = .ResizableDlg~new(sd"rc\basicResize.rc", IDD_RESIZABLE) + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +return 0 +-- End of entry point. + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" + +-- Inherit ResingAdmin, voila, the dialog is resizable. +::class 'ResizableDlg' subclass RcDialog inherit ResizingAdmin + diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/gbStationary.rex b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/gbStationary.rex new file mode 100755 index 0000000..4888a2e --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/gbStationary.rex @@ -0,0 +1,244 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * The gbStationary.rex example uses a very similar dialog to the one used in + * the augmentedResize.rex example. It then does a few things differently to + * demonstrate how some of the other methods of the ResizingAdmin class work. + * It also is used to show how the XCENTER and YCENTER pin types work. + * + * These are some of the differences to note. + * + * 1.) The 3 push buttons in the dialog use the XCENTER and YCENTER pin types. + * The Test push button uses the YCENTER pin type to center it vertically with + * the list-view control. The Ok and Cancel push buttons use the XCENTER pin + * type to center themselves horizontally within the dialog window. + * + * 2.) The list-view control starts in the Icon view instead of the report + * view. When the dialog is resized, the list-view does not rearrange the + * items. This may look "wrong" to some people. So, this example uses that + * as an opportunity to show the wantSizeEnded() method. The programmer can + * use that method to have the ooDialog framework invoke a method in the Rexx + * dialog when the user has finished resizing the dialog. In this program, we + * use that notification to do a many rearranging of the list-view items. The + * push button in the center right of the dialog can be used to toggle the + * behaviour back in forth to do the automatic rearranging or to not do the + * rearranging. This allows you to see what the dialog looks like either way. + * + * 3.) In the augmentedResize.rex example, the group box and the controls with + * in the group box keep the same height but stretch horizontally as the dialog + * gets wider. In this example, the group box and the controls within it keep + * the same size ans the dialog changes size and they remain fixed to the left + * side of the dialog and the bottom of the list-view. Since these are the + * majority of the controls in this dialog, the default sizing is set to those + * values, and the sizing for the individual controls is omitted. This reduces + * the actual number of lines the programer has to type. + * + * 4.) By default the minimum size of the dialog is set to its initial size + * when it first is created, and the maximum size is unlimited. This example + * removes any minimum size restriction and sets a maximum size to slightly + * smaller than the screen. Note that the ability to maximize or minimize the + * dialog is set by the presence or absence of the minimize or maximize buttons + * and has nothing to do with the minimum or maximum size. However, if the + * dialog has a maximize button and a maximum size smaller than the screen is + * set, the maximize button will maximize the dialog to the set size. If the + * dialog has a minimize button, it behaves the same with or without a minimum + * size set. Note also that the operating system will not let the user size a + * window smaller than the height of the caption bar plus the sizing borders, + * or smaller than the width of the system menu icon and buttons in the caption + * bar, even if the size is set to 1 x 1 pixels. + */ + + sd = locate() + .application~setDefaults('O', sd'rc\gbStationary.h', .false) + say sd"rc\gbStationary.rc" + dlg = .ResizableDlg~new(sd"rc\gbStationary.rc", IDD_RESIZABLE) + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +return 0 +-- End of entry point. + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" + +-- Make the dialog resizable by inheriting the ResizingAdmin class. +::class 'ResizableDlg' subclass RcDialog inherit ResizingAdmin + +/** defineSizing() + * + * Define the sizing needed for our controls. Please read the commets for this + * method in the augmentedResize.rex example for a lengthy description of this + * method. + */ +::method defineSizing + + ID_DLG = self~IDC_DEFAULT_PINTO_WINDOW + + self~controlSizing(IDC_LV_MAIN, - + .array~of('STATIONARY', 'LEFT'), - + .array~of('STATIONARY', 'TOP'), - + .array~of('STATIONARY', 'RIGHT'), - + .array~of('STATIONARY', 'BOTTOM') - + ) + + -- Note the YCENTER keyword for the top edge of the push button. The effect + -- of this is to center the top edge with the center of the pin to window, + -- the list-view in this case. + + self~controlSizing(IDC_PB_TEST, - + .array~of('STATIONARY', 'RIGHT', IDC_LV_MAIN), - + .array~of('STATIONARY', 'YCENTER', IDC_LV_MAIN), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + -- Here we set the default sizing for the left top to be the left side of the + -- dialog and the bottom of the list-view. The default sizing for the right + -- bottom is set to the same thing. Every control edge not specifically + -- assigned a value in this program will be assigned the default sizing when + -- the underlying dialog is created. + -- + -- The control edges not defined here are all the edges of the group box, the + -- 3 edit controls and the 3 labels for those controls. The effect of this + -- then is to pin those controls to the left bottom of the list-view and to + -- keep them fixed in size. For this dialog, this actually makes the most + -- sense. At least to the author. ;-) + + self~defaultSizing(.array~of('STATIONARY', 'LEFT'), - + .array~of('STATIONARY', 'BOTTOM', IDC_LV_MAIN), - + .array~of('STATIONARY', 'LEFT'), - + .array~of('STATIONARY', 'BOTTOM', IDC_LV_MAIN) - + ) + + -- The Ok and Cancel buttons are specified explicitly. Note that the XCENTER + -- edge keyword has the effect of keeping the 2 buttons centered horizonatally + -- in the dialog. + self~controlSizing(IDOK, - + .array~of('STATIONARY', 'XCENTER'), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + self~controlSizing(IDCANCEL, - + .array~of('STATIONARY', 'XCENTER'), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'LEFT'), - + .array~of('MYTOP', 'TOP') - + ) + + -- We specify that we want the size ended notification to be sent to us, using + -- the method name of onSizeEnded and that we will return a value from that + -- method. + self~wantSizeEnded(onSizeEnded, .true) + + -- We also connect the test push button. Then when the dialog is showing, you + -- can toggle between rearranging the list-view item when the user has ended + -- sizing, and not. To see the difference. + self~connectButtonEvent(IDC_PB_TEST, 'CLICKED', onPbPushed) + + return 0 + + +/** initDialog() + * + * A pretty typical initDialog() method, we add some items to the list-view and + * set up the initial state for the push button. + * + */ +::method initDialog + expose list arrangeWhenSizeEnds pushButton + + -- Set the initial state so that when a sizing operation ends, the items in + -- the list-view are automatically rearranged. + arrangeWhenSizeEnds = .true + pushButton = self~newPushButton(IDC_PB_TEST) + pushButton~setText('Do Arrange') + + + -- Get the size of the work area of the screen and make our maximum size 15 + -- pixels smaller on each side. Then set the minimum size to no minimum. + workArea = .SPI~workArea + maxSize = .Size~new(workArea~right - workArea~left - 15, workArea~bottom - workArea~top - 15) + + self~maxSize = maxSize + self~noMinSize + + -- Fill the list-view with items. + list = self~newListView(IDC_LV_MAIN) + + columnNames = .array~of("Line", "Number") + list~addExtendedStyle("FULLROWSELECT GRIDLINES CHECKBOXES HEADERDRAGDROP") + + list~InsertColumn(0, "Row (Column 1)", 95) + list~InsertColumn(1, "Column 2", 95) + list~InsertColumn(2, "Column 3", 95) + + do i = 1 to 200 + list~addRow(i, , "Line" i, "Column" 2, "Column" 3) + end + + +/** onPbPushed() + * + * The button was pushed, toggle our state. + */ +::method onPbPushed unguarded + expose arrangeWhenSizeEnds pushButton + + -- Toggle our state + arrangeWhenSizeEnds = \ arrangeWhenSizeEnds + if arrangeWhenSizeEnds then pushButton~setText('Do Arrange') + else pushButton~setText('No Arrange') + + +/** onSizeEnded() + * + * The event handler for the sizing ended notification. We look at the value of + * the flag and either tell the list-view to rearrange its items, or not. + * + * Note that we must return a value, because we said we would, but the actual + * value is ignored. The main purpose of having the ooDialog framework wait for + * the return is to "sync" our code execution with the actions of the user. + */ +::method onSizeEnded unguarded + expose list arrangeWhenSizeEnds + + if arrangeWhenSizeEnds then list~arrange + return 0 diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/PropertySheetDemo.dll b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/PropertySheetDemo.dll new file mode 100644 index 0000000000000000000000000000000000000000..7413e919880abbbe120d07b0eba100a3df6fccd0 GIT binary patch literal 4608 zcmeHJO=w(I6#nicX)=jP4Qi>T#5Zkft(1`HCX0a6CIOLXhb9zJQRdHdYGx+9Nj1jJ zI0zQ0P~5sHx)GsJp-2@Mv71Jv;6l)y-3VzL|Nm+f#_!yp$-HqgEuAg|b7$T?_n!ZI z-Z|&K$DTZi767e$%4Ogjp^T`W8&69l_uTtY56*@!M$W0pi;?LgnSwXx=V$zQ)=S27 zx%|ABNPGUVoR`UY;|Hg_Y(AA9?C$Oyu&Ph5jec|atwSf=(|7*#i52eq&d1&mcqo%R zBD9S>iA?~LDuk#9#Z+R3dw9SjO7P6LfuUhR z#Uj8$xPp67aGT@5903J3JZuMwK`*x;L&OurA0?b4e4g+);Vj`P!Ym>0j$)4R3qpdb z!NlNLslu40!C%_|-(kpARD;;Q0sj6C@FT=aE}k1tHo-g#G^fedxvoTxrQtUf%yK z;j_%3pl0J=tv%x(Te#MB*y_4^3v|6^b*(m`s|`i%*9TVDceg;-s@3&<6T0{jrTyB8 zZ*dno5N|D)OBm)S;ShFLUb*3!vOI|fJg-`wWCNbFmM7JK=ZfV?H{iLOA9e%uxy(`0 zb)46AW3q3*_1^gYXhYru0p6Dz@{R>~-)qP_9^k#ykaxoJ^4s3lS13?lrjPx*(*$eW z^{FuKz&+|K{9tSRM*3ry?N_~c7+vaZ{MaJ>aeX+ydTRXgS?5W1wHvK?*B3j{&#rYR zeyPb{xfhJagzg}w-ly0NGDxwz_!XDTyWNWsjItJfrN1Tid()E*Q(NV}h-+IvH*Kq^ zZT(iq*4~P(cXc=ZscBoE(^fxzuVZVMwRHv&zUd|W(WI^S(Ti=YrE7I;wOdZ7f-I<{O6DitBm68>t^R-5Y8eeLf$w%YAoA@|{Ntl~M{YfRoa+B>9`NSmpm rxjG2m$J5NqG=Co4J$k)b-BWWPU#`@u(d6{F?-+xvB>(2(CL{0 +#include +#include "PropertySheetDemo.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_LISTVIEW_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "List View Control" +FONT 9, "Arial" +{ + CONTROL "ListView", IDC_LV_MAIN, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT, 7, 7, 286, 236 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_NEWCONTROLS_DLG DIALOG 0, 0, 325, 300 +STYLE DS_CENTER | DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Example using ControlDialog objects" +FONT 9, "Arial" +{ + CONTROL "Tab", IDC_TAB, WC_TABCONTROL, WS_TABSTOP, 10, 5, 305, 265 + PUSHBUTTON "Previous Control", IDC_PB_PREVIOUS, 10, 278, 60, 14 + PUSHBUTTON "Next Control", IDC_PB_NEXT, 80, 278, 60, 14 + DEFPUSHBUTTON "Ok", IDOK, 185, 278, 60, 14 + PUSHBUTTON "Cancel", IDCANCEL, 255, 278, 60, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PROGRESSBAR_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Progress Bar Control" +FONT 9, "Arial" +{ + CTEXT "Process A", IDC_ST_PROCESSA, 26, 12, 35, 8, SS_LEFT + CONTROL "Progress", IDC_PBAR_PROCESSA, PROGRESS_CLASS, PBS_VERTICAL, 36, 27, 13, 199 + CTEXT "100%", IDC_ST_PERCENTA, 32, 229, 21, 8, SS_LEFT + CTEXT "Process B", IDC_ST_PROCESSB, 79, 12, 35, 8, SS_LEFT + CONTROL "Progress", IDC_PBAR_PROCESSB, PROGRESS_CLASS, PBS_VERTICAL, 89, 27, 13, 199 + CTEXT "100%", IDC_ST_PERCENTB, 85, 229, 21, 8, SS_LEFT + CTEXT "Process C", IDC_ST_PROCESSC, 132, 12, 35, 8, SS_LEFT + CONTROL "Progress", IDC_PBAR_PROCESSC, PROGRESS_CLASS, PBS_VERTICAL, 142, 27, 13, 199 + CTEXT "100%", IDC_ST_PERCENTC, 139, 229, 21, 8, SS_LEFT + CTEXT "Process D", IDC_ST_PROCESSD, 184, 12, 35, 8, SS_LEFT + CONTROL "Progress", IDC_PBAR_PROCESSD, PROGRESS_CLASS, WS_BORDER | PBS_SMOOTH | PBS_VERTICAL, 195, 27, 13, 199 + CTEXT "100%", IDC_ST_PERCENTD, 192, 229, 21, 8, SS_LEFT + CTEXT "Process E", IDC_ST_PROCESSE, 236, 12, 35, 8, SS_LEFT + CONTROL "Progress", IDC_PBAR_PROCESSE, PROGRESS_CLASS, WS_BORDER | PBS_SMOOTH | PBS_VERTICAL, 248, 27, 13, 199 + CTEXT "100%", IDC_ST_PERCENTE, 244, 229, 21, 8, SS_LEFT +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TAB_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Tab Control" +FONT 9, "Arial" +{ + CONTROL "Tab", IDC_TAB_MAIN, WC_TABCONTROL, WS_TABSTOP, 5, 5, 290, 240 + CONTROL "", IDC_PB_OWNERDRAW, WC_BUTTON, WS_TABSTOP | BS_OWNERDRAW, 17, 63, 267, 162 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TRACKBAR_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Track Bar Control" +FONT 9, "Arial" +{ + CONTROL "", IDC_ST_FRAME_LEFT, WC_STATIC, SS_BLACKFRAME, 7, 7, 136, 236 + CONTROL "Slider", IDC_TB_HORZ_BOTTOM, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS, 10, 30, 119, 20 + LTEXT "Text", IDC_ST_HORZ_BOTTOM, 41, 56, 60, 27, SS_LEFT + CONTROL "Slider", IDC_TB_HORZ_TOP, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_TOP, 10, 97, 119, 20 + LTEXT "Text", IDC_ST_HORZ_TOP, 41, 128, 60, 27, SS_LEFT + CONTROL "Slider", IDC_TB_HORZ_BOTH, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_BOTH | TBS_ENABLESELRANGE, 10, 168, 119, 32 + LTEXT "Text", IDC_ST_HORZ_BOTH, 41, 203, 60, 30, SS_LEFT + CONTROL "", IDC_ST_FRAME_RIGHT, WC_STATIC, SS_BLACKFRAME, 163, 7, 130, 236 + CONTROL "Slider", IDC_TB_VERT_RIGHT, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_VERT | TBS_ENABLESELRANGE, 176, 33, 19, 192 + LTEXT "Text", IDC_ST_VERT_RIGHT, 177, 17, 22, 8, SS_LEFT + CONTROL "Slider", IDC_TB_VERT_LEFT, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_VERT | TBS_TOP, 212, 33, 19, 192 + LTEXT "Text", IDC_ST_VERT_LEFT, 216, 17, 27, 8, SS_LEFT + CONTROL "Slider", IDC_TB_VERT_BOTH, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS | TBS_VERT | TBS_BOTH, 257, 33, 27, 192 + LTEXT "Text", IDC_ST_VERT_BOTH, 261, 17, 21, 8, SS_LEFT +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_TREEVIEW_DLG DIALOG 6, 15, 300, 250 +STYLE DS_SHELLFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_TABSTOP +CAPTION "Tree View Control" +FONT 9, "Arial" +{ + CONTROL "Tree", IDC_TV_MAIN, WC_TREEVIEW, WS_TABSTOP | WS_BORDER | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS, 7, 7, 286, 236 +} diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/basicResize.h b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/basicResize.h new file mode 100644 index 0000000..f2eba66 --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/basicResize.h @@ -0,0 +1,50 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_RESIZABLE 101 +#define IDC_GB_TEST 1000 +#define IDC_EDIT_NAMES 1005 +#define IDC_ST_NAMES 1006 +#define IDC_ST_LABELS 1009 +#define IDC_EDIT_LABELS 1010 +#define IDC_ST_PLACES 1013 +#define IDC_EDIT_PLACES 1014 +#define IDC_PB_TEST 1015 +#define IDC_LV_MAIN 1016 diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/basicResize.rc b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/basicResize.rc new file mode 100644 index 0000000..1c58b5b --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/basicResize.rc @@ -0,0 +1,62 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "basicResize.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_RESIZABLE DIALOGEX 0, 0, 335, 281 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_TABSTOP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Basic Resizable Dialog" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + CONTROL "", IDC_LV_MAIN, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_ICON, 10, 10, 259, 169 + PUSHBUTTON "Test", IDC_PB_TEST, 275, 10, 50, 14 + GROUPBOX "Group Box Proportional", IDC_GB_TEST, 13, 186, 289, 66, 0, WS_EX_TRANSPARENT + LTEXT "Names:", IDC_ST_NAMES, 26, 206, 24, 10, SS_LEFT + EDITTEXT IDC_EDIT_NAMES, 55, 203, 95, 14, ES_AUTOHSCROLL + LTEXT "Labels:", IDC_ST_LABELS, 168, 206, 24, 10, SS_LEFT + EDITTEXT IDC_EDIT_LABELS, 196, 203, 95, 14, ES_AUTOHSCROLL + LTEXT "Places:", IDC_ST_PLACES, 25, 228, 24, 10, SS_LEFT + EDITTEXT IDC_EDIT_PLACES, 55, 225, 95, 14, ES_AUTOHSCROLL + DEFPUSHBUTTON "OK", IDOK, 220, 257, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 275, 257, 50, 14 +} diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/gbStationary.h b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/gbStationary.h new file mode 100644 index 0000000..f2eba66 --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/gbStationary.h @@ -0,0 +1,50 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_RESIZABLE 101 +#define IDC_GB_TEST 1000 +#define IDC_EDIT_NAMES 1005 +#define IDC_ST_NAMES 1006 +#define IDC_ST_LABELS 1009 +#define IDC_EDIT_LABELS 1010 +#define IDC_ST_PLACES 1013 +#define IDC_EDIT_PLACES 1014 +#define IDC_PB_TEST 1015 +#define IDC_LV_MAIN 1016 diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/gbStationary.rc b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/gbStationary.rc new file mode 100644 index 0000000..6886b6a --- /dev/null +++ b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/gbStationary.rc @@ -0,0 +1,61 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "gbStationary.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_RESIZABLE DIALOGEX 0, 0, 335, 301 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_TABSTOP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Resizable Dialog" +FONT 8, "Ms Shell Dlg", 400, 0, 1 +{ + CONTROL "", IDC_LV_MAIN, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_ICON, 10, 10, 259, 170 + PUSHBUTTON "Test", IDC_PB_TEST, 275, 95, 50, 14 + GROUPBOX "Group Box Stationary", IDC_GB_TEST, 13, 186, 289, 66, 0, WS_EX_TRANSPARENT + LTEXT "Names:", IDC_ST_NAMES, 26, 206, 24, 10, SS_LEFT + EDITTEXT IDC_EDIT_NAMES, 55, 203, 95, 14, ES_AUTOHSCROLL + LTEXT "Labels:", IDC_ST_LABELS, 168, 206, 24, 10, SS_LEFT + EDITTEXT IDC_EDIT_LABELS, 196, 203, 95, 14, ES_AUTOHSCROLL + LTEXT "Places:", IDC_ST_PLACES, 25, 228, 24, 10, SS_LEFT + EDITTEXT IDC_EDIT_PLACES, 55, 225, 95, 14, ES_AUTOHSCROLL + DEFPUSHBUTTON "OK", IDOK, 143, 257, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 143, 277, 50, 14 +} diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/propertySheetDemoListView.bmp b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/propertySheetDemoListView.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2414bdbe33a79efad4289230475e449f7b60984e GIT binary patch literal 2102 zcmeH_F_OYC3`L!oV#_@SC!l8N_x{HT|36udAsJH8?L;%ilA`w|Yk2(KehPNGlya4K z*ZI|%O8cPvo-HJovMk~4)ttF=1Lp?*-v;XUHh1e?z!BK+t&J}9rz%e(KHfoem5R5ZxKu5`SDZSlQa+`=36qy5 zV7n|}*dhZjm~C5rpZ6CYLQ@a$fw!C$c|Z=%_|e}ekHFc^f5e*}`!l;+dddNIiv4-= z9N#GWYj4OujnUveb{aenj~~Sh?ds+NMI3Ijx=Fv{$2@yOBvfN^s}R5UUq7#tjI<#} NXlj0bv&?*PKLOzk55)ig literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/propertySheetDemoTab.bmp b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/propertySheetDemoTab.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7b305ce0e088414a1b84a5d677af90692c33b244 GIT binary patch literal 7734 zcmeH}O>%=U429hrblFuW%bpmlww!7G%6!@3cW`78a%ITzZoUFN+V=6aWTB(s zCy&4`My;hOpK0D)yiAiFyyJep%Mf`*!^vU?-w>#ndC20rup9;?V8UrxIKD3ACl67E zruK$QH8ijH!tXQg%}!3;%NKBKK=Z)U6&yu`zBQZG4(N`>E3dYZFV^yp^95)TD^m@= zD>X=gFB}y$-<35Ig0B@T&*o4fRKblvsX`IM>wqg^OZ^1$X7tysjF#437{?vx*Sj!mJLjk9oz9BUpv%MG}C0qy$hDGL+nEB0#FRX z4pNhFKwVgrF5h3Z0arv>xJ3UAF=(<_CWVwmY&8{Le~N`EQd{|gtP1oSVS!q0O1upD zis|d-*nV(bfux+%X2@8@+486stLm_eX|hu^I;?fL(q)-K7o$Z15L*!yPM$^VbgiZP Zzdi$&Y;Ez{hje6*vUu$)bp4lR;2S3FB)0$n literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/propertySheetDemoTreeView.bmp b/modules/windows/oodialog/resizableDialogs/ResizingAdmin/rc/propertySheetDemoTreeView.bmp new file mode 100644 index 0000000000000000000000000000000000000000..19cb2476f3680e351b0ac86c4262754b05350625 GIT binary patch literal 11894 zcmd^^y>A@H8OFziizO9g!O|58R!I{U{sU+PYy(#M3j(kTz|QrSD+I<7u6!v(wsxg9 zU}04O0uWHj2!>#{X@t=SggZdO_<5dpzIJbUBxNgx>6gd3+4fzR*QLeadG8nIM*(>x3@n5Y7Cfbb+6x%H-WD$9(3!SS)7! zBFq+DFRwK2wfDidBi`OMecx5|i5m*Hx)`4PVG00;CFG4!Hr`UW3H-0W4c?W$K_OYw zgs!F7YXfX>9OxS~19>Ol{=)QqVe)VKHh&^-x4HcZ?^5*b9e^Jn|2BBLHtL&z1h?t> zrh!9Q(6tZDW?b^l{yU9Naw+#N9#P)-B3|FKvG|F+YkiylMjKT4-QfM^_!u3vkUbt4 z#Mydu8i}5QYcUNXMNjC1>k@C zRr-^cd$Rq+buDkobQ7)`s9iu{eJ2gb9zjzR?>H9e9WIRc6eq$kXP+#9Ve*gZhtCR|dTn$%t z8{Xbw0-T@1E3^9mPbX=wl6dDA zQ1X5vpThDq`I3P{83EzTY(*7b$2&ax9_18RttsBymc{Trcym6A4Zv*+uN(<@FO>f7 zneV$MMBbFPt9TcGg8dJSzJGz8>6E@zHwE9K@Y{bsgt#N`=&WWlE`3l6`H?qbW^gBn zSjZH(6NLx7kV$|QkPpIpC*JJ#ygA-bt?Cok%!k|kZ-M3?Xx0*szlkQv8i@eQ$KbXtNyVm#6oj~3cxW35y0GAdrBZL=t+xcJY zmim51`#x7+(Km9c<`2zs@zMM9=J*7+$4Ap9N>SRGHx-qQ`ig*B9;HNo5_uPYQt{R> zfhYV)2V`Ua-L`o{L+C6`|9v|D?teNVEbbdS)Z)J@cLLCQzPE|DJ#FnzwyEuP`bKYu zbLMcqd?()4F2fJV8+d)YjEAFIq2}Z)EH2 zMFGo3-qGFhc_w&kg~B|uoAFK)7VC`lJy@P#LZltV*5RsX>5BeamJ?R|37v_3R3=ZA zR-@_gdj(&0!<`&B1TNn6-^P2=e~S?V)@!1^3J*E7SPJUE?WqEs>t5AkCMj|~uN z#Bnd$)x7CUDsOTF-fXLCajfs3mp7+LZFVqms>8T7Z?CxTg6|N3H@Fcw*4;FP$yX>v z0V=_NFL-Wc{@dn2)a3z+HcI7u5DA&Lq-?jJe+Ah6{ESzLwDH!E>&dDG%8EZBZfhxq z*ZLFk9=!EKe}cVEwcDATFJBD&$>8q8mce?0ch=9MYdwx$LAe8JL=Z#YVJ7ztO0C!~ z?lj=7A<{g{7X-tF26R>hfnyM~ePSXkW+S!)?*~dlqInYB6ZwUA(gRAxg+hda-6utrIyKcjjN_9!Crd(8^h#O){jY8p3%qazHOO2*#y3LD! znwBvW&}PnYgV`^5hcv*ks!;RD>PbqV{~k@40J4*^`JI*qO4I9%R;vQH=e<*EujegQ z+fNQ@gITIVbUl7e18%r*U`NhK-y!_|`Evqwm%`mb-&8)_fq4W99M%9A&_~NoBwlm9 zm-69=uzo=m=0WN6v)L?-4qJ}A_hVHZosf6Fezn3ojBu~#eLq@m5QkOua&UEjIaq$D z_4iS#Kk!uMMb`1=;upW32|b!v;T;{dzZ6dAJ{76Vn>$p%18$Di6~@shyeof_^!;BI z=)XYy$h&HZw2QpyyJ1!SHPNW=Jb)9thb@fu^TW)acm+{Yo1Np5kZtAlAhjm5h@Xo$ z*-Dwvw-TUs<4tD-<0VdcTkq2Z$u? 0 then do + return 99 + end + d~execute("SHOWTOP") + return 0 + + +/*---------------------------- requires ------------------------------*/ + +::requires "ooDialog.cls" +::requires 'samplesSetup.rex' + +/*---------------------------- main dialog ---------------------------*/ + +::class 'SampleDlg' subclass RcDialog + +::method initDialog + sd = .application~srcDir + self~installBitmapButton(101, "VIDEO", sd"bmp\s2arch.bmp" ,,,,"FRAME STRETCH") + self~installBitmapButton(102, "PET", sd"bmp\s2anim.bmp" ,,,,"FRAME STRETCH") + self~installBitmapButton(103, "PHIL", sd"bmp\s2philf.bmp" ,,,,"FRAME STRETCH") + self~installBitmapButton(104, "GRAPHD", sd"bmp\s2scroll.bmp",,,,"FRAME STRETCH") + self~installBitmapButton(105, "WALKER", sd"bmp\s2walker.bmp",,,,"FRAME STRETCH") + self~installBitmapButton(106, "BANDIT", sd"bmp\s2jack.bmp" ,,,,"FRAME STRETCH") + self~installBitmapButton(107, "USER", sd"bmp\s2input.bmp" ,,,,"FRAME STRETCH") + self~installBitmapButton(108, "WIZ97", sd"bmp\s2mov.bmp" ,,,,"FRAME STRETCH") + self~installBitmapButton(109, "TREE", sd"bmp\s2tree.bmp" ,,,,"FRAME STRETCH") + self~installBitmapButton(110, "LIST", sd"bmp\s2list.bmp" ,,,,"FRAME STRETCH") + self~installBitmapButton(111, "PROGRESS", sd"bmp\s2prog.bmp" ,,,,"FRAME STRETCH") + self~installBitmapButton(112, "PROPERTY", sd"bmp\s2prop.bmp" ,,,,"FRAME STRETCH") + self~backgroundBitmap(sd"bmp\s2backg.bmp", "USEPAL") + +::method video + self~loadApp("oovideo.rex") + +::method pet + self~loadApp("AnimalGame.rex", 3000) + +::method phil + self~loadApp("oophil.rex") + +::method walker + self~loadApp("oowalk2.rex") + +::method bandit + self~loadApp("oobandit.rex", 3300) + +::method graphd + self~loadApp("oograph.rex", 3000) + +::method user + self~loadApp("oodStandardDialogs.rex", 2800) + +::method wiz97 + self~loadApp(.application~srcDir"propertySheet.tabControls\ticketWizard.rex") + +::method tree + self~loadApp(.application~srcDir"controls\TreeView\treeViewCustomDraw.rex") + +::method list + self~loadApp(.application~srcDir"propertySheet.tabControls\oodListViews.rex") + +::method progress + self~loadApp("oodpbar.rex") + +::method property + self~loadApp(.application~srcDir"propertySheet.tabControls\PropertySheetDemo.rex") + + +::method cancel + call play "byebye.wav" + self~cancel:super + return 0 + +::method ok + self~cancel + +::method help /* About button */ + call play "sample.wav", "YES" + d = .TimedMessage~new("Illustration of ooDialog Function", , + "Open Object Rexx ooDialog Samples", 5000) + d~execute + return 0 + +::method loadApp + use arg appname, pauseTime = 2000 + ret = play("start.wav", "yes") + d = .TimedMessage~new("Application will be started, please wait","Samples", pauseTime) + d~execute + + call (appname) + + /* make sure main window is enabled and the topmost window */ + self~enable + self~toTheTop diff --git a/modules/windows/oodialog/samplesSetup.rex b/modules/windows/oodialog/samplesSetup.rex new file mode 100755 index 0000000..5ca1d3e --- /dev/null +++ b/modules/windows/oodialog/samplesSetup.rex @@ -0,0 +1,60 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Contains common set up code for a number of the ooDialog sample programs. + * All we do here is set up the sound path. + * + * This file is intended to be used in a ::requires directive by the sample + * programs that need this common code. + */ + + -- Add the wav subdirectory to the sound path environment variable. The wav + -- directory is a subdirectory of this program file's location that contains + -- the wave files played in the programs that require this file. + pgmDir = locate() + env = 'ENVIRONMENT' + win = value('WINDIR', , env) + if .OS~isAtLeastVista then do + media = win'\Media' + win = win';'media + end + sp = value('SOUNDPATH', , env) + sp = value('SOUNDPATH', win';'pgmDir'WAV;'sp, env) + +::requires "ooDialog.cls" diff --git a/modules/windows/oodialog/simple/ChangeFont.rex b/modules/windows/oodialog/simple/ChangeFont.rex new file mode 100755 index 0000000..bfdbf1e --- /dev/null +++ b/modules/windows/oodialog/simple/ChangeFont.rex @@ -0,0 +1,127 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2009-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Simple Dialog showing how to: create a font. change the font of a control, + * manage buttons to prevent the user from getting the dialog in the wrong + * state. + * + * In this simple dialog, we don't want to manage the creation of lots of fonts, + * so after the user creates the first new font, we disable the button. That + * way the user can not create a new font thousands of times. + */ + + dlg = .FileViewDialog~new + if dlg~initCode <> 0 then do + say "Dialog initialization failed. Program Abort." + return 99 + end + + dlg~create(30, 30, 260, 180, "File Viewing Dialog", "VISIBLE") + dlg~execute("SHOWTOP") + +return 0 +-- End of entry point. + +::requires "ooDialog.cls" + +::class 'FileViewDialog' subclass UserDialog + +::method defineDialog + + self~autoDetect = .false + self~constDir[IDC_EDIT] = 110 + self~constDir[IDC_PB_OPEN] = 111 + self~constDir[IDC_PB_CHANGE_FONT] = 112 + + styles = "VSCROLL HSCROLL MULTILINE" + self~createEdit(IDC_EDIT, 5, 5, 250, 150, styles) + + self~createPushButton(IDC_PB_OPEN, 5, 160, 35, 15, , "Open", onOpen) + self~createPushButton(IDC_PB_CHANGE_FONT, 50, 160, 45, 15, , "Change Font", onFont) + self~createPushButton(IDOK, 220, 160, 35, 15, "DEFAULT", "OK") + +::method initDialog + expose editControl newFont + + newFont = .nil + editControl = self~newEdit(IDC_EDIT) + + helpMsg = "Use the Open button to open a text file" || .endOfLine || - + "and then use the Change Font button to" || .endOfLine || - + "change the font." + + editControl~setText(helpMsg) + self~newPushButton(IDC_PB_CHANGE_FONT)~disable + +::method onOpen + expose editControl newFont + + editControl~setText("") + + -- Have the open file dialog start in the same directory as the location of + -- this program. + parse source . . programSrc + startDirectory = fileSpec('L', programSrc) + + fileName = fileNameDialog(startDirectory, self~dlgHandle, , 1, "Open a File for Editing") + if fileName == 0 then return + + fObj = .stream~new(fileName) + fObj~open + if fObj~state \== 'READY' then return self~abort + + text = fObj~charin(1, fObj~chars) + fObj~close + + editControl~setText(text) + if newFont == .nil then self~newPushButton(IDC_PB_CHANGE_FONT)~enable + +::method onFont + expose editControl newFont + + newFont = self~createFontEx("Courier", 12) + editControl~setFont(newFont) + self~newPushButton(IDC_PB_CHANGE_FONT)~disable + +::method leaving + expose newFont + if newFont \= .nil then self~deleteFont(newFont) + +::method abort private + j = errorDialog("There is an unexplained error. Program Abort") + return self~cancel diff --git a/modules/windows/oodialog/simple/ReadMe.txt b/modules/windows/oodialog/simple/ReadMe.txt new file mode 100644 index 0000000..4c2c8ec --- /dev/null +++ b/modules/windows/oodialog/simple/ReadMe.txt @@ -0,0 +1,63 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2009-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + ReadMe + + 1. Simple ooDialog Example Programs + ------------------------------------ + + This directory contains example ooDialog programs that are intended to be + simple enough to not require any comment. They are short and only + demonstrate a few things. They should encourage the user to read the + ooDialog documentation to better understand the areas the programs are + concerned with. + + - SimpleUpDown.rex + + Shows how to create an up down control in a user dialog and initialize + it. + + - ChangeFont.rex + + Shows how to create a new font correctly and how to change the font of + a dialog control using the created font. It is also an example of a + multi-line edit control and shows how to enable and disable buttons. + + - SimpleMonthCalendar.rex + + Shows how to use a month calendar control in a rc dialog and how to + respond to selected date changes. diff --git a/modules/windows/oodialog/simple/SimpleMonthCalendar.h b/modules/windows/oodialog/simple/SimpleMonthCalendar.h new file mode 100644 index 0000000..8be5a7e --- /dev/null +++ b/modules/windows/oodialog/simple/SimpleMonthCalendar.h @@ -0,0 +1,44 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_MONTHCAL 101 +#define IDC_ST_BIRTHDATE 1004 +#define IDC_MC 1005 diff --git a/modules/windows/oodialog/simple/SimpleMonthCalendar.rc b/modules/windows/oodialog/simple/SimpleMonthCalendar.rc new file mode 100644 index 0000000..1a6f838 --- /dev/null +++ b/modules/windows/oodialog/simple/SimpleMonthCalendar.rc @@ -0,0 +1,53 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include "SimpleMonthCalendar.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_MONTHCAL DIALOG 0, 0, 254, 124 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Simple Month Calendar" +FONT 8, "Ms Shell Dlg" +{ + CONTROL "", IDC_MC, MONTHCAL_CLASS, WS_TABSTOP, 7, 7, 147, 105 + CONTROL "Pick you birth date.", IDC_STATIC, WC_STATIC, NOT WS_GROUP | SS_CENTER | SS_CENTERIMAGE, 169, 10, 75, 23 + CONTROL "", IDC_ST_BIRTHDATE, WC_STATIC, NOT WS_GROUP | SS_CENTER | SS_CENTERIMAGE, 169, 58, 75, 23 + CONTROL "OK", IDOK, WC_BUTTON, WS_TABSTOP | BS_DEFPUSHBUTTON, 194, 100, 50, 14 +} diff --git a/modules/windows/oodialog/simple/SimpleMonthCalendar.rex b/modules/windows/oodialog/simple/SimpleMonthCalendar.rex new file mode 100755 index 0000000..25bd044 --- /dev/null +++ b/modules/windows/oodialog/simple/SimpleMonthCalendar.rex @@ -0,0 +1,84 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * This program displays a month calendar control in a small dialog and prompts + * the user to pick their birthday. Each time the user selects a new date, that + * date is shown in a static text control. + */ + + sd = locate() + dlg = .SimpleMonthCalendar~new(sd"simpleMonthCalendar.rc", IDD_MONTHCAL, , sd"simpleMonthCalendar.h" ) + dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +return 0 +-- End of entry point. + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" + +::class 'SimpleMonthCalendar' subclass RcDialog + +::method initDialog + expose dateText + + self~connectMonthCalendarEvent(IDC_MC, "SELECT", onSelect) + + mc = self~newMonthCalendar(IDC_MC) + r = .Rect~new + + mc~getMinRect(r) + w = mc~getMaxTodayWidth + r~right = max(r~right, w) + + mc~resizeTo(r~right, r~bottom) + + dateText = self~newStatic(IDC_ST_BIRTHDATE) + +::method onSelect unguarded + expose dateText + use arg startDate, endDate + + dateText~setText(self~formatDate(startDate)) + return 0 + +::method formatDate private + use strict arg date + + return date~monthName date~standardDate~right(2)~strip('L', 0)',' date~standardDate~left(4) diff --git a/modules/windows/oodialog/simple/SimpleUpDown.rex b/modules/windows/oodialog/simple/SimpleUpDown.rex new file mode 100755 index 0000000..d167455 --- /dev/null +++ b/modules/windows/oodialog/simple/SimpleUpDown.rex @@ -0,0 +1,81 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2009-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * A simple UserDialog with an UpDown control. + */ + + .application~autoDetection(.false) + + dlg = .SimpleDialog~new + + dlg~execute("SHOWTOP") + +return 0 + +::requires "ooDialog.cls" + +::class 'SimpleDialog' subclass UserDialog + +::method init + forward class (super) continue + + self~addSymbolicIDs + + self~create(30, 30, 147, 69, "Simple UpDown Control", , "CENTER") + + +::method defineDialog + + self~createStatic(IDC_STATIC, 20, 21, 40, 12, "TEXT RIGHT", "Spin Me:") + self~createEdit(IDC_EDIT_BUDDY, 62, 20, 65, 12, "RIGHT NUMBER") + self~createUpDown(IDC_UPD, 81, 26, 12, 16, "WRAP ARROWKEYS AUTOBUDDY SETBUDDYINT") + self~createPushButton(IDOK, 22, 45, 50, 14, "DEFAULT", "Ok") + self~createPushButton(IDCANCEL, 77, 45, 50, 14, , "Cancel") + +::method initDialog + + upDown = self~newUpDown(IDC_UPD) + upDown~setRange(1, 20000) + upDown~setPosition(1000) + + +::method addSymbolicIDs private + + self~constDir[IDC_UPD] = 200 + self~constDir[IDC_EDIT_BUDDY] = 205 + diff --git a/modules/windows/oodialog/sysinfo/sysInfo.h b/modules/windows/oodialog/sysinfo/sysInfo.h new file mode 100644 index 0000000..07be3f5 --- /dev/null +++ b/modules/windows/oodialog/sysinfo/sysInfo.h @@ -0,0 +1,40 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2010-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#define SYSINFO_DLG 100 +#define IDC_CB_COMPONENTS 200 +#define IDC_LB_DATA 210 diff --git a/modules/windows/oodialog/sysinfo/sysinfo.rc b/modules/windows/oodialog/sysinfo/sysinfo.rc new file mode 100644 index 0000000..f9962e6 --- /dev/null +++ b/modules/windows/oodialog/sysinfo/sysinfo.rc @@ -0,0 +1,56 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**************************************************************************** +sysinfo.rc + +*****************************************************************************/ + +#include +#include + +SYSINFO_DLG DIALOG 80, 40, 213, 201 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "System Information" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 158, 180, 50, 14 + LTEXT "System Component", -1, 4, 6, 68, 12 + COMBOBOX IDC_CB_COMPONENTS, 75, 4, 132, 108, CBS_DROPDOWNLIST | WS_TABSTOP + LISTBOX IDC_LB_DATA, 4, 24, 204, 150, LBS_STANDARD | WS_HSCROLL +} + diff --git a/modules/windows/oodialog/sysinfo/sysinfo.rex b/modules/windows/oodialog/sysinfo/sysinfo.rex new file mode 100755 index 0000000..bd62c99 --- /dev/null +++ b/modules/windows/oodialog/sysinfo/sysinfo.rex @@ -0,0 +1,219 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: sysinfo.rex + * Type: Open Object Rexx Script using ooDialog and OLE + * Resource: sysinfo.rc + * + * Description: + * Demo application for inspecting some system properties using WMI + * + * WMI is the acronym for Windows Management Instrumentation. Full documentation + * of WMI can be found in the Windows SDK which Microsoft provides free of + * charge. You can also locate this documentation on the web. A google search + * of: + * + * "MSDN Windows Management Instrumentation" + * + * will lead you straight to the documentation + */ + + sd = locate() + .application~setDefaults("O", sd'sysInfo.h', .false) + + sysInfoDlg = .SystemClass~new(sd'sysinfo.rc', SYSINFO_DLG) + if sysInfoDlg~initCode == 0 then do + sysInfoDlg~execute("SHOWTOP") + end + +return 0 + + +::requires "ooDialog.cls" + +::class 'SystemClass' subclass RcDialog + +::method initDialog + expose cb lb componentQueue queueHasData userHasQuit + + -- Connect the selection change event of the combo box to a method in this + -- dialog. + self~connectComboBoxEvent(IDC_CB_COMPONENTS, "SELCHANGE", selectionChange) + + -- Fill the combo box with the names of the WMI classes we will display. + cb = self~newComboBox(IDC_CB_COMPONENTS) + if cb \= .nil then do + cb~add("Win32_BootConfiguration") + cb~add("Win32_ComputerSystem") + cb~add("Win32_Environment") + cb~add("Win32_OperatingSystem") + cb~add("Win32_Printer") + cb~add("Win32_Process") + cb~add("Win32_Processor") + cb~add("Win32_Service") + end + + lb = self~newListBox(IDC_LB_DATA) + cb~select("Win32_ComputerSystem") + + componentQueue = .queue~new + queueHasData = .false + userHasQuit = .false + doneProcessing = .true + self~start("queueProcessor") + + self~addToQueue("Win32_ComputerSystem") + + +::method queueProcessor unguarded + expose queueHasData componentQueue lb userHasQuit doneProcessing + + doneProcessing = .false + + do forever + if userHasQuit then leave + + guard on when queueHasData + + if userHasQuit then leave + + component = componentQueue~pull + do while component \== .nil + if userHasQuit then leave + + -- Change the cursor to the hour glass cursor to indicate we are processing + -- and the user should be patient. + self~showHourGlass + + WMIObject = .OLEObject~getObject("WinMgmts:") + + if WMIObject \== .nil, component \== "" then do + if userHasQuit then leave + + lb~deleteAll + objects = WMIObject~instancesOf(component) + + do instance over objects + if userHasQuit then leave + + -- Please note: these objects offer a lot more information than is + -- displayed here. For simplicity's sake only the name and description + -- (if available) are shown. + + name = instance~name + desc = instance~description + if ((name = desc) | (desc = .nil)) then + lb~add(name) + else + lb~add(name "("desc")") + end + + end + -- Restore the cursor to its original shape and position. + self~showHourGlass(.false) + + component = componentQueue~pull + end + queueHasData = .false + end + + doneProcessing = .true + +::method selectionChange unguarded + expose cb lb + + component = cb~selected + self~addToQueue(component) + + return 0 + +::method ok unguarded + expose userHasQuit queueHasData doneProcessing + + userHasQuit = .true + queueHasData = .true + + guard on when doneProcessing + + return self~ok:super + +::method cancel unguarded + expose userHasQuit queueHasData doneProcessing + + userHasQuit = .true + queueHasData = .true + + guard on when doneProcessing + + return self~cancel:super + +::method addToQueue private + expose queueHasData componentQueue + use strict arg component + + componentQueue~queue(component) + queueHasData = .true + + +::method showHourGlass private + expose lb oldCursorPosition oldCursor + use strict arg show = .true + + mouse = .Mouse~new(lb) + + if show then do + -- Save the current cursor position. Change the list box's cursor shape to + -- the hour glass and save the old shape. + oldCursorPosition = mouse~getCursorPos + oldCursor = mouse~wait + + -- Get the current size and position of the list box. + p = lb~getRealPos + s = lb~getRealSize + + -- Set the point object to the midpoint of the list box and position the + -- cursor at that posiiion + p~incr(s~width % 2, s~height % 2) + mouse~setCursorPos(p) + end + else do + mouse~restoreCursor(oldCursor) + mouse~setCursorPos(oldCursorPosition) + end + diff --git a/modules/windows/oodialog/tutorial/add.bmp b/modules/windows/oodialog/tutorial/add.bmp new file mode 100644 index 0000000000000000000000000000000000000000..340ab50570e1e2786252b96cd86a005380a6857d GIT binary patch literal 3046 zcmeH{K~BXW5QcvfjV30v$Iyja*Uj5|CywM1y6`Ms1OK7GP#%Rg&xJ9a1eh7VPX7)K zmyhpfczeGGUg*7XymH*($>%>GfiJTRp9qt+mL7+!y3nZV2&77AHjLmK*l~}Wr79|EgRFODCzR!m>#%= zAA<4anagOS{;+)UAiTN_{$PDps@sO18cbA;K&L;-dauh%Yt;Jn7m0i#YVGLxO@29| z^(^%P>hWm_^nVk#F#p%Wke3aKcJapJSNvK^R6sq^*7X_nEz{G7N!-9km6cUroz)k& zZrNqZ!Y+lPHRvRE>mF5 fCyk}Ep{K;Eai+hzUnUcuM0XrEkwn?bW=#GEc;sH4 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/tutorial/drawing1.rex b/modules/windows/oodialog/tutorial/drawing1.rex new file mode 100755 index 0000000..d752748 --- /dev/null +++ b/modules/windows/oodialog/tutorial/drawing1.rex @@ -0,0 +1,93 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: drawing1.rex + * Type: Open Object REXX Script + * + * Description: Example demonstrating drawing functionality. + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"drawings.rc", 100) +if dlg~initCode <> 0 then return 99 +dlg~execute("SHOWTOP") + +return 0 + +::requires "ooDialog.cls" + +::class 'MyDialogClass' subclass RcDialog + +::method init + + forward class (super) continue + if self~initCode <> 0 then return self~initCode + + self~connectButtonEvent(11, "CLICKED", "circle") + self~connectButtonEvent(12, "CLICKED", "myRectangle") + + return self~initCode + + +::method circle + + dc = self~getControlDC(10) + pen = self~createPen(5, "SOLID", 1) + oldPen = self~objectToDc(dc, pen) + + self~drawArc(dc, 10, 10, 320, 200) + + self~objectToDc(dc, oldPen) + self~deleteObject(pen) + self~freeControlDC(10, dc) + + +::method myRectangle + + dc = self~getControlDC(10) + pen = self~createPen(10, "DOT", 2) + oldPen = self~ObjectToDc(dc, pen) + + self~rectangle(dc, 10, 10, 320, 200) + + self~objectToDc(dc, oldPen) + self~deleteObject(pen) + self~freeControlDC(10, dc) + + diff --git a/modules/windows/oodialog/tutorial/drawing2.rex b/modules/windows/oodialog/tutorial/drawing2.rex new file mode 100755 index 0000000..dc4f919 --- /dev/null +++ b/modules/windows/oodialog/tutorial/drawing2.rex @@ -0,0 +1,152 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: drawing2.rex + * Type: Open Object REXX Script + * + * Description: Example demonstrating drawing functionality. + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"drawings.rc", 100) +if dlg~initCode <> 0 then return 99 +dlg~execute("SHOWTOP") + +return 0 + +::requires "ooDialog.cls" + +::class 'MyDialogClass' subclass RcDialog + +::attribute graphicObject + +::method init + + forward class (super) continue + if self~initCode <> 0 then return self~initCode + + self~connectButtonEvent(11, "CLICKED", "circle") + self~connectButtonEvent(12, "CLICKED", "myRectangle") + self~connectDraw(10, "drawIt") + + self~graphicObject = "NONE" + + return self~initCode + + +::method drawIt + use arg id + + if self~graphicObject = "NONE" then return 0 + + dc = self~getControlDC(10) + + if self~graphicObject = "CIRCLE" then do + pen = self~createPen(5, "SOLID", 1) + end + else do + pen = self~createPen(8, "SOLID", 2) + end + + oldPen = self~objectToDc(dc, pen) + + properties = .directory~new + properties~weight = 700 + properties~italic = .true + + font = self~createFontEx("Arial", 24, properties) + oldFont = self~fontToDC(dc, font) + + self~transparentText(dc) + + self~getTextAlign(dc) + + if self~graphicObject = "CIRCLE" then do + -- Get the size of the bounding rectangle for the text we are going to + -- write, in this DC: + size = self~getTextExtent(dc, self~graphicObject) + + -- Get the midpoint of the circle we are about to draw; + pos = .Point~new(((300 - 10) % 2) + 10, ((200 - 10) % 2) + 10) + + -- Now adjust the pos point to specify where to write the text, in order + -- to center it in the circle: + pos~x -= size~width % 2 + pos~y -= size~height % 2 + + -- Draw the circle. + self~drawArc(dc, 10, 10, 300, 200) + end + else do + -- Do the same calculations for the position to write the text as we did + -- above for CIRCLE: + size = self~getTextExtent(dc, self~graphicObject) + + pos = .Point~new(((320 - 10) % 2) + 10, ((200 - 10) % 2) + 10) + pos~x -= size~width % 2 + pos~y -= size~height % 2 + + -- Draw the rectangle. + self~rectangle(dc, 10, 10, 320, 200) + end + + -- Write the text at the position we calculated above. + self~writeDirect(dc, pos~x, pos~y, self~graphicObject) + + self~fontToDC(dc, oldFont) + self~deleteFont(font) + + self~objectToDc(dc, oldPen) + self~deleteObject(pen) + + self~opaqueText(dc) + self~freeControlDC(10, dc) + + return .true + + +::method circle + self~graphicObject = "CIRCLE" + self~redrawControl(10, 1) + + +::method myRectangle + self~graphicObject = "RECTANGLE" + self~redrawControl(10, 1) + diff --git a/modules/windows/oodialog/tutorial/drawing3.rex b/modules/windows/oodialog/tutorial/drawing3.rex new file mode 100755 index 0000000..2243720 --- /dev/null +++ b/modules/windows/oodialog/tutorial/drawing3.rex @@ -0,0 +1,137 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: drawing3.rex + * Type: Open Object REXX Script + * + * Description: Example demonstrating drawing functionality, using the + * extended arguments sent to the DRAW event handler. + */ + + sd = locate() + dlg = .MyDialogClass~new(sd"drawings.rc", 100) + if dlg~initCode <> 0 then return 99 + dlg~execute("SHOWTOP") + +return 0 + +::requires "ooDialog.cls" + +::class 'MyDialogClass' subclass RcDialog + +::attribute graphicObject + +::method init + + forward class (super) continue + if self~initCode <> 0 then return self~initCode + + self~connectButtonEvent(11, "CLICKED", "circle") + self~connectButtonEvent(12, "CLICKED", "myRectangle") + self~connectDraw(10, "drawIt", .true) + + self~graphicObject = "NONE" + + return self~initCode + + +::method drawIt unguarded + use arg id, lp, drawObj, itemID, flags, dc, r, itemData + + if self~graphicObject = "NONE" then return .true + + if self~graphicObject = "CIRCLE" then do + pen = drawObj~createPen(5, "SOLID", 1) + end + else do + pen = drawObj~createPen(8, "SOLID", 2) + end + + oldPen = drawObj~objectToDc(dc, pen) + + properties = .directory~new + properties~weight = 700 + properties~italic = .true + + font = drawObj~createFontEx("Arial", 24, properties) + oldFont = drawObj~fontToDC(dc, font) + + drawObj~transparentText(dc) + + -- Get the midpoint of the button rectangle and set the text align to center + pos = .Point~new(r~right % 2, r~bottom % 2) + oldAlign = drawObj~setTextAlign(dc, 'CENTER BASELINE NOUPDATECP') + + -- Get a draw rectangle indented 5 from the button's area. + dr = .Rect~new(r~left + 5, r~top + 5, r~right - 10, r~bottom - 10) + + if self~graphicObject = "CIRCLE" then do + -- Draw the circle, within our draw rectangle + drawObj~drawArc(dc, dr~left, dr~top, dr~right, dr~bottom) + end + else do + -- Draw the rectangle, indented like the circle above. + drawObj~rectangle(dc, dr~left, dr~top, dr~right, dr~bottom) + end + + -- Write the text at the position we calculated above. + drawObj~writeDirect(dc, pos~x, pos~y, self~graphicObject) + + -- Now restore the DC so it is the same as passed into us. + drawObj~setTextAlign(dc, oldAlign) + drawObj~fontToDC(dc, oldFont) + drawObj~objectToDc(dc, oldPen) + + drawObj~opaqueText(dc) + + drawObj~deleteFont(font) + drawObj~deleteObject(pen) + + return .true + + +::method circle unguarded + self~graphicObject = "CIRCLE" + self~redrawControl(10, 1) + + +::method myRectangle unguarded + self~graphicObject = "RECTANGLE" + self~redrawControl(10, 1) + diff --git a/modules/windows/oodialog/tutorial/drawing4.rex b/modules/windows/oodialog/tutorial/drawing4.rex new file mode 100755 index 0000000..7815d90 --- /dev/null +++ b/modules/windows/oodialog/tutorial/drawing4.rex @@ -0,0 +1,112 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: drawing3.rex + * Type: Open Object REXX Script + * + * Description: Example demonstrating drawing functionality, using the + * extended arguments sent to the DRAW event handler. + */ + + dlg = .OwnerDrawDlg~new + if dlg~initCode <> 0 then return 99 + dlg~execute("SHOWTOP") + +return 0 + +::requires "ooDialog.cls" + +::class 'OwnerDrawDlg' subclass UserDialog + +::method init + + forward class (super) continue + self~create(6, 15, 187, 135, "Owner-drawn Button Dialog", "CENTER") + + self~connectDraw(10, "drawIt", .true) + +::method defineDialog + self~createPushButton(10, 6, 6, 175, 123, "OWNER", "") + +::method drawIt unguarded + use arg id, lp, drawObj, itemID, flags, dc, r, itemData + + -- Uncomment these lines for some insight as to what is happeninge to seen when the event handler is executed: + -- say id lp drawObj itemID flags dc r itemData + -- say 'Draw It' + + -- Create a pen to draw a circle with. + pen = drawObj~createPen(5, "SOLID", 1) + oldPen = drawObj~objectToDc(dc, pen) + + -- Create a font to use to draw text with. + properties = .directory~new + properties~weight = 700 + properties~italic = .true + + font = drawObj~createFontEx("Arial", 24, properties) + oldFont = drawObj~fontToDC(dc, font) + + drawObj~transparentText(dc) + + -- Get the midpoint of the button rectangle and set the text align to center + pos = .Point~new(r~right % 2, r~bottom % 2) + oldAlign = drawObj~setTextAlign(dc, 'CENTER BASELINE NOUPDATECP') + + -- Get a rectangle indented 5 from the button's area. + dr = .Rect~new(r~left + 5, r~top + 5, r~right - 10, r~bottom - 10) + + -- Draw a circle, within the rectangle + drawObj~drawArc(dc, dr~left, dr~top, dr~right, dr~bottom) + + -- Write some text at the position we calculated above. + drawObj~writeDirect(dc, pos~x, pos~y, 'Circle') + + -- Now restore the DC so it is the same as passed into us. + drawObj~setTextAlign(dc, oldAlign) + drawObj~fontToDC(dc, oldFont) + drawObj~objectToDc(dc, oldPen) + + drawObj~opaqueText(dc) + + drawObj~deleteFont(font) + drawObj~deleteObject(pen) + + return .true + diff --git a/modules/windows/oodialog/tutorial/drawing5.rex b/modules/windows/oodialog/tutorial/drawing5.rex new file mode 100755 index 0000000..8ed6710 --- /dev/null +++ b/modules/windows/oodialog/tutorial/drawing5.rex @@ -0,0 +1,153 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2014-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: drawing5.rex + * Type: Open Object REXX Script + * + * Description: Example demonstrating drawing functionality, using the + * extended arguments sent to the DRAW event handler. + * + * Draws and updates the time, implementing a simple clock + * interface. + */ + + dlg = .OwnerDrawDlg~new + if dlg~initCode <> 0 then return 99 + dlg~execute("SHOWTOP") + +return 0 + +::requires "ooDialog.cls" + +::class 'OwnerDrawDlg' subclass UserDialog + +::method init + expose timeFont circlePen pleaseQuit + + forward class (super) continue + self~create(6, 15, 187, 135, "Owner-drawn Button Dialog", "CENTER") + + self~connectDraw(10, "drawIt", .true) + + -- Create a font to use to draw text with. + properties = .directory~new + properties~weight = 700 + properties~italic = .true + timeFont = self~createFontEx("Arial", 24, properties) + + -- Create a pen to draw a circle with. + circlePen = self~createPen(5, "SOLID", 1) + + pleaseQuit = .false + +::method defineDialog + self~createPushButton(10, 6, 6, 175, 123, "OWNER", "") + +::method initDialog + expose oneSecond oneSecondAlarm drawSurface + + drawSurface = self~newPushButton(10) + oneSecond = .TimeSpan~fromSeconds(1) + timerMsg = .Message~new(self, paint) + oneSecondAlarm = .Alarm~new(oneSecond, timerMsg) + + +::method paint unguarded + expose oneSecond oneSecondAlarm drawSurface pleaseQuit + + if pleaseQuit then return + + reply + drawSurface~update + + timerMsg = .Message~new(self, paint) + oneSecondAlarm = .Alarm~new(oneSecond, timerMsg) + +::method drawIt unguarded + expose timeFont circlePen + use arg id, lp, drawObj, itemID, flags, dc, r, itemData + + now = .DateTime~new~normalTime + + -- Uncomment these lines for some insight as to what is happeninge to seen when the event handler is executed: + -- say id lp drawObj itemID flags dc r itemData + -- say 'Draw It' + + -- Erases the entire drawing surface, this could be improved, maybe, by only + -- erasing what needs to be erased. + self~rectangle(dc, r~left, r~top, r~right, r~bottom, 'FILL') + + oldPen = drawObj~objectToDc(dc, circlePen) + oldFont = drawObj~fontToDC(dc, timeFont) + + drawObj~transparentText(dc) + + -- Get the midpoint of the button rectangle and set the text align to center + pos = .Point~new(r~right % 2, r~bottom % 2) + oldAlign = drawObj~setTextAlign(dc, 'CENTER BASELINE NOUPDATECP') + + -- Get a rectangle indented 5 from the button's area. + dr = .Rect~new(r~left + 5, r~top + 5, r~right - 10, r~bottom - 10) + + -- Draw a circle, within the rectangle + drawObj~drawArc(dc, dr~left, dr~top, dr~right, dr~bottom) + + -- Write the time at the position we calculated above. + drawObj~writeDirect(dc, pos~x, pos~y, now) + + -- Now restore the DC so it is the same as passed into us. + drawObj~setTextAlign(dc, oldAlign) + drawObj~fontToDC(dc, oldFont) + drawObj~objectToDc(dc, oldPen) + drawObj~opaqueText(dc) + + return .true + +::method leaving + expose timeFont circlePen + self~deleteFont(timeFont) + self~deleteObject(circlePen) + + +::method cancel unguarded + expose pleaseQuit oneSecondAlarm + pleaseQuit = .true + oneSecondAlarm~cancel + return self~cancel:super + diff --git a/modules/windows/oodialog/tutorial/drawings.rc b/modules/windows/oodialog/tutorial/drawings.rc new file mode 100644 index 0000000..9c5a08f --- /dev/null +++ b/modules/windows/oodialog/tutorial/drawings.rc @@ -0,0 +1,60 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**************************************************************************** + +drawings.rc + +produced by VisualAge Resource Workshop + +*****************************************************************************/ + +#include + +#define DIALOG_1 1 + +100 DIALOG 6, 15, 187, 135 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ooDialog Drawings" +FONT 8, "System" +{ + PUSHBUTTON "Button", 10, 6, 6, 176, 104, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Circle", 11, 7, 115, 50, 14 + PUSHBUTTON "&Rectangle", 12, 67, 115, 50, 14 + DEFPUSHBUTTON "Leave", 1, 129, 115, 50, 14 +} + diff --git a/modules/windows/oodialog/tutorial/employe1.rc b/modules/windows/oodialog/tutorial/employe1.rc new file mode 100644 index 0000000..f6763a7 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe1.rc @@ -0,0 +1,69 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**************************************************************************** + +employe1.rc + +produced by VisualAge Resource Workshop + +*****************************************************************************/ + +#include + +#define DIALOG_1 1 + +100 DIALOG 6, 15, 241, 141 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Employees" +FONT 8, "System" +{ + CONTROL "Name", 21, "EDIT", WS_BORDER | WS_TABSTOP, 50, 11, 177, 12 + CONTROL "City", 22, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 50, 30, 174, 55 + CONTROL "Profession", 23, "LISTBOX", LBS_STANDARD, 73, 52, 156, 65 + AUTORADIOBUTTON "&Male", 31, 12, 71, 28, 12 + AUTORADIOBUTTON "&Female", 32, 12, 84, 39, 12 + AUTOCHECKBOX "M&arried", 41, 12, 99, 37, 12 + DEFPUSHBUTTON "OK", IDOK, 69, 123, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 125, 123, 50, 14 + PUSHBUTTON "Help", IDHELP, 180, 123, 50, 14 + LTEXT "Person:", -1, 10, 12, 34, 8 + LTEXT "City:", -1, 10, 32, 34, 8 + LTEXT "Profession:", -1, 10, 53, 42, 8 + CONTROL "", -1, "static", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE, 9, 68, 47, 45 +} + diff --git a/modules/windows/oodialog/tutorial/employe1.rex b/modules/windows/oodialog/tutorial/employe1.rex new file mode 100755 index 0000000..bc73be0 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe1.rex @@ -0,0 +1,58 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employe1.rex + * Type: Open Object REXX Script + */ + +sd = locate() +dlg = .UserDialog~new +if dlg~initCode <> 0 then exit +if dlg~load(sd"employe1.rc", 100) \= 0 then exit +if dlg~execute("SHOWTOP") = 1 then do + say dlg~name + say dlg~city + say dlg~profession + say dlg~male + say dlg~female + say dlg~married +end + +::requires "ooDialog.cls" + diff --git a/modules/windows/oodialog/tutorial/employe2.rc b/modules/windows/oodialog/tutorial/employe2.rc new file mode 100644 index 0000000..1ae5f3c --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe2.rc @@ -0,0 +1,70 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**************************************************************************** + +employe2.rc + +produced by VisualAge Resource Workshop + +*****************************************************************************/ + +#include + +#define DIALOG_1 1 + +100 DIALOG 6, 15, 241, 141 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Employees" +FONT 8, "System" +{ + CONTROL "Name", 21, "EDIT", WS_BORDER | WS_TABSTOP, 50, 11, 177, 12 + CONTROL "City", 22, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 50, 30, 174, 55 + CONTROL "Profession", 23, "LISTBOX", LBS_STANDARD, 73, 52, 156, 65 + AUTORADIOBUTTON "&Male", 31, 12, 71, 28, 12 + AUTORADIOBUTTON "&Female", 32, 12, 84, 39, 12 + AUTOCHECKBOX "M&arried", 41, 12, 99, 37, 12 + PUSHBUTTON "&Print", 10, 8, 123, 50, 14 + DEFPUSHBUTTON "OK", IDOK, 69, 123, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 125, 123, 50, 14 + PUSHBUTTON "Help", IDHELP, 180, 123, 50, 14 + LTEXT "Person:", -1, 10, 12, 34, 8 + LTEXT "City:", -1, 10, 32, 34, 8 + LTEXT "Profession:", -1, 10, 53, 42, 8 + CONTROL "", -1, "static", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE, 9, 68, 47, 45 +} + diff --git a/modules/windows/oodialog/tutorial/employe2.rex b/modules/windows/oodialog/tutorial/employe2.rex new file mode 100755 index 0000000..b1cf60e --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe2.rex @@ -0,0 +1,72 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employe2.rex + * Type: Open Object REXX Script + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"employe1.rc", 100) +if dlg~initCode <> 0 then exit + +if dlg~execute("SHOWTOP") = 1 then do + say dlg~name + say dlg~city + say dlg~profession + say dlg~male + say dlg~female + say dlg~married +end + +::requires "ooDialog.cls" + +::class MyDialogClass subclass RcDialog +::method initDialog + self~city = "New York" + self~male = 1 + self~female = 0 + self~addComboEntry(22, "Munich") + self~addComboEntry(22, "New York") + self~addComboEntry(22, "San Francisco") + self~addComboEntry(22, "Stuttgart") + self~addListEntry(23, "Business Manager") + self~addListEntry(23, "Software Developer") + self~addListEntry(23, "Broker") + self~addListEntry(23, "Police Man") + self~addListEntry(23, "Lawyer") diff --git a/modules/windows/oodialog/tutorial/employe3.rc b/modules/windows/oodialog/tutorial/employe3.rc new file mode 100644 index 0000000..3258255 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe3.rc @@ -0,0 +1,72 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**************************************************************************** + +employe3.rc + +produced by VisualAge Resource Workshop + +*****************************************************************************/ + +#include + +#define DIALOG_1 1 + +100 DIALOG 6, 15, 241, 141 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Employees" +FONT 8, "System" +{ + CONTROL "Name", 21, "EDIT", WS_BORDER | WS_TABSTOP, 42, 11, 167, 12 + CONTROL "", 11, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY, 219, 8, 10, 17 + CONTROL "City", 22, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 30, 167, 56 + CONTROL "Profession", 23, "LISTBOX", LBS_STANDARD, 73, 52, 156, 65 + AUTORADIOBUTTON "&Male", 31, 12, 71, 28, 12 + AUTORADIOBUTTON "&Female", 32, 12, 84, 39, 12 + AUTOCHECKBOX "M&arried", 41, 12, 99, 37, 12 + PUSHBUTTON "&Add", 12, 204, 29, 26, 14 + PUSHBUTTON "&Print", 10, 8, 123, 50, 14 + DEFPUSHBUTTON "OK", IDOK, 69, 123, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 125, 123, 50, 14 + PUSHBUTTON "Help", IDHELP, 180, 123, 50, 14 + LTEXT "Person:", -1, 10, 12, 28, 8 + LTEXT "City:", -1, 10, 32, 19, 8 + LTEXT "Profession:", -1, 10, 53, 39, 8 + CONTROL "", -1, "static", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE, 9, 68, 47, 45 +} + diff --git a/modules/windows/oodialog/tutorial/employe3.rex b/modules/windows/oodialog/tutorial/employe3.rex new file mode 100755 index 0000000..caae665 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe3.rex @@ -0,0 +1,75 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employe3.rex + * Type: Open Object REXX Script + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"employe2.rc", 100) +if dlg~initCode <> 0 then exit + +dlg~execute("SHOWTOP") + +::requires "ooDialog.cls" + +::class MyDialogClass subclass RcDialog +::method initDialog + self~city = "New York" + self~male = 1 + self~female = 0 + self~addComboEntry(22, "Munich") + self~addComboEntry(22, "New York") + self~addComboEntry(22, "San Francisco") + self~addComboEntry(22, "Stuttgart") + self~addListEntry(23, "Business Manager") + self~addListEntry(23, "Software Developer") + self~addListEntry(23, "Broker") + self~addListEntry(23, "Police Man") + self~addListEntry(23, "Lawyer") + self~connectButtonEvent(10, "CLICKED", "Print") /* connect button 10 with a method */ + +::method print + if self~male = 1 then title = "Mr." + else title = "Ms." + if self~married = 1 then addition = " (married) " + else addition = "" + say title self~name addition + say "City:" self~city + say "Profession:" self~profession diff --git a/modules/windows/oodialog/tutorial/employe4.rc b/modules/windows/oodialog/tutorial/employe4.rc new file mode 100644 index 0000000..f0a837a --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe4.rc @@ -0,0 +1,72 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**************************************************************************** + +employe4.rc + +produced by VisualAge Resource Workshop + +*****************************************************************************/ + +#include + +#define DIALOG_1 1 + +100 DIALOG 6, 15, 241, 141 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Employees" +FONT 8, "System" +{ + CONTROL "Name", 21, "EDIT", WS_BORDER | WS_TABSTOP, 42, 11, 167, 12 + CONTROL "City", 22, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 30, 167, 56 + CONTROL "Profession", 23, "LISTBOX", LBS_STANDARD, 73, 52, 156, 65 + AUTORADIOBUTTON "&Male", 31, 12, 71, 26, 12 + AUTORADIOBUTTON "&Female", 32, 12, 84, 34, 12 + AUTOCHECKBOX "M&arried", 41, 12, 99, 37, 12 + PUSHBUTTON "&Add", 12, 212, 28, 23, 21 + PUSHBUTTON "&Print", 10, 8, 123, 50, 14 + DEFPUSHBUTTON "OK", IDOK, 66, 123, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 124, 123, 50, 14 + LTEXT "Person:", -1, 10, 12, 27, 8 + LTEXT "City:", -1, 10, 32, 16, 8 + LTEXT "Profession:", -1, 10, 53, 39, 8 + CONTROL "", -1, "static", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE, 9, 68, 47, 45 + SCROLLBAR 11, 219, 8, 9, 17, SBS_VERT + PUSHBUTTON "Help", IDHELP, 180, 123, 50, 14 +} + diff --git a/modules/windows/oodialog/tutorial/employe4.rex b/modules/windows/oodialog/tutorial/employe4.rex new file mode 100755 index 0000000..812db3e --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe4.rex @@ -0,0 +1,76 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employe4.rex + * Type: Open Object REXX Script + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"employe2.rc", 100) +if dlg~initCode <> 0 then exit + +dlg~execute("SHOWTOP") + +::requires "ooDialog.cls" + +::class MyDialogClass subclass RcDialog +::method initDialog + self~city = "New York" + self~male = 1 + self~female = 0 + self~addComboEntry(22, "Munich") + self~addComboEntry(22, "New York") + self~addComboEntry(22, "San Francisco") + self~addComboEntry(22, "Stuttgart") + self~addListEntry(23, "Business Manager") + self~addListEntry(23, "Software Developer") + self~addListEntry(23, "Broker") + self~addListEntry(23, "Police Man") + self~addListEntry(23, "Lawyer") + self~connectButtonEvent(10, "CLICKED", "Print") /* connect button 10 with a method */ + +::method print + self~getData + if self~male = 1 then title = "Mr." + else title = "Ms." + if self~married = 1 then addition = " (married) " + else addition = "" + + call infoDialog title self~name addition || "A"x || "City:" self~city || "A"x || - + "Profession:" self~profession diff --git a/modules/windows/oodialog/tutorial/employe4validate.rex b/modules/windows/oodialog/tutorial/employe4validate.rex new file mode 100755 index 0000000..95dda3c --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe4validate.rex @@ -0,0 +1,84 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employe4valid.rex + * Type: Open Object REXX Script + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"employe2.rc", 100) +if dlg~initCode <> 0 then exit + +dlg~execute("SHOWTOP") + +::requires "ooDialog.cls" + +::class MyDialogClass subclass RcDialog +::method initDialog + self~city = "New York" + self~male = 1 + self~female = 0 + self~addComboEntry(22, "Munich") + self~addComboEntry(22, "New York") + self~addComboEntry(22, "San Francisco") + self~addComboEntry(22, "Stuttgart") + self~addListEntry(23, "Business Manager") + self~addListEntry(23, "Software Developer") + self~addListEntry(23, "Broker") + self~addListEntry(23, "Police Man") + self~addListEntry(23, "Lawyer") + self~connectButtonEvent(10, "CLICKED", "Print") /* connect button 10 with a method */ + +::method print + self~getData + if self~male = 1 then title = "Mr." + else title = "Ms." + if self~married = 1 then addition = " (married) " + else addition = "" + call infoDialog title self~name addition || "A"x || "City:" self~city || "A"x ||, + "Profession:" self~profession + +::method validate + if self~getControlData(21)~strip = "" then do + call infoDialog "An unnamed employee is not accepted!" + return .false /* dialog cannot be closed */ + end + else do + return .true /* dialog can be closed */ + end diff --git a/modules/windows/oodialog/tutorial/employe5.rc b/modules/windows/oodialog/tutorial/employe5.rc new file mode 100644 index 0000000..bd688cc --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe5.rc @@ -0,0 +1,83 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**************************************************************************** + +employe5.rc + +produced by VisualAge Resource Workshop + +*****************************************************************************/ + +#include + +100 DIALOG 6, 15, 241, 141 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Employees" +FONT 8, "System" +{ + CONTROL "Name", 21, "EDIT", WS_BORDER | WS_TABSTOP, 42, 11, 167, 12 + CONTROL "", 11, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY, 219, 8, 10, 17 + CONTROL "City", 22, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 30, 167, 56 + CONTROL "Profession", 23, "LISTBOX", LBS_STANDARD, 73, 52, 156, 65 + AUTORADIOBUTTON "&Male", 31, 12, 71, 26, 12 + AUTORADIOBUTTON "&Female", 32, 12, 84, 34, 12 + AUTOCHECKBOX "M&arried", 41, 12, 99, 37, 12 + PUSHBUTTON "&Add", 12, 212, 28, 23, 21 + PUSHBUTTON "&Print", 10, 8, 123, 50, 14 + DEFPUSHBUTTON "OK", IDOK, 63, 123, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 118, 123, 50, 14 + PUSHBUTTON "&List Employees", 13, 174, 123, 56, 14 + LTEXT "Person:", -1, 10, 12, 27, 8 + LTEXT "City:", -1, 10, 32, 16, 8 + LTEXT "Profession:", -1, 10, 53, 39, 8 + CONTROL "", -1, "static", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE, 9, 68, 47, 45 +} + + +101 DIALOG 6, 15, 278, 144 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "List of Employees" +FONT 8, "System" +{ + DEFPUSHBUTTON "OK", IDOK, 226, 127, 50, 14 + CONTROL "List", 101, "LISTBOX", LBS_NOTIFY | WS_BORDER | WS_BORDER | WS_VSCROLL, 3, 16, 272, 103 + LTEXT "Name", -1, 5, 7, 26, 8 + LTEXT "Profession", -1, 101, 7, 60, 8 + LTEXT "City", -1, 201, 7, 60, 8 +} + diff --git a/modules/windows/oodialog/tutorial/employe5.rex b/modules/windows/oodialog/tutorial/employe5.rex new file mode 100755 index 0000000..78e6a2d --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe5.rex @@ -0,0 +1,127 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employe5.rex + * Type: Open Object REXX Script + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"employe3.rc", 100) +if dlg~initCode <> 0 then exit +dlg~execute("SHOWTOP") + +exit + +::requires "ooDialog.cls" + +::class MyDialogClass subclass RcDialog + +::attribute employees +::attribute empCount +::attribute empCurrent + +::method init + forward class (super) continue + if self~initCode <> 0 then return self~initCode + + self~employees = .array~new(10) + self~empCount = 1 + self~empCurrent = 1 + self~connectButtonEvent(10, "CLICKED", "Print") /* connect button 10 with a method */ + self~connectButtonEvent(12, "CLICKED", "Add") /* connect button 12 with a method */ + + return self~initCode + +::method initDialog + self~city = "New York" + self~male = 1 + self~female = 0 + self~addComboEntry(22, "Munich") + self~addComboEntry(22, "New York") + self~addComboEntry(22, "San Francisco") + self~addComboEntry(22, "Stuttgart") + self~addListEntry(23, "Business Manager") + self~addListEntry(23, "Software Developer") + self~addListEntry(23, "Broker") + self~addListEntry(23, "Police Man") + self~addListEntry(23, "Lawyer") + +::method print + self~getData + + if self~male = 1 then title = "Mr." + else title = "Ms." + if self~married = 1 then addition = " (married) " + else addition = "" + + call infoDialog title self~name addition || "A"x || "City:" self~city || "A"x || - + "Profession:" self~name + +::method add + self~employees[self~empCount] = .directory~new + self~employees[self~empCount]['NAME'] = self~getControlData(21) + self~employees[self~empCount]['CITY'] = self~getControlData(22) + self~employees[self~empCount]['PROFESSION'] = self~getControlData(23) + + if self~getControlData(31) = 1 then sex = 1 + else sex = 2 + self~employees[self~empCount]['SEX'] = sex + + self~employees[self~empCount]['MARRIED'] = self~getControlData(41) + self~empCount += 1 + self~empCurrent = self~empCount + self~setControlData(21, ""); + + +::method set + self~setControlData(21, self~employees[self~empCurrent]['NAME']) + self~setControlData(22, self~employees[self~empCurrent]['CITY']) + self~setControlData(23, self~employees[self~empCurrent]['PROFESSION']) + + if self~employees[self~empCurrent]['SEX'] = 1 then do + self~setControlData(31, 1) + self~setControlData(32, 0) + end + else do + self~setControlData(31, 0) + self~setControlData(32, 1) + end + self~setControlData(41, self~employees[self~empCurrent]['MARRIED']) + + diff --git a/modules/windows/oodialog/tutorial/employe6.rc b/modules/windows/oodialog/tutorial/employe6.rc new file mode 100644 index 0000000..9d09dd1 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe6.rc @@ -0,0 +1,83 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**************************************************************************** + +employe6.rc + +produced by VisualAge Resource Workshop + +*****************************************************************************/ + +#include + +100 DIALOG 6, 15, 241, 141 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Employees" +FONT 8, "System" +{ + CONTROL "Name", 21, "EDIT", WS_BORDER | WS_TABSTOP, 42, 11, 167, 12 + CONTROL "", 11, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY, 219, 8, 10, 17 + CONTROL "City", 22, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 30, 167, 56 + CONTROL "Profession", 23, "LISTBOX", LBS_STANDARD, 73, 52, 156, 65 + AUTORADIOBUTTON "&Male", 31, 12, 71, 26, 12 + AUTORADIOBUTTON "&Female", 32, 12, 84, 34, 12 + AUTOCHECKBOX "M&arried", 41, 12, 99, 37, 12 + PUSHBUTTON "&Add", 12, 212, 28, 23, 21 + PUSHBUTTON "&Print", 10, 8, 123, 50, 14 + DEFPUSHBUTTON "OK", IDOK, 63, 123, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 118, 123, 50, 14 + PUSHBUTTON "&List Employees", 13, 174, 123, 56, 14 + LTEXT "Person:", -1, 10, 12, 27, 8 + LTEXT "City:", -1, 10, 32, 16, 8 + LTEXT "Profession:", -1, 10, 53, 39, 8 + CONTROL "", -1, "static", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE, 9, 68, 47, 45 +} + + +101 DIALOG 6, 15, 278, 144 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "List of Employees" +FONT 8, "System" +{ + DEFPUSHBUTTON "OK", IDOK, 226, 127, 50, 14 + CONTROL "List", 101, "LISTBOX", LBS_NOTIFY | WS_BORDER | LBS_USETABSTOPS | LBS_MULTICOLUMN | WS_BORDER | WS_VSCROLL, 3, 16, 272, 103 + LTEXT "Name", -1, 5, 7, 26, 8 + LTEXT "Profession", -1, 101, 7, 60, 8 + LTEXT "City", -1, 201, 7, 60, 8 +} + diff --git a/modules/windows/oodialog/tutorial/employe6.rex b/modules/windows/oodialog/tutorial/employe6.rex new file mode 100755 index 0000000..86885b9 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe6.rex @@ -0,0 +1,164 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employe6.rex + * Type: Open Object REXX Script + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"employe3.rc", 100) +if dlg~initCode <> 0 then exit +dlg~execute("SHOWTOP") + +exit + +::requires "ooDialog.cls" + +::class MyDialogClass subclass RcDialog + +::attribute employees +::attribute empCount +::attribute empCurrent + +::method init + forward class (super) continue + if self~initCode <> 0 then return self~initCode + + self~employees = .array~new(10) + self~empCount = 1 + self~empCurrent = 1 + self~connectButtonEvent(10, "CLICKED", "Print") /* connect button 10 with a method */ + self~connectButtonEvent(12, "CLICKED", "Add") /* connect button 12 with a method */ + self~connectUpDownEvent(11, "DELTAPOS", onEmpChange) + + return self~initCode + + +::method initDialog + self~city = "New York" + self~male = 1 + self~female = 0 + self~addComboEntry(22, "Munich") + self~addComboEntry(22, "New York") + self~addComboEntry(22, "San Francisco") + self~addComboEntry(22, "Stuttgart") + self~addListEntry(23, "Business Manager") + self~addListEntry(23, "Software Developer") + self~addListEntry(23, "Broker") + self~addListEntry(23, "Police Man") + self~addListEntry(23, "Lawyer") + + +::method onEmpChange + use arg curPos, increment + + if increment > 0 then self~empNext + else self~empPrev + + return .UpDown~deltaPosReply + + +::method print + self~getData + + if self~male = 1 then title = "Mr." + else title = "Ms." + if self~married = 1 then addition = " (married) " + else addition = "" + + call infoDialog title self~name addition || "A"x || "City:" self~city || "A"x || - + "Profession:" self~name + +::method add + self~employees[self~empCount] = .directory~new + self~employees[self~empCount]['NAME'] = self~getControlData(21) + self~employees[self~empCount]['CITY'] = self~getControlData(22) + self~employees[self~empCount]['PROFESSION'] = self~getControlData(23) + + if self~getControlData(31) = 1 then sex = 1 + else sex = 2 + self~employees[self~empCount]['SEX'] = sex + + self~employees[self~empCount]['MARRIED'] = self~getControlData(41) + self~empCount = self~empCount + 1 + self~empCurrent = self~empCount + self~setControlData(21, ""); + + self~newUpDown(11)~setRange(1, self~empCount) + self~newUpDown(11)~setPosition(self~empCount) + + +::method set + self~setControlData(21, self~employees[self~empCurrent]['NAME']) + self~setControlData(22, self~employees[self~empCurrent]['CITY']) + self~setControlData(23, self~employees[self~empCurrent]['PROFESSION']) + + if self~employees[self~empCurrent]['SEX'] = 1 then do + self~setControlData(31, 1) + self~setControlData(32, 0) + end + else do + self~setControlData(31, 0) + self~setControlData(32, 1) + end + + self~setControlData(41, self~employees[self~empCurrent]['MARRIED']) + +::method empPrev + if self~empCount = 1 then return + if self~empCurrent > 1 then do + self~empCurrent = self~empCurrent - 1 + self~newUpDown(11)~setPosition(self~empCount) + self~set + end + else do + call TimedMessage "You reached the bottom.", "Info", 1000 + end + +::method empNext + if self~empCount = 1 then return + if self~empCurrent < self~empCount-1 then do + self~empCurrent = self~empCurrent + 1 + self~newUpDown(11)~setPosition(self~empCount) + self~set + end + else do + call TimedMessage "You reached the top.", "Info", 1000 + end + diff --git a/modules/windows/oodialog/tutorial/employe7.h b/modules/windows/oodialog/tutorial/employe7.h new file mode 100644 index 0000000..2887749 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe7.h @@ -0,0 +1,63 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_EMPLOYEES7 206 +#define IDD_EMPLOYEE_LIST 207 +#define IDM_MENUBAR 208 +#define IDC_GB1 1000 +#define IDC_CB_CITY 1001 +#define IDC_UPD 1002 +#define IDC_LB_POSITION 1003 +#define IDC_EDIT_NAME 1004 +#define IDC_PB_ADD 1005 +#define IDC_RB_MALE 1006 +#define IDC_RB_FEMALE 1007 +#define IDC_CHK_MARRIED 1008 +#define IDC_PB_PRINT 1009 +#define IDC_GB2 1010 +#define IDC_LB_EMPLOYEES_LIST 1010 +#define IDC_PB_LIST 1011 +#define IDC_RB_ADD 1014 +#define IDC_RB_BROWSE 1015 +#define IDM_ADD 40000 +#define IDM_PRINT 40001 +#define IDM_LIST 40002 +#define IDM_ABOUT 40003 diff --git a/modules/windows/oodialog/tutorial/employe7.rc b/modules/windows/oodialog/tutorial/employe7.rc new file mode 100644 index 0000000..83b1d0b --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe7.rc @@ -0,0 +1,108 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "employe7.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDM_MENUBAR MENU +{ + POPUP "&File" + { + MENUITEM "&Cancel", IDCANCEL + MENUITEM "E&xit", IDOK + } + POPUP "&Employees" + { + MENUITEM "&Add", IDM_ADD + MENUITEM "&Print", IDM_PRINT + MENUITEM SEPARATOR + MENUITEM "&List", IDM_LIST, GRAYED + } + POPUP "&Help" + { + MENUITEM SEPARATOR + MENUITEM "&About", IDM_ABOUT + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_EMPLOYEE_LIST DIALOG 6, 15, 278, 117 +STYLE DS_CENTER | DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU +CAPTION "Acme Software - List of Employees" +FONT 12, "Courier New" +{ + LISTBOX IDC_LB_EMPLOYEES_LIST, 10, 22, 258, 66, WS_VSCROLL | LBS_USETABSTOPS | LBS_NOTIFY + LTEXT "Name", -1, 10, 7, 26, 8, SS_LEFT + LTEXT "Profession", -1, 101, 7, 60, 8, SS_LEFT + LTEXT "City", -1, 201, 7, 60, 8, SS_LEFT + DEFPUSHBUTTON "OK", IDOK, 218, 93, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_EMPLOYEES7 DIALOG 6, 15, 235, 184 +STYLE DS_CENTER | DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU +CAPTION "Acme Software - Employees Version 7" +FONT 10, "Tahoma" +{ + GROUPBOX "Mode", IDC_GB2, 165, 10, 60, 44, WS_GROUP + AUTORADIOBUTTON "&Adding", IDC_RB_ADD, 174, 20, 46, 12, WS_TABSTOP + AUTORADIOBUTTON "&Browsing", IDC_RB_BROWSE, 174, 37, 46, 12 + LTEXT "Person:", -1, 12, 20, 30, 8, SS_LEFT + EDITTEXT IDC_EDIT_NAME, 40, 20, 120, 12 + CONTROL "", IDC_UPD, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY, 150, 20, 10, 12 + LTEXT "City:", -1, 12, 37, 16, 8, SS_LEFT + COMBOBOX IDC_CB_CITY, 40, 37, 120, 56, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWNLIST + LTEXT "Position:", -1, 12, 58, 30, 8, SS_LEFT + LISTBOX IDC_LB_POSITION, 10, 68, 150, 82, WS_TABSTOP | WS_VSCROLL | LBS_SORT | LBS_NOTIFY + GROUPBOX "Statistics", IDC_GB1, 165, 65, 60, 66, WS_GROUP + AUTORADIOBUTTON "&Male", IDC_RB_MALE, 174, 80, 46, 12, WS_TABSTOP + AUTORADIOBUTTON "&Female", IDC_RB_FEMALE, 174, 95, 46, 12 + AUTOCHECKBOX "Ma&rried", IDC_CHK_MARRIED, 174, 112, 46, 12, WS_GROUP + PUSHBUTTON "A&dd", IDC_PB_ADD, 165, 135, 60, 14 + PUSHBUTTON "&Print", IDC_PB_PRINT, 10, 160, 45, 14 + PUSHBUTTON "&List Employees", IDC_PB_LIST, 60, 160, 65, 14 + DEFPUSHBUTTON "D&one", IDOK, 130, 160, 45, 14 + PUSHBUTTON "&Cancel", IDCANCEL, 180, 160, 45, 14 +} diff --git a/modules/windows/oodialog/tutorial/employe7.rex b/modules/windows/oodialog/tutorial/employe7.rex new file mode 100755 index 0000000..e24edc8 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe7.rex @@ -0,0 +1,196 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employe7.rex + * Type: Open Object REXX Script + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"employe8.rc", 100) +if dlg~initCode <> 0 then exit +dlg~execute("SHOWTOP") + +exit + +::requires "ooDialog.cls" + +::class MyDialogClass subclass RcDialog + +::attribute employees +::attribute empCount +::attribute empCurrent + +::method init + expose sd + + forward class (super) continue + if self~initCode <> 0 then return self~initCode + + sd = .application~srcDir + + self~employees = .array~new(10) + self~empCount = 1 + self~empCurrent = 1 + self~connectButtonEvent(10, "CLICKED", "print") + self~connectUpDownEvent(11, "DELTAPOS", onEmpChange) + + -- The 'Add' button in this dialog will use an image list to display a + -- bitmap for the surface of the button, rather than text. The image list + -- is created now and assigned to the button in initDialog() + self~createImageList + self~connectButtonEvent(12, "CLICKED", "add") + + -- Using a background bitmap for the dialog is a rather archic method, left + -- over from the previous millenium. It is seldom seen in modern dialogs. + -- Most likely you will not find the appearance of this dialog very + -- appealing. + self~backgroundBitmap(sd"logo.bmp") + + return self~initCode + + +::method createImageList private + expose imageList sd + + size = .Size~new(45, 41) + imageList = .ImageList~create(size, 'COLOR8 MASK', 1) + + cRef = .Image~colorRef(255, 255, 255) + image = .Image~getImage(sd'add.bmp') + imageList~addMasked(image, cRef) + + +::method initDialog + expose imageList + + self~city = "New York" + self~male = 1 + self~female = 0 + self~addComboEntry(22, "Munich") + self~addComboEntry(22, "New York") + self~addComboEntry(22, "San Francisco") + self~addComboEntry(22, "Stuttgart") + self~addListEntry(23, "Business Manager") + self~addListEntry(23, "Software Developer") + self~addListEntry(23, "Broker") + self~addListEntry(23, "Police Man") + self~addListEntry(23, "Lawyer") + + -- Assign the image list to the 'Add' button. + margin = .Rect~new(2) + self~newPushButton(12)~setImageList(imageList, margin) + + +::method onEmpChange + use arg curPos, increment + + if increment > 0 then self~empNext + else self~empPrev + + return .UpDown~deltaPosReply + + +::method print + self~getData + + if self~male = 1 then title = "Mr." + else title = "Ms." + if self~married = 1 then addition = " (married) " + else addition = "" + + call infoDialog title self~name addition || "A"x || "City:" self~city || "A"x || - + "Profession:" self~name + +::method add + self~employees[self~empCount] = .directory~new + self~employees[self~empCount]['NAME'] = self~getControlData(21) + self~employees[self~empCount]['CITY'] = self~getControlData(22) + self~employees[self~empCount]['PROFESSION'] = self~getControlData(23) + + if self~getControlData(31) = 1 then sex = 1 + else sex = 2 + self~employees[self~empCount]['SEX'] = sex + + self~employees[self~empCount]['MARRIED'] = self~getControlData(41) + self~empCount = self~empCount + 1 + self~empCurrent = self~empCount + self~setControlData(21, ""); + + self~newUpDown(11)~setRange(1, self~empCount) + self~newUpDown(11)~setPosition(self~empCount) + + +::method set + self~setControlData(21, self~employees[self~empCurrent]['NAME']) + self~setControlData(22, self~employees[self~empCurrent]['CITY']) + self~setControlData(23, self~employees[self~empCurrent]['PROFESSION']) + + if self~employees[self~empCurrent]['SEX'] = 1 then do + self~setControlData(31, 1) + self~setControlData(32, 0) + end + else do + self~setControlData(31, 0) + self~setControlData(32, 1) + end + + self~setControlData(41, self~employees[self~empCurrent]['MARRIED']) + +::method empPrev + if self~empCount = 1 then return + if self~empCurrent > 1 then do + self~empCurrent = self~empCurrent - 1 + self~newUpDown(11)~setPosition(self~empCount) + self~set + end + else do + call TimedMessage "You reached the bottom.", "Info", 1000 + end + +::method empNext + if self~empCount = 1 then return + if self~empCurrent < self~empCount-1 then do + self~empCurrent = self~empCurrent + 1 + self~newUpDown(11)~setPosition(self~empCount) + self~set + end + else do + call TimedMessage "You reached the top.", "Info", 1000 + end + diff --git a/modules/windows/oodialog/tutorial/employe8.rc b/modules/windows/oodialog/tutorial/employe8.rc new file mode 100644 index 0000000..2cd95a7 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe8.rc @@ -0,0 +1,72 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**************************************************************************** + +employe8.rc + +produced by VisualAge Resource Workshop + +*****************************************************************************/ + +#include + +#define DIALOG_1 1 + +100 DIALOG 6, 15, 241, 141 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Employees" +FONT 8, "System" +{ + CONTROL "Name", 21, "EDIT", WS_BORDER | WS_TABSTOP, 42, 11, 167, 12 + CONTROL "", 11, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY, 219, 8, 10, 17 + CONTROL "City", 22, "COMBOBOX", CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 30, 167, 56 + CONTROL "Profession", 23, "LISTBOX", LBS_STANDARD, 73, 52, 156, 65 + AUTORADIOBUTTON "&Male", 31, 12, 71, 26, 12 + AUTORADIOBUTTON "&Female", 32, 12, 84, 34, 12 + AUTOCHECKBOX "M&arried", 41, 12, 99, 36, 12 + PUSHBUTTON "&Add", 12, 207, 28, 23, 21, BS_BITMAP + PUSHBUTTON "&Print", 10, 8, 123, 50, 14 + DEFPUSHBUTTON "OK", IDOK, 66, 123, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 124, 123, 50, 14 + LTEXT "Person:", -1, 10, 12, 27, 8 + LTEXT "City:", -1, 10, 32, 16, 8 + LTEXT "Profession:", -1, 10, 53, 39, 8 + CONTROL "", -1, "static", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE, 9, 68, 47, 45 + PUSHBUTTON "Help", IDHELP, 180, 123, 50, 14 +} + diff --git a/modules/windows/oodialog/tutorial/employe8.rex b/modules/windows/oodialog/tutorial/employe8.rex new file mode 100755 index 0000000..e0fc36a --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe8.rex @@ -0,0 +1,231 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employe8.rex + * Type: Open Object REXX Script + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"employe5.rc", 100) +if dlg~initCode <> 0 then exit +dlg~execute("SHOWTOP") + +exit + +::requires "ooDialog.cls" + +::class MyDialogClass subclass RcDialog + +::attribute employees +::attribute empCount +::attribute empCurrent + +::method init + expose font + + forward class (super) continue + if self~initCode <> 0 then return self~initCode + + font = 0 + + self~employees = .array~new(10) + self~empCount = 1 + self~empCurrent = 1 + self~connectButtonEvent(10, "CLICKED", "print") /* connect button 10 with a method */ + self~connectButtonEvent(12, "CLICKED", "add") /* connect button 12 with a method */ + self~connectUpDownEvent(11, "DELTAPOS", onEmpChange) + self~connectButtonEvent(13, "CLICKED", "empList") + + return self~initCode + + +::method initDialog + expose font + + self~city = "New York" + self~male = 1 + self~female = 0 + self~addComboEntry(22, "Munich") + self~addComboEntry(22, "New York") + self~addComboEntry(22, "San Francisco") + self~addComboEntry(22, "Stuttgart") + self~addListEntry(23, "Business Manager") + self~addListEntry(23, "Software Developer") + self~addListEntry(23, "Broker") + self~addListEntry(23, "Police Man") + self~addListEntry(23, "Lawyer") + + additional = .directory~new + additional~weight = 600 + font = self~createFontEx("Script", 16, additional) + self~setControlFont(1, font) + + self~disableItem(11) + self~disableItem(13) + + +::method onEmpChange + use arg curPos, increment + + if increment > 0 then self~empNext + else self~empPrev + + return .UpDown~deltaPosReply + + +::method print + self~getData + + if self~male = 1 then title = "Mr." + else title = "Ms." + if self~married = 1 then addition = " (married) " + else addition = "" + + call infoDialog title self~name addition || "A"x || "City:" self~city || "A"x || - + "Profession:" self~name + +::method add + self~employees[self~empCount] = .directory~new + self~employees[self~empCount]['NAME'] = self~getControlData(21) + self~employees[self~empCount]['CITY'] = self~getControlData(22) + self~employees[self~empCount]['PROFESSION'] = self~getControlData(23) + + if self~getControlData(31) = 1 then sex = 1 + else sex = 2 + self~employees[self~empCount]['SEX'] = sex + + self~employees[self~empCount]['MARRIED'] = self~getControlData(41) + self~empCount = self~empCount + 1 + self~empCurrent = self~empCount + self~setControlData(21, ""); + + self~newUpDown(11)~setRange(1, self~empCount) + self~newUpDown(11)~setPosition(self~empCount) + + self~enableItem(11) + self~enableItem(13) + + +::method set + self~setControlData(21, self~employees[self~empCurrent]['NAME']) + self~setControlData(22, self~employees[self~empCurrent]['CITY']) + self~setControlData(23, self~employees[self~empCurrent]['PROFESSION']) + + if self~employees[self~empCurrent]['SEX'] = 1 then do + self~setControlData(31, 1) + self~setControlData(32, 0) + end + else do + self~setControlData(31, 0) + self~setControlData(32, 1) + end + + self~setControlData(41, self~employees[self~empCurrent]['MARRIED']) + +::method empPrev + if self~empCount = 1 then return + if self~empCurrent > 1 then do + self~empCurrent = self~empCurrent - 1 + self~newUpDown(11)~setPosition(self~empCount) + self~set + end + else do + call TimedMessage "You reached the bottom.", "Info", 1000 + end + +::method empNext + if self~empCount = 1 then return + if self~empCurrent < self~empCount-1 then do + self~empCurrent = self~empCurrent + 1 + self~newUpDown(11)~setPosition(self~empCount) + self~set + end + else do + call TimedMessage "You reached the top.", "Info", 1000 + end + +::method empList + lDlg = .EmployeeListClass~new(.application~srcDir"employe5.rc", 101) + lDlg~parent = self + lDlg~execute("SHOWTOP") + + +::method fillList + use arg subdlg, id + + column1 = 24 + column2 = 29 + + do i = 1 to self~empCount - 1 + if self~employees[i]['SEX'] = 1 then title = "Mr." + else title = "Ms." + addstring = title self~employees[i]['NAME'] + + spacebetween = column1 - self~employees[i]['NAME']~length - 5 + + if spacebetween > 0 then addstring = addstring || " "~copies(spacebetween) + addstring = addstring || " "self~employees[i]['PROFESSION'] + + spacebetween = column2 - self~employees[i]['PROFESSION']~length - 5 + if spacebetween > 0 then addstring = addstring || " "~copies(spacebetween) + addstring = addstring || " "self~employees[i]['CITY'] + + subdlg~addListEntry(id, addstring) + end + +::method Leaving + expose font + if font \= 0 then self~DeleteFont(font) + + +::class 'EmployeeListClass' subclass RcDialog + +::method parent attribute + +::method initDialog + expose font + + font = self~createFontEx("Courier", 14) + self~setControlFont(101, font) + + self~parent~fillList(self, 101) + +::method leaving + expose font + self~deleteFont(font) diff --git a/modules/windows/oodialog/tutorial/employe9.rex b/modules/windows/oodialog/tutorial/employe9.rex new file mode 100755 index 0000000..3e3b405 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe9.rex @@ -0,0 +1,197 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employe9.rex + * Type: Open Object REXX Script + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"employe6.rc", 100) +if dlg~initCode <> 0 then exit +dlg~execute("SHOWTOP") + +exit + +::requires "ooDialog.cls" + +::class MyDialogClass subclass RcDialog + +::attribute employees +::attribute empCount +::attribute empCurrent + +::method init + + forward class (super) continue + if self~initCode <> 0 then return self~initCode + + self~employees = .array~new(10) + self~empCount = 1 + self~empCurrent = 1 + self~connectButtonEvent(10, "CLICKED", "print") /* connect button 10 with a method */ + self~connectButtonEvent(12, "CLICKED", "add") /* connect button 12 with a method */ + self~connectUpDownEvent(11, "DELTAPOS", onEmpChange) + self~connectButtonEvent(13, "CLICKED", "empList") + + return self~initCode + + +::method initDialog + self~city = "New York" + self~male = 1 + self~female = 0 + self~addComboEntry(22, "Munich") + self~addComboEntry(22, "New York") + self~addComboEntry(22, "San Francisco") + self~addComboEntry(22, "Stuttgart") + self~addListEntry(23, "Business Manager") + self~addListEntry(23, "Software Developer") + self~addListEntry(23, "Broker") + self~addListEntry(23, "Police Man") + self~addListEntry(23, "Lawyer") + self~disableItem(11) + self~disableItem(13) + + +::method onEmpChange + use arg curPos, increment + + if increment > 0 then self~empNext + else self~empPrev + + return .UpDown~deltaPosReply + + +::method print + self~getData + + if self~male = 1 then title = "Mr." + else title = "Ms." + if self~married = 1 then addition = " (married) " + else addition = "" + + call infoDialog title self~name addition || "A"x || "City:" self~city || "A"x || - + "Profession:" self~name + +::method add + self~employees[self~empCount] = .directory~new + self~employees[self~empCount]['NAME'] = self~getControlData(21) + self~employees[self~empCount]['CITY'] = self~getControlData(22) + self~employees[self~empCount]['PROFESSION'] = self~getControlData(23) + + if self~getControlData(31) = 1 then sex = 1 + else sex = 2 + self~employees[self~empCount]['SEX'] = sex + + self~employees[self~empCount]['MARRIED'] = self~getControlData(41) + self~empCount = self~empCount + 1 + self~empCurrent = self~empCount + self~setControlData(21, ""); + + self~newUpDown(11)~setRange(1, self~empCount) + self~newUpDown(11)~setPosition(self~empCount) + + self~enableItem(11) + self~enableItem(13) + + +::method set + self~setControlData(21, self~employees[self~empCurrent]['NAME']) + self~setControlData(22, self~employees[self~empCurrent]['CITY']) + self~setControlData(23, self~employees[self~empCurrent]['PROFESSION']) + + if self~employees[self~empCurrent]['SEX'] = 1 then do + self~setControlData(31, 1) + self~setControlData(32, 0) + end + else do + self~setControlData(31, 0) + self~setControlData(32, 1) + end + + self~setControlData(41, self~employees[self~empCurrent]['MARRIED']) + +::method empPrev + if self~empCount = 1 then return + if self~empCurrent > 1 then do + self~empCurrent = self~empCurrent - 1 + self~newUpDown(11)~setPosition(self~empCount) + self~set + end + else do + call TimedMessage "You reached the bottom.", "Info", 1000 + end + +::method empNext + if self~empCount = 1 then return + if self~empCurrent < self~empCount-1 then do + self~empCurrent = self~empCurrent + 1 + self~newUpDown(11)~setPosition(self~empCount) + self~set + end + else do + call TimedMessage "You reached the top.", "Info", 1000 + end + +::method empList + lDlg = .EmployeeListClass~new(.application~srcDir"employe6.rc", 101) + lDlg~parent = self + lDlg~execute("SHOWTOP") + + +::method fillList + use arg subdlg, id + + do i = 1 to self~empCount - 1 + if self~employees[i]['SEX'] = 1 then title = "Mr." + else title = "Ms." + addstring = title self~employees[i]['NAME'] + addstring = addstring || "9"x || self~employees[i]['PROFESSION'] + addstring = addstring || "9"x || self~employees[i]['CITY'] + subdlg~addListEntry(id, addstring) + end + + +::class EmployeeListClass subclass RcDialog + +::method parent attribute + +::method initDialog + self~parent~fillList(self, 101) + self~setListTabulators(101, 98, 198) diff --git a/modules/windows/oodialog/tutorial/employe9menuDyn.rex b/modules/windows/oodialog/tutorial/employe9menuDyn.rex new file mode 100755 index 0000000..5a19311 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employe9menuDyn.rex @@ -0,0 +1,239 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employe9menuDyn.rex + * Type: Open Object REXX Script + * + * Description: Adds a menu, created dynamically, to the Employees application. + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"employe6.rc", 100) +if dlg~initCode <> 0 then exit +dlg~execute("SHOWTOP") + +exit + +::requires "ooDialog.cls" + +::class MyDialogClass subclass RcDialog + +::attribute employees +::attribute empCount +::attribute empCurrent + +::method init + + forward class (super) continue + if self~initCode <> 0 then return self~initCode + + self~employees = .array~new(10) + self~empCount = 1 + self~empCurrent = 1 + self~connectButtonEvent(10, "CLICKED", "print") /* connect button 10 with a method */ + self~connectButtonEvent(12, "CLICKED", "add") /* connect button 12 with a method */ + self~connectUpDownEvent(11, "DELTAPOS", onEmpChange) + self~connectButtonEvent(13, "CLICKED", "empList") + self~defineMenu + + return self~initCode + + +::method defineMenu private + expose menuBar + + empPopup = .PopupMenu~new(200) + empPopup~insertItem(202, 202, "&Print") + empPopup~insertItem(202, 204, "&List", "GRAYED") + empPopup~insertSeparator(202, 203) + empPopup~insertItem(202, 201, "&Add") + + ctrlPopup = .PopupMenu~new(210) + ctrlPopup~insertItem(211, 211, "E&xit") + ctrlPopup~insertItem(211, 214, "&About") + ctrlPopup~insertSeparator(211, 213) + ctrlPopup~insertItem(211, 212, "&Cancel") + + menuBar = .BinaryMenuBar~new(.nil, 300) + menuBar~insertPopup(200, 200, empPopup, "&Employees") + menuBar~insertPopup(200, 210, ctrlPopup, "&Control") + + menuBar~connectCommandEvent(201, add, self) + menuBar~connectCommandEvent(202, print, self) + menuBar~connectCommandEvent(204, empList, self) + menuBar~connectCommandEvent(211, ok, self) + menuBar~connectCommandEvent(212, cancel, self) + menuBar~connectCommandEvent(214, about, self) + + +::method initDialog + expose menuBar + + self~city = "New York" + self~male = 1 + self~female = 0 + self~addComboEntry(22, "Munich") + self~addComboEntry(22, "New York") + self~addComboEntry(22, "San Francisco") + self~addComboEntry(22, "Stuttgart") + self~addListEntry(23, "Business Manager") + self~addListEntry(23, "Software Developer") + self~addListEntry(23, "Broker") + self~addListEntry(23, "Police Man") + self~addListEntry(23, "Lawyer") + self~disableItem(11) + self~disableItem(13) + + menuBar~attachTo(self, 1) + + +::method onEmpChange + use arg curPos, increment + + if increment > 0 then self~empNext + else self~empPrev + + return .UpDown~deltaPosReply + + +::method print + self~getData + + if self~male = 1 then title = "Mr." + else title = "Ms." + if self~married = 1 then addition = " (married) " + else addition = "" + + call infoDialog title self~name addition || "A"x || "City:" self~city || "A"x || - + "Profession:" self~name + +::method add + expose menuBar + + self~employees[self~empCount] = .directory~new + self~employees[self~empCount]['NAME'] = self~getControlData(21) + self~employees[self~empCount]['CITY'] = self~getControlData(22) + self~employees[self~empCount]['PROFESSION'] = self~getControlData(23) + + if self~getControlData(31) = 1 then sex = 1 + else sex = 2 + self~employees[self~empCount]['SEX'] = sex + + self~employees[self~empCount]['MARRIED'] = self~getControlData(41) + self~empCount = self~empCount + 1 + self~empCurrent = self~empCount + self~setControlData(21, ""); + + self~newUpDown(11)~setRange(1, self~empCount) + self~newUpDown(11)~setPosition(self~empCount) + + self~enableItem(11) + self~enableItem(13) + + menuBar~enable(204) + + +::method set + self~setControlData(21, self~employees[self~empCurrent]['NAME']) + self~setControlData(22, self~employees[self~empCurrent]['CITY']) + self~setControlData(23, self~employees[self~empCurrent]['PROFESSION']) + + if self~employees[self~empCurrent]['SEX'] = 1 then do + self~setControlData(31, 1) + self~setControlData(32, 0) + end + else do + self~setControlData(31, 0) + self~setControlData(32, 1) + end + + self~setControlData(41, self~employees[self~empCurrent]['MARRIED']) + +::method empPrev + if self~empCount = 1 then return + if self~empCurrent > 1 then do + self~empCurrent = self~empCurrent - 1 + self~newUpDown(11)~setPosition(self~empCount) + self~set + end + else do + call TimedMessage "You reached the bottom.", "Info", 1000 + end + +::method empNext + if self~empCount = 1 then return + if self~empCurrent < self~empCount-1 then do + self~empCurrent = self~empCurrent + 1 + self~newUpDown(11)~setPosition(self~empCount) + self~set + end + else do + call TimedMessage "You reached the top.", "Info", 1000 + end + +::method empList + lDlg = .EmployeeListClass~new(.application~srcDir"employe6.rc", 101) + lDlg~parent = self + lDlg~execute("SHOWTOP") + + +::method fillList + use arg subdlg, id + + do i = 1 to self~empCount - 1 + if self~employees[i]['SEX'] = 1 then title = "Mr." + else title = "Ms." + addstring = title self~employees[i]['NAME'] + addstring = addstring || "9"x || self~employees[i]['PROFESSION'] + addstring = addstring || "9"x || self~employees[i]['CITY'] + subdlg~addListEntry(id, addstring) + end + + +::method About + call infoDialog "This sample demonstrates ooDialog menus." + + +::class EmployeeListClass subclass RcDialog + +::method parent attribute + +::method initDialog + self~parent~fillList(self, 101) + self~setListTabulators(101, 98, 198) diff --git a/modules/windows/oodialog/tutorial/employee10menuRc.rex b/modules/windows/oodialog/tutorial/employee10menuRc.rex new file mode 100755 index 0000000..fedc007 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employee10menuRc.rex @@ -0,0 +1,300 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employe9menuRc.rex + * Type: Open Object REXX Script + * + * Description: Adds a menu, obtained from the .rc script, to the Employees + * application. Continues the refinement / enhancement of the + * application. + */ + + sd = locate() + .application~setDefaults('O', sd'employe7.h', .false) + + dlg = .MyDialogClass~new(sd"employe7.rc", IDD_EMPLOYEES7) + if dlg~initCode <> 0 then return 99 + dlg~execute("SHOWTOP") + +return 0 + + +::requires "ooDialog.cls" + +::class 'MyDialogClass' subclass RcDialog + +::attribute employees +::attribute empCount + +::method init + expose menuBar sd + + forward class (super) continue + if self~initCode <> 0 then return self~initCode + + self~employees = .array~new(10) + self~empCount = 0 + + self~connectButtonEvent(IDC_PB_PRINT, "CLICKED", "onPrint") + self~connectButtonEvent(IDC_PB_ADD, "CLICKED", "onAdd") + self~connectButtonEvent(IDC_PB_LIST, "CLICKED", "onList") + self~connectButtonEvent(IDC_RB_ADD, "CLICKED", "onAdding") + self~connectButtonEvent(IDC_RB_BROWSE, "CLICKED", "onBrowsing") + + self~connectEditEvent(IDC_EDIT_NAME, "CHANGE", onNameChange) + self~connectUpDownEvent(IDC_UPD, "DELTAPOS", onEmpChange) + + sd = .application~srcDir + menuBar = .ScriptMenuBar~new(sd"employe7.rc", IDM_MENUBAR, 0) + menuBar~connectCommandEvent(IDM_ADD, "onAdd", self) + menuBar~connectCommandEvent(IDM_PRINT, "onPrint", self) + menuBar~connectCommandEvent(IDM_LIST, "onList", self) + menuBar~connectCommandEvent(IDM_ABOUT, "about", self) + + return self~initCode + +::method initDialog + expose cbCity lbPosition menuBar + + cbCity = self~newComboBox(IDC_CB_CITY) + cbCity~add("Munich") + cbCity~add("New York") + cbCity~add("San Francisco") + cbCity~add("Stuttgart") + cbCity~add("San Diego") + cbCity~add("Tucson") + cbCity~add("Houston") + cbCity~add("Los Angeles") + + lbPosition = self~newListBox(IDC_LB_POSITION) + lbPosition~add("Business Manager") + lbPosition~add("Engineering Manager") + lbPosition~add("Software Developer") + lbPosition~add("Software QA") + lbPosition~add("Accountant") + lbPosition~add("Security") + lbPosition~add("Secretary") + lbPosition~add("Recptionist") + lbPosition~add("Lab Manager") + lbPosition~add("Lawyer") + lbPosition~add("CEO") + + menuBar~attachTo(self, 1) + + self~setControls + self~defaultForm + + +::method onPrint + expose cbCity lbPosition rbMale chkMarried editName + + title = "Acme Software - Employee:" + + if rbMale~checked then msg = "Mr." + else msg = "Ms." + msg ||= editName~getText + + if chkMarried~checked then msg ||= " (married) " + msg ||= "A"x || "City:" cbCity~selected || "A"x || "Profession:" lbPosition~selected + + j = MessageDialog(msg, self~hwnd, title, , INFORMATION) + +::method onAdd + expose cbCity lbPosition rbMale chkMarried editName pbList upDown rbBrowse + + self~empCount += 1 + self~employees[self~empCount] = .directory~new + self~employees[self~empCount]['NAME'] = editName~getText + self~employees[self~empCount]['CITY'] = cbCity~selected + self~employees[self~empCount]['POSITION'] = lbPosition~selected + + if rbMale~checked then sex = 1 + else sex = 2 + + self~employees[self~empCount]['SEX'] = sex + self~employees[self~empCount]['MARRIED'] = chkMarried~checked + + upDown~setRange(1, self~empCount) + if self~empCount == 1 then do + rbBrowse~enable + upDown~setPosition(1) + end + + self~defaultForm + +::method onNameChange + expose menuBar editName rbAdd pbAdd pbPrint + + if rbAdd~checked then do + if editName~getText~strip~length == 0 then do + pbAdd~disable + pbPrint~disable + menuBar~disable(IDM_ADD) + menuBar~disable(IDM_PRINT) + end + else do + pbAdd~enable + pbPrint~enable + menuBar~enable(IDM_ADD) + menuBar~enable(IDM_PRINT) + end + end + +::method onEmpChange + use arg curPos, increment + + self~setEmpRecord(curPos + increment) + return .UpDown~deltaPosReply + +::method onAdding + self~defaultForm + +::method onBrowsing + expose upDown pbAdd menuBar + + pbAdd~disable + menuBar~disable(IDM_ADD) + upDown~enable + self~setEmpRecord(upDown~getPosition) + +::method setEmpRecord + expose upDown editName cbCity lbPosition rbMale rbFemale chkMarried + use strict arg emp + + if emp < 1 then return self~noRecord('bottom') + else if emp > upDown~getRange~max then return self~noRecord('top') + + editName~setText(self~employees[emp]['NAME']) + + cbCity~select(self~employees[emp]['CITY']) + lbPosition~select(self~employees[emp]['POSITION']) + + if self~employees[emp]['SEX'] = 1 then do + rbMale~check + rbFemale~uncheck + end + else do + rbFemale~check + rbMale~uncheck + end + + if self~employees[emp]['MARRIED'] then chkMarried~check + else chkMarried~uncheck + + +::method onList + expose sd + lDlg = .EmployeeListClass~new(sd"employe7.rc", IDD_EMPLOYEE_LIST) + lDlg~parent = self + lDlg~execute("SHOWTOP") + + +::method fillList + use strict arg list + do id = 1 to self~empCount + if self~employees[id]['SEX'] = 1 then title = "Mr."; else title = "Ms." + addstring = title self~employees[id]['NAME'] + addstring = addstring || "9"x || self~employees[id]['POSITION'] + addstring = addstring || "9"x || self~employees[id]['CITY'] + list~insert(id, addstring) + end + +::method about + call infoDialog "Sample to demonstrate ooDialog menus." + +::method setControls private + expose rbMale rbFemale rbAdd rbBrowse chkMarried editName pbList pbAdd pbPrint upDown + + pbAdd = self~newPushButton(IDC_PB_ADD) + pbList = self~newPushButton(IDC_PB_LIST) + pbPrint = self~newPushButton(IDC_PB_PRINT) + rbMale = self~newRadioButton(IDC_RB_MALE) + rbFemale = self~newRadioButton(IDC_RB_FEMALE) + rbAdd = self~newRadioButton(IDC_RB_ADD) + rbBrowse = self~newRadioButton(IDC_RB_BROWSE) + chkMarried = self~newCheckBox(IDC_CHK_MARRIED) + editName = self~newEdit(IDC_EDIT_NAME) + upDown = self~newUpDown(IDC_UPD) + +::method defaultForm private + expose menuBar cbCity lbPosition rbMale rbFemale rbAdd rbBrowse chkMarried - + editName pbAdd pbList pbPrint upDown + + editName~setText("") + cbCity~select("New York") + lbPosition~select("Software Developer") + + rbMale~check + rbFemale~uncheck + chkMarried~uncheck + + rbAdd~check + pbAdd~disable + pbPrint~disable + menuBar~disable(IDM_ADD) + menuBar~disable(IDM_PRINT) + upDown~disable + + editName~assignFocus + + if self~empCount < 1 then do + pbList~disable + rbBrowse~disable + upDown~setRange(0, 0) + upDown~setPosition(0) + end + else do + pbList~enable + menuBar~enable(IDM_LIST) + end + +::method noRecord private + use strict arg direction + return MessageDialog('At the' direction 'of the records', self~hwnd, - + 'Employee Records') + + +::class 'EmployeeListClass' subclass RcDialog + +::attribute parent + +::method initDialog + lb = self~newListBox(IDC_LB_EMPLOYEES_LIST) + self~parent~fillList(lb) + lb~setTabulators(90, 190) diff --git a/modules/windows/oodialog/tutorial/employee11tab.h b/modules/windows/oodialog/tutorial/employee11tab.h new file mode 100644 index 0000000..1ba1e2b --- /dev/null +++ b/modules/windows/oodialog/tutorial/employee11tab.h @@ -0,0 +1,82 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_EMPLOYEES_LIST 207 +#define IDD_EMPLOYEES_BROWSE 208 +#define IDD_EMPLOYEES_ADD 209 +#define IDD_EMPLOYEES_EDIT 210 +#define IDM_CONTEXT_MENUBAR 212 +#define IDC_GB1 1000 +#define IDC_LV_EMPLOYEES 1001 +#define IDC_PB_PRINT_A 1001 +#define IDC_PB_PRINT_E 1002 +#define IDC_UPD 1002 +#define IDC_PB_ADD_A 1003 +#define IDC_PB_PRINT_B 1003 +#define IDC_PB_RESET_E 1003 +#define IDC_PB_SAVE_E 1004 +#define IDC_EDIT_NAME_B 1005 +#define IDC_CB_CITY_B 1009 +#define IDC_LB_POSITION_B 1011 +#define IDC_RB_MALE_B 1012 +#define IDC_RB_FEMALE_B 1013 +#define IDC_CHK_MARRIED_B 1014 +#define IDC_CHK_FULLTIME_B 1015 +#define IDC_EDIT_NAME_A 1016 +#define IDC_CB_CITY_A 1017 +#define IDC_LB_POSITION_A 1018 +#define IDC_RB_MALE_A 1019 +#define IDC_RB_FEMALE_A 1020 +#define IDC_CHK_MARRIED_A 1021 +#define IDC_CHK_FULLTIME_A 1022 +#define IDC_EDIT_NAME_E 1023 +#define IDC_CB_CITY_E 1024 +#define IDC_LB_POSITION_E 1025 +#define IDC_RB_MALE_E 1026 +#define IDC_RB_FEMALE_E 1027 +#define IDC_CHK_MARRIED_E 1028 +#define IDC_CHK_FULLTIME_E 1029 +#define IDM_POP_CONTEXT 40000 +#define IDM_EDIT 40001 +#define IDM_ADD 40002 +#define IDM_BROWSE 40003 +#define IDM_DELETE 40004 +#define IDM_SEP1 40005 +#define IDM_SEP2 40006 diff --git a/modules/windows/oodialog/tutorial/employee11tab.rc b/modules/windows/oodialog/tutorial/employee11tab.rc new file mode 100644 index 0000000..2668321 --- /dev/null +++ b/modules/windows/oodialog/tutorial/employee11tab.rc @@ -0,0 +1,136 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#include +#include +#include +#include "employee11tab.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDM_CONTEXT_MENUBAR MENUEX +{ + POPUP "Context", IDM_POP_CONTEXT, 0, 0 + { + MENUITEM "&Browse Employees...", IDM_BROWSE, 0, 0 + MENUITEM "", IDM_SEP1, MFT_SEPARATOR, 0 + MENUITEM "&Add Employee...", IDM_ADD, 0, 0 + MENUITEM "&Edit Employee...", IDM_EDIT, 0, 0 + MENUITEM "", IDM_SEP2, MFT_SEPARATOR, 0 + MENUITEM "&Delete Employee...", IDM_DELETE, 0, 0 + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_EMPLOYEES_ADD DIALOG 0, 0, 227, 160 +STYLE DS_3DLOOK | DS_CONTROL | DS_SHELLFONT | WS_CHILDWINDOW | WS_TABSTOP +CAPTION "Add Employees" +FONT 10, "Tahoma" +{ + LTEXT "Person:", -1, 12, 20, 30, 8, SS_LEFT + EDITTEXT IDC_EDIT_NAME_A, 40, 20, 102, 12 + LTEXT "City:", -1, 12, 37, 16, 8, SS_LEFT + COMBOBOX IDC_CB_CITY_A, 40, 37, 102, 56, WS_TABSTOP | CBS_DROPDOWNLIST + LTEXT "Position:", -1, 12, 58, 30, 8, SS_LEFT + LISTBOX IDC_LB_POSITION_A, 10, 68, 132, 82, WS_TABSTOP | WS_VSCROLL | LBS_SORT | LBS_NOTIFY + GROUPBOX "Statistics", IDC_GB1, 153, 16, 64, 80, WS_GROUP + AUTORADIOBUTTON "&Male", IDC_RB_MALE_A, 161, 27, 40, 12, WS_TABSTOP + AUTORADIOBUTTON "&Female", IDC_RB_FEMALE_A, 161, 42, 40, 12 + AUTOCHECKBOX "Ma&rried", IDC_CHK_MARRIED_A, 161, 59, 40, 12, WS_GROUP + AUTOCHECKBOX "Full Time", IDC_CHK_FULLTIME_A, 161, 78, 40, 12, WS_GROUP + PUSHBUTTON "Add", IDC_PB_ADD_A, 167, 117, 50, 14 + PUSHBUTTON "Print", IDC_PB_PRINT_A, 167, 136, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_EMPLOYEES_BROWSE DIALOG 0, 0, 227, 160 +STYLE DS_3DLOOK | DS_CONTROL | DS_SHELLFONT | WS_CHILDWINDOW | WS_TABSTOP +CAPTION "Browse Employees" +FONT 10, "Tahoma" +{ + LTEXT "Person:", -1, 12, 20, 30, 8, SS_LEFT + EDITTEXT IDC_EDIT_NAME_B, 40, 20, 102, 12, ES_READONLY + CONTROL "", IDC_UPD, UPDOWN_CLASS, UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_AUTOBUDDY, 132, 20, 10, 12 + LTEXT "City:", -1, 12, 37, 16, 8, SS_LEFT + COMBOBOX IDC_CB_CITY_B, 40, 37, 102, 56, WS_TABSTOP | WS_DISABLED | CBS_DROPDOWNLIST + LTEXT "Position:", -1, 12, 58, 30, 8, SS_LEFT + LISTBOX IDC_LB_POSITION_B, 10, 68, 132, 82, WS_TABSTOP | WS_VSCROLL | WS_DISABLED | LBS_SORT | LBS_NOTIFY + GROUPBOX "Statistics", IDC_GB1, 153, 16, 64, 80, WS_GROUP + AUTORADIOBUTTON "&Male", IDC_RB_MALE_B, 161, 27, 40, 12, WS_TABSTOP | WS_DISABLED + AUTORADIOBUTTON "&Female", IDC_RB_FEMALE_B, 161, 42, 40, 12, WS_DISABLED + AUTOCHECKBOX "Ma&rried", IDC_CHK_MARRIED_B, 161, 59, 40, 12, WS_GROUP | WS_DISABLED + AUTOCHECKBOX "Full Time", IDC_CHK_FULLTIME_B, 161, 78, 40, 12, WS_GROUP | WS_DISABLED + PUSHBUTTON "Print", IDC_PB_PRINT_B, 167, 136, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_EMPLOYEES_EDIT DIALOG 0, 0, 227, 160 +STYLE DS_3DLOOK | DS_CONTROL | DS_SHELLFONT | WS_CHILDWINDOW | WS_TABSTOP +CAPTION "Edit Employees" +FONT 10, "Tahoma" +{ + LTEXT "Person:", -1, 12, 20, 30, 8, SS_LEFT + EDITTEXT IDC_EDIT_NAME_E, 40, 20, 102, 12 + LTEXT "City:", -1, 12, 37, 16, 8, SS_LEFT + COMBOBOX IDC_CB_CITY_E, 40, 37, 102, 56, WS_TABSTOP | CBS_DROPDOWNLIST + LTEXT "Position:", -1, 12, 58, 30, 8, SS_LEFT + LISTBOX IDC_LB_POSITION_E, 10, 68, 132, 82, WS_TABSTOP | WS_VSCROLL | LBS_SORT | LBS_NOTIFY + GROUPBOX "Statistics", IDC_GB1, 153, 16, 64, 80, WS_GROUP + AUTORADIOBUTTON "&Male", IDC_RB_MALE_E, 161, 27, 40, 12, WS_TABSTOP + AUTORADIOBUTTON "&Female", IDC_RB_FEMALE_E, 161, 42, 40, 12 + AUTOCHECKBOX "Ma&rried", IDC_CHK_MARRIED_E, 161, 59, 40, 12, WS_GROUP + AUTOCHECKBOX "Full Time", IDC_CHK_FULLTIME_E, 161, 78, 40, 12, WS_GROUP + PUSHBUTTON "Reset", IDC_PB_RESET_E, 167, 98, 50, 14 + PUSHBUTTON "Save", IDC_PB_SAVE_E, 167, 117, 50, 14 + PUSHBUTTON "Print", IDC_PB_PRINT_E, 167, 136, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_EMPLOYEES_LIST DIALOG 0, 0, 227, 160 +STYLE DS_3DLOOK | DS_CONTROL | DS_SHELLFONT | WS_CHILDWINDOW | WS_TABSTOP +CAPTION "List Employees" +FONT 10, "Tahoma" +{ + CONTROL "", IDC_LV_EMPLOYEES, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | LVS_REPORT, 10, 10, 207, 140 +} diff --git a/modules/windows/oodialog/tutorial/employee11tab.rex b/modules/windows/oodialog/tutorial/employee11tab.rex new file mode 100755 index 0000000..891024f --- /dev/null +++ b/modules/windows/oodialog/tutorial/employee11tab.rex @@ -0,0 +1,1058 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: employee11tab.rex + * Type: Open Object REXX Script + * + * Description: Example to demonstrate the property sheet dialog class. + */ + + sd = locate() + + -- Note to self, we do not use data attributes in this app, need explanation. + .application~setDefaults("O", sd"employee11tab.h", .false) + + -- Create the dialog pages. + p1 = .EmployeeAdd~new(sd"employee11tab.rc", IDD_EMPLOYEES_ADD) + p2 = .EmployeeEdit~new(sd"employee11tab.rc", IDD_EMPLOYEES_EDIT) + p3 = .EmployeeBrowse~new(sd"employee11tab.rc", IDD_EMPLOYEES_BROWSE) + p4 = .EmployeeList~new(sd"employee11tab.rc", IDD_EMPLOYEES_LIST) + + pages = .array~of(p1, p2, p3, p4) + dlg = .AcmeEmployeesDlg~new(pages, "NOAPPLYNOW", "Acme Software - Employee Manager Version 10.00.0") + + dlg~execute + + return 0 + +::requires "ooDialog.cls" + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + AcmeEmployeesDlg - The property sheet dialog for this application. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'AcmeEmployeesDlg' subclass PropertySheetDialog + +::constant DATABASE 'employee11tab.db' + +::attribute employees +::attribute empCount +::attribute empIndex + +::method init + expose dbChanged + + forward class (super) continue + + self~readDataBase + + dbChanged = .false + + if self~employees~items == 0 then self~startPage = 1 + else self~startPage = 4 + + do page over self~pages + page~configure(self~employees, self~empCount, self~empIndex) + end + + +::method newEmployeeNotify + expose dbChanged + use strict arg emp + + dbChanged = .true + + self~empCount += 1 + self~employees[self~empCount] = emp + self~empIndex = self~empCount + + self~notifyPages + + listPage = self~pages[4] + + -- If the user has not yet visited the List Employees page, then there is + -- no list view to update. Instead, when the user first visits that page, + -- the list view will be filled with all existing employees. + if listPage~wasActivated then listPage~newEmployeeNotify + + +::method editedEmployeeNotify + expose dbChanged + use strict arg emp + + dbChanged = .true + self~employees[self~empIndex] = emp + + listPage = self~pages[4] + if listPage~wasActivated then listPage~editedEmployeeNotify + + self~setCurSel( , 4) + + +::method selectedEmployeeNotify + use strict arg index + + self~empIndex = index + self~notifyPages + + +::method maybeDeleteEmployee + expose dbChanged + + emp = self~employees[self~empIndex] + + pronoun = 'him' + if \ emp~male then pronoun = 'her' + + title = "Acme Software - Deleting Employee:" emp~name + msg = "Deleting" emp~name "will permanently remove" pronoun "from" || .endOfLine || - + 'the database. No further pay checks can be issued to' emp~name'.' || .endOfLine~copies(2) || - + "Are you sure you want to continue this action?" + + answer = MessageDialog(msg, self~hwnd, title, 'YESNO', 'QUESTION', 'DEFBUTTON2') + if answer == self~IDYES then do + oldIndex = self~empIndex + + self~employees~delete(self~empIndex) + self~empCount -= 1 + self~empIndex = 1 + + listPage = self~pages[4] + if listPage~wasActivated then listPage~deleteEmployeeNotify(oldIndex) + + self~notifyPages + dbChanged = .true + end + +::method leaving + expose dbChanged + + if dbChanged & self~getResult == 'CLOSEDOK' then do + self~writeDataBase + end + + +::method notifyPages private + + do page over self~pages + page~empCount = self~empCount + page~empIndex = self~empIndex + end + + +::method readDataBase private + + db = self~DATABASE + + fsObj = .stream~new(db) + if fsObj~query('EXISTS') == '' then do + self~employees = .array~new(10) + self~empCount = 0 + self~empIndex = 0 + end + else do + lines = fsObj~makeArray + fsObj~close + + emps = .array~new(lines~items) + do l over lines + l = l~strip + if l~length == 0 | l~abbrev("#") | l~abbrev("/*") then iterate + + parse var l name', 'city', 'pos', 'male', 'married', 'fullTime . + + if male == 'M' then male = .true + else male = .false + + if married == 'M' then married = .true + else married = .false + + if fullTime == 'F' then fullTime = .true + else fullTime = .false + + emp = .Employee~new(name, city, pos, male, married, fullTime) + emps~append(emp) + end + + self~employees = emps + self~empCount = emps~items + self~empIndex = 1 + end + + +::method writeDataBase private + + db = self~DATABASE + + fsObj = .stream~new(db) + + fsObj~open('WRITE REPLACE') + + if fsObj~state == 'READY' then do e over self~employees + line = e~toCSV + fsObj~lineout(line) + end + else do + title = "Acme Software - Internal Error Detected" + msg = "The database could not be opened to record current changes." + j = MessageDialog(msg, 0, title, 'OK', 'ERROR') + end + + fsObj~close + + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + EmployeeAdd - A dialog class for a page in the PropertySheetDialog. This page + allows the user to add employee records. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'EmployeeAdd' subclass RcPSPDialog + +::attribute employees +::attribute empCount +::attribute empIndex +::attribute empView +::attribute empInitial + +::method configure + expose isChanged + use arg employees, count, index + + self~employees = employess + self~empCount = count + self~empIndex = index + self~empInitial = .Employee~new() + + self~connectEditEvent(IDC_EDIT_NAME_A, "CHANGE", onChange) + self~connectComboBoxEvent(IDC_CB_CITY_A, "SELCHANGE", onChange) + self~connectListBoxEvent(IDC_LB_POSITION_A, "SELCHANGE", onChange) + self~connectButtonEvent(IDC_RB_MALE_A, "CLICKED", onChange) + self~connectButtonEvent(IDC_RB_FEMALE_A, "CLICKED", onChange) + self~connectButtonEvent(IDC_CHK_MARRIED_A, "CLICKED", onChange) + self~connectButtonEvent(IDC_CHK_FULLTIME_A, "CLICKED", onChange) + isChanged = .false + + self~connectButtonEvent(IDC_PB_PRINT_A, "CLICKED", onPrint) + self~connectButtonEvent(IDC_PB_ADD_A, "CLICKED", onAdd) + +::method initDialog + expose cbCity lbPosition editName + + self~setControls + self~empView~fillBoxes + + editName~connectCharEvent(onChar) + + -- If we are the start page, it means there are no employees. So we put up + -- a message box informing the user she needs to add employees through this + -- page. + if self~propSheet~startPage == 1 then do + title = "Acme Software - Employee Manager" + msg = "The Employee Database is empty." || .endOfLine~copies(2) || - + "Use the 'Add Employees' page to add employees." + + ret = MessageDialog(msg, self~hwnd, title) + end + + +::method setActive unguarded + + self~defaultForm + return 0 + +::method killActive unguarded + expose isChanged + use arg psDlg + + if isChanged then do + title = "Acme Software - Add Employee" + msg = 'The addition of the new employee is not' || .endOfLine || - + 'complete. Leaving this page will result' || .endOfLine || - + 'in all changes being lost.' || .endOfLine~copies(2) || - + 'To leave this page and abandon changes,' || .endOfLine || - + 'press Ok. To stay on the page and con-' || .endOfLine || - + 'tinue adding a new employee, press Cancel' + + ret = MessageDialog(msg, self~hwnd, title, "OKCANCEL", "WARNING", 'DEFBUTTON2') + if ret == self~IDCANCEL then return .false + end + + return .true + + +::method onPrint unguarded + + currentEmployee = self~empView~createEmployee + currentEmployee~print(self) + return 0 + + +::method onAdd unguarded + + newEmployee = self~empView~createEmployee + self~propSheet~newEmployeeNotify(newEmployee) + + self~defaultForm + return 0 + + +::method onChar unguarded + use arg char, isShift, isCtrl, isAlt, misc, editControl + + if char~d2c == ',' then do + result = ' '~c2d + reply result + + msg = 'Employee names can not contain a comma. You can not type a comma here' + title = "Unacceptable Character" + editControl~showBalloon(title, msg, "ERROR") + end + else do + return .true + end + + +::method onChange unguarded + expose isChanged pbPrint pbAdd editName + + if isChanged then do + if self~empView~sameAs(self~empInitial) then isChanged = .false + end + else do + if \ self~empView~sameAs(self~empInitial) then isChanged = .true + end + + -- The Add and Print buttons are only enabled when there is some change and + -- the employee name is not blank. The status of the buttons *could* change + -- on any change, but only *will* change under certain cicrcumstances. + -- Rather than try to track and determine those exact circumstances, we just + -- check if the buttons should be enabled or not and do that on each change. + if isChanged, editName~getText~strip \== '' then do + pbPrint~enable + pbAdd~enable + end + else do + pbPrint~disable + pbAdd~disable + end + + return 0 + + +::method setControls private + expose editName cbCity lbPosition rbMale rbFemale chkMarried chkFullTime pbPrint pbAdd + + editName = self~newEdit(IDC_EDIT_NAME_A) + cbCity = self~newComboBox(IDC_CB_CITY_A) + lbPosition = self~newListBox(IDC_LB_POSITION_A) + rbMale = self~newRadioButton(IDC_RB_MALE_A) + rbFemale = self~newRadioButton(IDC_RB_FEMALE_A) + chkMarried = self~newCheckBox(IDC_CHK_MARRIED_A) + chkFullTime = self~newCheckBox(IDC_CHK_FULLTIME_A) + + self~empView = .EmployeeView~new(editName, cbCity, lbPosition, rbMale, rbFemale, chkMarried, chkFullTime) + + pbPrint = self~newPushButton(IDC_PB_PRINT_A) + pbAdd = self~newPushButton(IDC_PB_ADD_A) + + +::method defaultForm private + expose pbPrint pbAdd + + pbPrint~disable + pbAdd~disable + + self~empView~displayEmployee(self~empInitial) + self~empView~editName~assignFocus + + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + EmployeeEdit - A dialog class for a page in the PropertySheetDialog. This + page allows the user to edit an existing employee's record +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'EmployeeEdit' subclass RcPSPDialog + +::attribute employees +::attribute empCount +::attribute empIndex +::attribute empInitial +::attribute empView + +::method configure + expose isChanged + use arg employees, count, index + + self~employees = employees + self~empCount = count + self~empIndex = index + + self~empInitial = .nil + + self~connectEditEvent(IDC_EDIT_NAME_E, "CHANGE", onChange) + self~connectComboBoxEvent(IDC_CB_CITY_E, "SELCHANGE", onChange) + self~connectListBoxEvent(IDC_LB_POSITION_E, "SELCHANGE", onChange) + self~connectButtonEvent(IDC_RB_MALE_E, "CLICKED", onChange) + self~connectButtonEvent(IDC_RB_FEMALE_E, "CLICKED", onChange) + self~connectButtonEvent(IDC_CHK_MARRIED_E, "CLICKED", onChange) + self~connectButtonEvent(IDC_CHK_FULLTIME_E, "CLICKED", onChange) + isChanged = .false + + self~connectButtonEvent(IDC_PB_PRINT_E, "CLICKED", onPrint) + self~connectButtonEvent(IDC_PB_SAVE_E, "CLICKED", onSave) + self~connectButtonEvent(IDC_PB_RESET_E, "CLICKED", onReset) + + +::method initDialog + expose cbCity lbPosition + + self~setControls + self~empView~fillBoxes + + +::method setActive unguarded + + self~setEmpRecord + return 0 + + +::method onPrint unguarded + + if self~empInitial \== .nil then do + currentEmployee = self~empView~createEmployee + currentEmployee~print(self) + end + return 0 + +::method onSave unguarded + + editedEmployee = self~empView~createEmployee + self~propSheet~editedEmployeeNotify(editedEmployee) + + return 0 + + +::method onReset unguarded + self~setEmpRecord + + +::method onChange unguarded + expose isChanged pbPrint pbSave pbReset editName + + if self~empInitial == .nil then return 0 + + if isChanged then do + if self~empView~sameAs(self~empInitial) then isChanged = .false + end + else do + if \ self~empView~sameAs(self~empInitial) then isChanged = .true + end + + txt = editName~getText~strip + + if txt == '' then do + pbPrint~disable + pbSave~disable + pbReset~enable + end + else if isChanged then do + pbPrint~enable + pbSave~enable + pbReset~enable + end + else do + pbPrint~enable + pbSave~disable + pbReset~disable + end + + return 0 + + +::method setControls private + expose cbCity lbPosition rbMale rbFemale chkMarried chkFullTime editName pbPrint pbSave pbReset + + cbCity = self~newComboBox(IDC_CB_CITY_E) + lbPosition = self~newListBox(IDC_LB_POSITION_E) + rbMale = self~newRadioButton(IDC_RB_MALE_E) + rbFemale = self~newRadioButton(IDC_RB_FEMALE_E) + chkMarried = self~newCheckBox(IDC_CHK_MARRIED_E) + chkFullTime = self~newCheckBox(IDC_CHK_FULLTIME_E) + editName = self~newEdit(IDC_EDIT_NAME_E) + + self~empView = .EmployeeView~new(editName, cbCity, lbPosition, rbMale, rbFemale, chkMarried, chkFullTime) + + pbReset = self~newPushButton(IDC_PB_RESET_E) + pbSave = self~newPushButton(IDC_PB_SAVE_E) + pbPrint = self~newPushButton(IDC_PB_PRINT_E) + + +::method setEmpRecord + expose pbSave pbPrint pbReset isChanged + + if self~empCount < 1 then do + self~empView~disable + pbSave~disable + pbPrint~disable + pbReset~disable + return 0 + end + + isChanged = .false + pbSave~disable + pbPrint~enable + + self~empInitial = self~employees[self~empIndex] + self~empView~displayEmployee(self~empInitial) + self~empView~editName~assignFocus + + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + EmployeeBrowse - A dialog class for a page in the PropertySheetDialog. This + page allows the user to scroll through employee records one + at a time. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'EmployeeBrowse' subclass RcPSPDialog + +::attribute employees +::attribute empCount +::attribute empIndex +::attribute empView + +::method configure + use arg employees, count, empIndex + + self~employees = employees + self~empCount = count + self~empIndex = empIndex + + self~connectButtonEvent(IDC_PB_PRINT_B, "CLICKED", onPrint) + self~connectUpDownEvent(IDC_UPD, "DELTAPOS", onEmpChange) + + +::method initDialog + expose upDown + + self~setControls + self~empView~fillBoxes + + +::method setActive unguarded + + self~updateUpdown + return 0 + + +::method onPrint unguarded + + if self~empCount > 0 then do + currentEmployee = self~empView~createEmployee + currentEmployee~print(self) + end + return 0 + + +::method onEmpChange unguarded + use arg curPos, increment + + self~setEmpRecord(curPos + increment) + return .UpDown~deltaPosReply + + +::method setEmpRecord private + expose upDown + use strict arg empIndex + + if empIndex < 1 then return self~noRecord('bottom') + else if empIndex > upDown~getRange~max then return self~noRecord('top') + + emp = self~employees[empIndex] + self~empView~displayEmployee(emp) + + self~propSheet~selectedEmployeeNotify(empIndex) + + +::method setControls private + expose cbCity lbPosition rbMale rbFemale chkMarried chkFullTime editName upDown pbPrint + + cbCity = self~newComboBox(IDC_CB_CITY_B) + lbPosition = self~newListBox(IDC_LB_POSITION_B) + rbMale = self~newRadioButton(IDC_RB_MALE_B) + rbFemale = self~newRadioButton(IDC_RB_FEMALE_B) + chkMarried = self~newCheckBox(IDC_CHK_MARRIED_B) + chkFullTime = self~newCheckBox(IDC_CHK_FULLTIME_B) + editName = self~newEdit(IDC_EDIT_NAME_B) + + self~empView = .EmployeeView~new(editName, cbCity, lbPosition, rbMale, rbFemale, chkMarried, chkFullTime) + + upDown = self~newUpDown(IDC_UPD) + pbPrint = self~newPushButton(IDC_PB_PRINT_B) + + +::method noRecord private + use strict arg direction + return MessageDialog('At the' direction 'of the records', self~hwnd, - + 'Employee Records') + + +::method updateUpdown private + expose pbPrint upDown + + if self~empCount < 1 then do + upDown~setRange(0, 0) + upDown~setPosition(0) + upDown~disable + pbPrint~disable + self~empView~blank + end + else do + upDown~enable + upDown~setRange(1, self~empCount) + upDown~setPosition(self~empIndex) + pbPrint~enable + self~empView~displayEmployee(self~employees[self~empIndex]) + end + + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + EmployeeList - A dialog class for a page in the PropertySheetDialog. This + page allows the user to look at multiple employee records in + one view. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'EmployeeList' subclass RcPSPDialog + +::attribute employees +::attribute empCount +::attribute empIndex + +::method configure + expose contextMenu + use arg employees, count, index + + self~employees = employees + self~empCount = count + self~empIndex = index + + self~connectListViewEvent(IDC_LV_EMPLOYEES, "SELECTCHANGED", onSelectionChanged) + + mb = .ScriptMenuBar~new(.application~srcDir'employee11tab.rc', IDM_CONTEXT_MENUBAR) + contextMenu = mb~getPopup(IDM_POP_CONTEXT) + +::method newEmployeeNotify + expose lv + + emp = self~employees[self~empIndex] + self~addEmployeeRow(lv, emp) + + self~ensureSelection + + +::method editedEmployeeNotify + expose lv + + emp = self~employees[self~empIndex] + index = self~empIndex - 1 + + gender = 'Male' + if \ emp~male then gender = 'Female' + + mStatus = 'Married' + if \ emp~married then mStatus = 'Unmarried' + + eStatus = 'Full Time' + if \ emp~fullTime then eStatus = 'Part Time' + + lv~setItemText(index, 0, emp~name) + lv~setItemText(index, 1, emp~city) + lv~setItemText(index, 2, emp~position) + lv~setItemText(index, 3, gender) + lv~setItemText(index, 4, mStatus) + lv~setItemText(index, 5, eStatus) + + self~ensureSelection + + +::method initDialog + expose lv contextMenu + + lv = self~newListView(IDC_LV_EMPLOYEES) + + lv~addExtendedStyle('CHECKBOXES GRIDLINES FULLROWSELECT') + + lv~insertColumn(0, "Name", 50) + lv~insertColumn(1, "City", 40) + lv~insertColumn(2, "Position", 40) + lv~insertColumn(3, "Gender", 30) + lv~insertColumn(4, "Marital Status", 30) + lv~insertColumn(5, "Employment Classification", 40) + + do i = 1 to self~empCount + self~addEmployeeRow(lv, self~employees[i]) + end + + self~ensureSelection + + contextMenu~assignTo(self, .true) + contextMenu~connectContextMenu(onContext, lv~hwnd) + + +::method onSelectionChanged unguarded + use arg id, itemIndex, state + + if state == 'SELECTED' then do + self~propSheet~selectedEmployeeNotify(itemIndex + 1) + end + + +::method setActive unguarded + expose lv + + self~ensureSelection + return 0 + + +::method onContext + expose contextMenu lv + use arg hwnd, x, y + + if x == -1, y == -1 then do + -- The keyboard was used, not the mouse. Position the context menu + -- towards the bottom right corner of the list view. + rect = lv~windowRect + x = rect~right - .SM~cxVScroll - 15 + y = rect~bottom - 15 + + pos = .Point~new(x, y) + end + else do + pos = .Point~new(x, y) + + p = pos~copy + lv~screen2client(p) + index = lv~hitTestInfo(p) + + if index == -1 then do + contextMenu~disable(.array~of(IDM_EDIT, IDM_DELETE)) + self~ensureSelection + end + end + + ret = contextMenu~show(pos) + + return 0 + +::method browseEmployees unguarded + self~propSheet~setCurSel( , 3) + return 0 + +::method addEmployee unguarded + self~propSheet~setCurSel( , 1) + return 0 + +::method editEmployee unguarded + self~propSheet~setCurSel( , 2) + return 0 + +::method deleteEmployee unguarded + self~propSheet~maybeDeleteEmployee + return 0 + +::method deleteEmployeeNotify unguarded + expose lv + use strict arg index + + lv~delete(index - 1) + self~ensureSelection + + return 0 + +::method ensureSelection private + expose lv + + index = self~empIndex - 1 + if index < 0 then index = 0 + lv~select(index) + lv~focus(index) + + return 0 + + +::method addEmployeeRow private + use strict arg list, employee + + gender = 'Male' + if \ employee~male then gender = 'Female' + + mStatus = 'Married' + if \ employee~married then mStatus = 'Unmarried' + + eStatus = 'Full Time' + if \ employee~fullTime then eStatus = 'Part Time' + + e = employee + list~addRow( , , e~name, e~city, e~position, gender, mStatus, eStatus) + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Employee - A class that reflects a single, specific, employee. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'Employee' + +::attribute name +::attribute city +::attribute position +::attribute male +::attribute married +::attribute fullTime + +::method init + expose name city position male married fullTime + use strict arg name = "", city = "New York", position = "Software Developer", - + male = .true, married = .false, fullTime = .true + +::method isValid + expose name + return name \== '' + + +::method print + expose name city position male married fullTime + use strict arg dlg + + eol = .endOfLine + tab = '09'x + + if \ self~isValid then do + title = "Acme Software - Internal Error Detected" + msg = "Attempting to print invalid employee record." || eol~copies(2) - + "Employee record has no assigned name." + icon = 'ERROR' + end + else do + title = "Acme Software - Employee:" + + if male then msg = "Mr." name + else msg = "Ms." name + + if married then msg ||= " (married) " + + msg ||= eol + + if fullTime then status = 'Full Time Employee' + else status = 'Part Time Employee' + + msg ||= eol || "City:" || tab~copies(2) || city || eol || - + "Profession:" || tab || position || eol || - + 'Status:' || tab~copies(2) || status + + icon = 'INFORMATION' + end + + j = MessageDialog(msg, dlg~hwnd, title, , icon) + + +::method toCSV + expose name city position male married fullTime + use strict arg + + if male then mf = "M" + else mf = "F" + + if married then mu = "M" + else mu = 'U' + + if fullTime then fp = 'F' + else fp = 'P' + + txt = name', 'city', 'position', 'mf', 'mu', 'fp + + return txt + + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + EmployeeView - A class containing the dialog controls used to display an + employee in a dialog. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'EmployeeView' public + +::attribute editName +::attribute cbCity +::attribute lbPosition +::attribute rbMale +::attribute rbFemale +::attribute chkMarried +::attribute chkFullTime + +::method init + expose editName cbCity lbPosition rbMale rbFemale chkMarried chkFullTime + use strict arg editName, cbCity, lbPosition, rbMale, rbFemale, chkMarried, chkFullTime + +/** fillBoxes() + * Fills the city combo box and the position list box with the correct items. + */ +::method fillBoxes + expose cbCity lbPosition + use strict arg + + cbCity~add("Munich") + cbCity~add("New York") + cbCity~add("San Francisco") + cbCity~add("Stuttgart") + cbCity~add("San Diego") + cbCity~add("Tucson") + cbCity~add("Houston") + cbCity~add("Los Angeles") + + lbPosition~add("Business Manager") + lbPosition~add("Engineering Manager") + lbPosition~add("Software Developer") + lbPosition~add("Software QA") + lbPosition~add("Accountant") + lbPosition~add("Security") + lbPosition~add("Secretary") + lbPosition~add("Recptionist") + lbPosition~add("Lab Manager") + lbPosition~add("Lawyer") + lbPosition~add("CEO") + + +/** displayEmployee() + * Sets the state of the controls to reflect the specified employee + */ +::method displayEmployee + use strict arg emp + + self~editName~setText(emp~name) + self~cbCity~select(emp~City) + self~lbPosition~select(emp~Position) + + if emp~male then do + self~rbMale~check + self~rbFemale~uncheck + end + else do + self~rbFemale~check + self~rbMale~uncheck + end + + if emp~married then self~chkMarried~check + else self~chkMarried~uncheck + + if emp~fullTime then self~chkFullTime~check + else self~chkFullTime~uncheck + + +/** disable() + * Disables all the controls and sets the edit control text to the empty string. + */ +::method disable + use strict arg + + self~editName~setText("") + + self~editName~disable + self~cbCity~disable + self~lbPosition~disable + + self~rbMale~disable + self~rbFemale~disable + self~chkMarried~disable + self~chkFullTime~disable + + +/** blank() + * Sets all the controls to a 'blank' state. + */ +::method blank + use strict arg + + self~editName~setText("") + --self~cbCity~ + self~lbPosition~deselectIndex + + self~rbMale~uncheck + self~rbFemale~uncheck + self~chkMarried~uncheck + self~chkFullTime~uncheck + + +/** match() + * Tests if the state of the controls match the specified employee. + */ +::method sameAs + use strict arg emp + + if self~editName~getText \== emp~name then return .false + if self~cbCity~selected \== emp~City then return .false + if self~lbPosition~selected \== emp~Position then return .false + + if self~rbMale~checked & \ emp~male then return .false + if \ self~rbMale~checked & emp~male then return .false + + if self~chkMarried~checked & \ emp~married then return .false + if \ self~chkMarried~checked & emp~married then return .false + + if self~chkFullTime~checked & \ emp~fullTime then return .false + if \ self~chkFullTime~checked & emp~fullTime then return .false + + return .true + +/** createEmployee() + * Instantiates a new Employee object using the current state of the controls, + * and returns it if it is valid. If it is not valid, returns .nil + */ +::method createEmployee + use strict arg + + name = self~editName~getText~strip + city = self~cbCity~selected + position = self~lbPosition~selected + male = self~rbMale~checked + married = self~chkMarried~checked + fullTime = self~chkFullTime~checked + + emp = .Employee~new(name, city, position, male, married, fullTime) + + if emp~isValid then return emp + else return .nil + + diff --git a/modules/windows/oodialog/tutorial/logo.bmp b/modules/windows/oodialog/tutorial/logo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f80c3062902d305f99efc6fa01d798a1536fe36b GIT binary patch literal 165078 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 CiPI_o literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/tutorial/textScroll.rc b/modules/windows/oodialog/tutorial/textScroll.rc new file mode 100644 index 0000000..3e12b18 --- /dev/null +++ b/modules/windows/oodialog/tutorial/textScroll.rc @@ -0,0 +1,66 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/**************************************************************************** + +textscrl.rc + +produced by VisualAge Resource Workshop + +*****************************************************************************/ + +#include + +#define DIALOG_1 1 + +100 DIALOG 6, 15, 218, 94 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ooDialog Scrolling Text" +FONT 12, "Arial" +{ + CONTROL "Text", 12, "EDIT", ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP, 30, 9, 181, 12 + CONTROL "Fontname", 13, "EDIT", WS_BORDER | WS_TABSTOP, 45, 27, 101, 12 + CONTROL "fontsize", 14, "EDIT", WS_BORDER | WS_TABSTOP, 187, 26, 24, 12 + PUSHBUTTON "&Display", 11, 10, 77, 50, 14 + DEFPUSHBUTTON "Leave", 1, 161, 77, 50, 14 + AUTO3STATE "Button", 10, 8, 47, 204, 24, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_TABSTOP + CONTROL "", -1, "static", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE, 4, 44, 211, 30 + LTEXT "Text", -1, 7, 12, 20, 7 + LTEXT "Fontname", -1, 7, 28, 34, 8 + LTEXT "Fontsize", -1, 152, 28, 30, 8 +} + diff --git a/modules/windows/oodialog/tutorial/textScroll.rex b/modules/windows/oodialog/tutorial/textScroll.rex new file mode 100755 index 0000000..3612041 --- /dev/null +++ b/modules/windows/oodialog/tutorial/textScroll.rex @@ -0,0 +1,81 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: textScroll.rex + * Type: Open Object REXX Script + * + * Description: Scrolling text example. + */ + +sd = locate() +dlg = .MyDialogClass~new(sd"textScroll.rc", 100) +if dlg~initCode <> 0 then return 99 +dlg~execute("SHOWTOP") + +return 0 + + +::requires "ooDialog.cls" + +::class 'MyDialogClass' subclass RcDialog + +::method init + + forward class (super) continue + if self~initCode <> 0 then return self~initCode + + self~data13 = "Arial" + self~text = "This is a goofy scrolling text demonstration" + self~data14 = 24 + self~connectButtonEvent(11, "CLICKED", "Display") + + return self~initCode + + +::method initDialog + + -- Set the background color of the button to the backgroud color of a button. + COLOR_BTNFACE = 15 + self~setControlSysColor(10, COLOR_BTNFACE) + + +::method display + self~getData + self~scrollInControl(10, self~text, self~data13, self~data14, "BOLD") + diff --git a/modules/windows/oodialog/userGuide/ReadMe.txt b/modules/windows/oodialog/userGuide/ReadMe.txt new file mode 100644 index 0000000..7129a19 --- /dev/null +++ b/modules/windows/oodialog/userGuide/ReadMe.txt @@ -0,0 +1,49 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + ReadMe + + 1. ooDialog - Programs to Accompany the ooDialog User Guide + ------------------------------------------------------------ + + This subdirectory tree contains the example programs referred to in the + ooDialog User Guide. The programs are intended to give context to the + discussions in the User Guide, and may, or may not, be of use to ooRexx + programmers by themselves. + + The structure of the subdirectory tree and the programs themselves are + explained in the ooDialog User Guide. diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise02/HelloWorld.rex b/modules/windows/oodialog/userGuide/exercises/Exercise02/HelloWorld.rex new file mode 100755 index 0000000..e0d2abe --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise02/HelloWorld.rex @@ -0,0 +1,67 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 02: Hello World v01-00 31May12 + + File Contents: class "HelloWorld" + Pre-requisites: None. + Description: The simplest possible dialog. + + Changes: + v01-00: First version. + +------------------------------------------------------------------------------*/ + +dlg = .HelloWorld~new +dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +::REQUIRES "ooDialog.cls" + + +/*---------------------------------------------------------------------------*/ + +::CLASS 'HelloWorld' SUBCLASS UserDialog + + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "Hello World", "CENTER") + +/*---------------------------------------------------------------------------*/ + + + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise02/WoW.rex b/modules/windows/oodialog/userGuide/exercises/Exercise02/WoW.rex new file mode 100755 index 0000000..1e1d420 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise02/WoW.rex @@ -0,0 +1,69 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 02: Putting "controls" on the window. v01-00 31May12 + + File Contents: class "WordsOfWisdom" + Pre-requisites: None. + Description: Simple Words of Wisdom app - displays hard-coded 'words of + wisdom' in a static text control. + + Changes: + v01-00: First version. + +------------------------------------------------------------------------------*/ + +dlg = .WordsOfWisdom~new +dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +::REQUIRES "ooDialog.cls" + +/*----------------------------------------------------------------------------*/ +::CLASS 'WordsOfWisdom' SUBCLASS UserDialog + + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "Words of Wisdom", "CENTER") + + ::METHOD defineDialog -- Invoked automatically by ooDialog. + self~createPushButton(901, 142, 99, 50, 14, "DEFAULT", "More wisdom") + self~createPushButton(IDCANCEL, 197, 99, 50, 14, ,"Cancel") + self~createStaticText(-1, 40, 40, 200, 20, , - + "Complex problems have simple solutions"||.endofline||"- which are wrong.") + +/*----------------------------------------------------------------------------*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise02/WoW2.rex b/modules/windows/oodialog/userGuide/exercises/Exercise02/WoW2.rex new file mode 100755 index 0000000..48c3533 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise02/WoW2.rex @@ -0,0 +1,94 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 02: Making the Controls Work v01-00 31May12 + + File Contents: class "WordsOfWisdom2" + Pre-requisites: None. + Description: Simple Words of Wisdom app - displays hard-coded 'words of + wisdom' in a static text control. + + Changes: + v01-00: First version. + +------------------------------------------------------------------------------*/ + +dlg = .WordsOfWisdom2~new +dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +::REQUIRES "ooDialog.cls" + +/*---------------------------------------------------------------------------*/ +::CLASS 'WordsOfWisdom2' SUBCLASS UserDialog + + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "Words of Wisdom 2", "CENTER") + + + ::METHOD defineDialog -- Invoked automatically by ooDialog. + self~createPushButton(901, 142, 99, 50, 14, "DEFAULT", "More wisdom", OkClicked) + self~createPushButton(IDCANCEL, 197, 99, 50, 14, ,"Cancel") + self~createStaticText(101, 40, 40, 200, 40, , "Click 'More wisdom'") + + ::METHOD okClicked + arrWow = .array~new + + arrWow[1] = "Agnes Allen's Law:"||.endofline|| - + "Almost anything is easier to get into than out of." + arrWow[2] = "Airplane Law:"||.endofline||"When the plane you are on is late," - + ||.endofline||"the plane you want to transfer to is on time." + arrWow[3] = "Fourteenth Corollary of Atwood's General Law of Dynamic Negatives:" - + ||.endofline||"No books are lost by loaning"||.endofline|| - + "except those you particularly wanted to keep." + arrWow[4] = "Baker's Byroad:"||.endofline||"When you're over the hill, you pick up speed." + arrWow[5] = "First Law of Bicycling:"||.endofline|| - + "No matter which way you ride, it's uphill and against the wind." + arrWow[6] = "Brooks's Law:"||.endofline|| - + "Adding manpower to a late software project makes it later." + arrWow[7] = "Grossman's Misquote of H. L. Mencken"||.endofline|| - + "Complex problems have simple, easy-to-understand wrong answers." + + say "'More wisdom' button clicked" + + newText = self~newStatic(101) + i = random(1,7) + newText~setText(arrWow[i]) + return + +/*----------------------------------------------------------------------------*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise03/Startup.rex b/modules/windows/oodialog/userGuide/exercises/Exercise03/Startup.rex new file mode 100755 index 0000000..e2327f1 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise03/Startup.rex @@ -0,0 +1,63 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide v01-00 31May12 + Exercise 03 Part 2: Startup.rex + + This file is the "application" or "root" or "starter" part + of the "Words of Wisdom" application. All other files in this exercise + contain only classes. + + Changes: + v01-00 31May12: First version. +------------------------------------------------------------------------------*/ + + +/******************************************************************************/ + +.local~my.idWowData = .WowData~new +.local~my.idWowPicker = .WowPicker~new +dlg = .WowView~new + +.local~my.idWowData~activate +.local~my.idWowPicker~activate +dlg~activate + +::REQUIRES "WowView.rex" +::REQUIRES "WowModel.rex" +::REQUIRES "WowData.rex" + +/******************************************************************************/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise03/Wow3.rex b/modules/windows/oodialog/userGuide/exercises/Exercise03/Wow3.rex new file mode 100755 index 0000000..2e67579 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise03/Wow3.rex @@ -0,0 +1,192 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 03a: Re-structuring the "Words of Wisdom" app. v01-00 31May12 + + Contains: Startup statements + Classes: WowView, WowModel, WowData. + + Pre-requisites: None. + + Description: A re-structuring of the "Words of Wisdom" code. + + Changes: + v01-00 31May12: First version. + + ******************************************************************************/ + +dlg = .WowView~new +dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + + +::REQUIRES "ooDialog.cls" + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + UI - Class 'WowView' v01-00 31may12 + --------------------- + Defines the Words of Wisdom User Interface. + + Changes: + v01-00 31May12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS 'WowView' SUBCLASS UserDialog + + /*---------------------------------------------------------------------------- + init - initialises the dialog + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose wowPicker + forward class (super) continue + self~create(30, 30, 257, 123, "Words of Wisdom", "CENTER") + wowPicker = .WowPicker~new + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + defineDialog - defines the "Words of Wisdom" controls + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD defineDialog -- Invoked automatically. + self~createPushButton(901, 142, 99, 50, 14, "DEFAULT", "More wisdom", OkClicked) + self~createPushButton(IDCANCEL, 197, 99, 50, 14, ,"Cancel") + self~createStaticText(101, 40, 40, 200, 40, , "Click 'More wisdom'") + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + initDialog - invoked automatically after the dialog has been created. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose newText + newText = self~newStatic(101) + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + okClicked - Actions the "More wisdom" control + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD okClicked + expose wowPicker newText + wow = wowPicker~pickWow + newText~setText(wow) + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + WowPicker v01-00 31May12 + ------------- + Picks a "words of wisdom" string from a set of such "words of wisdom" + and returns it. The set is initially retrieved from the WowData class. + + Changes: + v01-00 31May12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS WowPicker + +/*---------------------------------------------------------------------------- + init - gets an initial Wow set from the WowData object. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose wowSet + dataSource = .WowData~new + wowSet = dataSource~readWowSet + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + pickWow - picks a Word of Wisdom from the current wowSet and returns it. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD pickWow + expose wowSet + i = random(1,7) + return wowSet[i] + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + WowData v01-00 31May12 + ------------- + Has access to WOW data, and returns a set to requester. The size of the set + can be set via configuration (but not in this version). + + Changes: + v01-00 31May12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS WowData + + /*---------------------------------------------------------------------------- + init - reads initial Wow Set from disk (but not in this version) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose arrWow + arrWow = .array~new + arrWow[1] = "Agnes Allen's Law:" - + "Almost anything is easier to get into than out of." + arrWow[2] = "Airplane Law:" - + "When the plane you are on is late," - + "the plane you want to transfer to is on time." + arrWow[3] = "Fourteenth Corollary of Atwood's General Law of Dynamic Negatives:" - + "No books are lost by loaning" - + "except those you particularly wanted to keep." + arrWow[4] = "Baker's Byroad: When you're over the hill, you pick up speed." + arrWow[5] = "First Law of Bicycling:" - + "No matter which way you ride, it's uphill and against the wind." + arrWow[6] = "Brooks's Law:" - + "Adding manpower to a late software project makes it later." + arrWow[7] = "Grossman's Misquote of H. L. Mencken:" - + "Complex problems have simple, easy-to-understand wrong answers." + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + read - Returns a wowSet + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD readWowSet + expose arrWow + return arrWow + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise03/WowData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise03/WowData.rex new file mode 100755 index 0000000..2f75505 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise03/WowData.rex @@ -0,0 +1,97 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise03 Part 2: The WowData component. v01-00 31May12 + + Contains: Classes: WowData. + + Pre-requisites: None. + + Description: The data component of the "Words of Wisdom" app. + + Changes: + v01-00 31May12: First version. + +------------------------------------------------------------------------------*/ + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + WowData v01-00 31May12 + ------- + Has access to WOW data, and returns a set to requester. + + Potential enhancement: Define the size of a set through configuration. + + Changes: + v01-01: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS WowData PUBLIC + + /*---------------------------------------------------------------------------- + activate - reads initial Wow Set from disk (but not in this version) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate + expose arrWow + arrWow = .array~new + arrWow[1] = "Agnes Allen's Law:" - + "Almost anything is easier to get into than out of." + arrWow[2] = "Airplane Law:" - + "When the plane you are on is late," - + "the plane you want to transfer to is on time." + arrWow[3] = "Fourteenth Corollary of Atwood's General Law of Dynamic Negatives:" - + "No books are lost by loaning" - + "except those you particularly wanted to keep." + arrWow[4] = "Baker's Byroad: When you're over the hill, you pick up speed." + arrWow[5] = "First Law of Bicycling:" - + "No matter which way you ride, it's uphill and against the wind." + arrWow[6] = "Brooks's Law:" - + "Adding manpower to a late software project makes it later." + arrWow[7] = "Grossman's Misquote of H. L. Mencken:" - + "Complex problems have simple, easy-to-understand wrong answers." + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + readWowSet - returns the Wow set as an array. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD readWowSet + expose arrWow + return arrWow + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise03/WowModel.rex b/modules/windows/oodialog/userGuide/exercises/Exercise03/WowModel.rex new file mode 100755 index 0000000..9b59638 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise03/WowModel.rex @@ -0,0 +1,84 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise03 Part 2: The WowModel component. v01-00 31May12 + + Contains: Classes: WowPicker. + + Pre-requisites: + .local~my.idWowData - an object that provides an array of 'words of wisdom'. + + Description: The model component of the "Words of Wisdom" app. + + Changes: + v01-00 31May12: First version. +------------------------------------------------------------------------------*/ + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + WowPicker v01-00 31may12 + --------- + A class that returns a Words of Wisdom string, selected randomly from a set + of such Words of Wisdom. + (Potential enhancements: Request a different set from the WowData class; + Have the size of the set configurable.) + Changes: + v01-00: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS WowPicker Public + +/*---------------------------------------------------------------------------- + activate - gets an initial Wow set from the WowData object. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate + expose arrWowSet + dataSource = .local~my.idWowData + arrWowSet = dataSource~readWowSet + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + pickWow - picks a Word of Wisdom from the current wowSet and returns it. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD pickWow + expose arrWowSet + i = random(1,7) + return arrWowSet[i] + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise03/WowView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise03/WowView.rex new file mode 100755 index 0000000..f3e760c --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise03/WowView.rex @@ -0,0 +1,111 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise03 Part 2: The WowView component. v01-00 31may12 + + Contains: Classes: WowView. + + Pre-requisites: + .local~my.idWowPicker - an object that provides a 'pickWow' method. + + Description: The view component for the "Words of Wisdom" app. + + Changes: + v01-00: First version. +------------------------------------------------------------------------------*/ + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + WowView v01-00 31May12 + ------- + A class that defines the User Interface for the Wow application. + + Changes: + v01-00: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::REQUIRES "ooDialog.cls" + +::CLASS 'WowView' SUBCLASS UserDialog PUBLIC + + /*---------------------------------------------------------------------------- + init - initialises the dialog + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "Words of Wisdom", "CENTER") + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + defineDialog - defines the "Words of Wisdom" controls + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD defineDialog -- Invoked automatically by ooDialog. + self~createPushButton(901, 142, 99, 50, 14, "DEFAULT", "More wisdom", OkClicked) + self~createPushButton(IDCANCEL, 197, 99, 50, 14, ,"Cancel") + self~createStaticText(101, 40, 40, 200, 40, , "Click 'More wisdom'") + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + initDialog - invoked automatically after the dialog has been created. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose newText + newText = self~newStatic(101) + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + activate - gets id for wowPicker, shows the dialog. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose wowPicker + wowPicker = .local~my.idWowPicker + self~execute("SHOWTOP", IDI_DLG_OOREXX) -- MUST be last! + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + okClicked - Actions the "More wisdom" control + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD okClicked + expose wowPicker newText + wow = wowPicker~pickWow + newText~setText(wow) + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerModelData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerModelData.rex new file mode 100755 index 0000000..e254186 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerModelData.rex @@ -0,0 +1,143 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 04: The CustomerModel and CustomerData Classes v01-00 07Jun12 + + Contains: classes "CustomerModel" and "CustomerResource". + Pre-requisites: None. + + Outstanding Problems: + None. + + Changes: + v01-00 07Jun12: First version. +------------------------------------------------------------------------------*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerModel v01-00 07Jun12 + ------------ + The "model" part of the Customer component. + + Changes: + v01-00 07Jun12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerModel PUBLIC + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + -- Creates an instance and returns it. + aCustomerModel = self~new + return aCustomerModel + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD activate PUBLIC + -- Gets its data from ProductData. + expose idCustomerData + idCustomerData = .local~my.idCustomerData + + + ::METHOD query PUBLIC + -- Returns data requested (no argument = return all) + expose idCustomerData + say "CustomerModel-query-01." + data = idCustomerData~getData + return data +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerData v01-00 07Jun12 + ------------ + The "data" part of the Customer component. + + Changes: + v01-00 07Jun12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerData PUBLIC + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + aCustomerData = self~new + return aCustomerData + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate PUBLIC + expose custData + custData = .directory~new + custData[custNo] = "AB15784" + custData[custName] = "Joe Bloggs & Co Ltd" + arrCustAddr = .array~new + arrCustAddr[1] = "28 Frith Street" + arrCustAddr[2] = "Hardington" + arrCustAddr[3] = "Blockshire" + custData[CustAddr] = arrCustAddr + custData[custZip] = "LB7 4EJ" + custData[custDiscount]= "B1" + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getData PUBLIC + expose custData + say "CustomerData-getData-01." + return custData + +/*============================================================================*/ + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerView.h b/modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerView.h new file mode 100644 index 0000000..5458b27 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerView.h @@ -0,0 +1,64 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* Symbolic resource IDs for exercise 4a. */ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_CUST_DIALOG 102 +#define IDR_CUST_MENU 103 +#define IDC_CUST_LBL_CUSTNO 1001 +#define IDC_CUST_LBL_DISCOUNT 1002 +#define IDC_CUST_BTN_SHOWLASTORDER 1003 +#define IDM_CUST_NEW 40000 +#define IDM_CUST_UPDATE 40001 +#define IDM_CUST_PRINT 40002 +#define IDM_CUST_LAST_ORDER 40003 +#define IDC_CUST_EDT_CUSTNO 40043 +#define IDC_CUST_EDT_CUSTNAME 40044 +#define IDC_CUST_BTN_RECORDCHANGES 40069 +#define IDC_CUST_LBL_CUSTNAME 40070 +#define IDC_CUST_LBL_CUSTADDR 40071 +#define IDC_CUST_LBL_ZIP 40072 +#define IDC_CUST_LBL_LASTORDER 40073 +#define IDC_CUST_STC_LASTORDERDETAILS 40077 +#define IDC_CUST_EDT_CUSTADDR 40078 +#define IDC_CUST_EDT_DISCOUNT 40079 +#define IDC_CUST_EDT_CUSTZIP 40080 +#define IDC_CUST_STC_ERRORMSG 40081 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerView.rc new file mode 100644 index 0000000..e7870ef --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerView.rc @@ -0,0 +1,80 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "CustomerView.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_CUST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Customer...", IDM_CUST_NEW + MENUITEM "Update...", IDM_CUST_UPDATE + MENUITEM "Print...", IDM_CUST_PRINT + MENUITEM "Last Order", IDM_CUST_LAST_ORDER + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_CUST_DIALOG DIALOG 0, 0, 275, 239 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "*CustomerName*" +FONT 8, "Microsoft Sans Serif" +{ + LTEXT "Name:", IDC_CUST_LBL_CUSTNAME, 18, 47, 22, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTNO, 85, 20, 65, 15, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Customer Number:", IDC_CUST_LBL_CUSTNO, 18, 22, 59, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTNAME, 85, 45, 165, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Address:", IDC_CUST_LBL_CUSTADDR, 18, 72, 28, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTADDR, 85, 70, 167, 40, ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY + LTEXT "Zip Code:", IDC_CUST_LBL_ZIP, 20, 120, 32, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTZIP, 85, 120, 65, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Last Order:", IDC_CUST_LBL_LASTORDER, 18, 177, 36, 8, SS_LEFT + LTEXT " ", IDC_CUST_STC_LASTORDERDETAILS, 88, 177, 145, 8, SS_LEFT + LTEXT "Discount Code:", IDC_CUST_LBL_DISCOUNT, 18, 149, 50, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_DISCOUNT, 85, 145, 20, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT " ", IDC_CUST_STC_ERRORMSG, 18, 215, 8, 8, SS_LEFT + DEFPUSHBUTTON "Record Changes", IDC_CUST_BTN_RECORDCHANGES, 130, 195, 58, 14, WS_DISABLED + PUSHBUTTON "Show Last Order", IDC_CUST_BTN_SHOWLASTORDER, 195, 195, 58, 14 +} + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerView.rex new file mode 100755 index 0000000..dcc81b5 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise04/CustomerView.rex @@ -0,0 +1,324 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise04: The Customer component v01-00 01Jun12 + + Contains: class "CustomerView"; routine "startCustomerView". + + Pre-requisites: CustomerView.rc, CustomerView.h, CustomerModelView.rex. + + Description: A sample Customer View component - part of the sample + Order Management application. + + Changes: + v01-00 01Jun12: First version. + +-------------------------------------------------------------------------*/ + +::requires "ooDialog.cls" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerView v01-00 01Jun12 + ------------- + The "view" (or "gui") part of the Customer component - part of the sample + Order Management application. + + Changes: + v01-00: First version + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS "CustomerView" SUBCLASS RcDialog PUBLIC + + /*---------------------------------------------------------------------------- + Dialog Creation Methods: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Init - creates the dialog instance but does not make it visible. --*/ + ::METHOD init + expose menuBar + say "CustomerView-init-01." + + forward class (super) continue + + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Create Menu Bar - Creates the menu bar on the dialog. --*/ + ::METHOD createMenuBar + expose menuBar + say "CustomerView-createMenuBar-01." + menuBar = .ScriptMenuBar~new("CustomerView.rc", IDR_CUST_MENU, , , .true) + return .true + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Activate - Shows the Dialog - i.e. makes it visible to the user. --*/ + ::METHOD activate unguarded + say "CustomerView-activate-01." + self~execute("SHOWTOP") + return + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + InitDialog - Called by ooDialog -- */ + ::METHOD initDialog + expose menuBar custControls + say "CustomerView-initDialog-01." + menuBar~attachTo(self) + -- Create objects that map to the edit controls defined by the "customer.rc" + -- so they can be programmatically used elsewhere in the class: + custControls = .Directory~new + custControls[ecCustNo] = self~newEdit("IDC_CUST_EDT_CUSTNO") + custControls[ecCustName] = self~newEdit("IDC_CUST_EDT_CUSTNAME") + custControls[ecCustAddr] = self~newEdit("IDC_CUST_EDT_CUSTADDR") + custControls[ecCustZip] = self~newEdit("IDC_CUST_EDT_CUSTZIP") + custControls[ecCustDiscount] = self~newEdit("IDC_CUST_EDT_DISCOUNT") + custControls[stLastOrder] = self~newStatic("IDC_CUST_STC_LASTORDERDETAILS") + -- Create an object for the "Record Change" pushbutton in order to be able + -- to change its focus later: + custControls[btnRecordChanges] = self~newPushButton("IDC_CUST_BTN_RECORDCHANGES") + -- Define event handler methods for push-buttons: + self~connectButtonEvent("IDC_CUST_BTN_RECORDCHANGES","CLICKED",recordChanges) + self~connectButtonEvent("IDC_CUST_BTN_SHOWLASTORDER","CLICKED",showLastOrder) + -- Get app data and then show it: + self~getData + self~showData + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + MenuBar Methods: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + New Customer... Not fully implemented - merely tells user to use the + Customer List object. --*/ + ::METHOD newCustomer unguarded + msg = "Creating a new Customer is not yet implemented." + ret = InfoDialog(msg) + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Update - Sets fields to edit mode so that user can change the data. + Business Rule: Customer Number cannot be changed. --*/ + ::METHOD update unguarded + expose custControls + say "CustomerView-Update-01" + custControls[ecCustName]~setReadOnly(.false) + custControls[ecCustAddr]~setReadOnly(.false) + custControls[ecCustZip]~setReadOnly(.false) + custControls[ecCustDiscount]~setReadOnly(.false) + self~enableControl("IDC_CUST_BTN_RECORDCHANGES") + custControls[btnRecordChanges]~state = "FOCUS" -- Put focus on the button + self~focusControl("IDC_CUST_EDT_CUSTNAME") -- place cursor in the CustName edit control. + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Last Order - Displays info about the last order placed by this customer.--*/ + ::METHOD lastOrder unguarded + expose custControls + use arg button + orderDate="31/12/11"; orderNum = "ZZ999"; orderTotal = "$999.99" + lastOrder = orderDate " " orderNum " " orderTotal + custControls[stLastOrder]~setText(lastOrder) + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Print - Not implemented yet --*/ + ::METHOD print unguarded + msg = "The 'Print...' menu item is not yet implemented." + ret = MessageDialog(msg, self~hwnd, 'Print', 'WARNING') + + + /*---------------------------------------------------------------------------- + PushButton Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Record Changes - Collects new data, checks if there has indeed been a + change, and if not, issues a warning msg and disables + the button. --*/ + ::METHOD recordChanges unguarded + expose custControls custData newCustData + say "CustomerView-recordChanges-01" + + newCustData = .directory~new + newCustData[custName] = custControls[ecCustName]~getLine(1) + newCustData[custAddr] = .array~new + do i=1 to custControls[ecCustAddr]~lines + newCustData[custAddr][i] = custControls[ecCustAddr]~getLine(i) + end + newCustData[custZip] = custControls[ecCustZip]~getLine(1) + newCustData[custDiscount] = custControls[ecCustDiscount]~getLine(1) + + -- Check if anything's changed: + result = self~checkForChanges + if result then say "CustomerView-recordChanges-01: There were changes!" + else say "CustomerView-recordChanges-02: No Changes Found" + + /* Send new data to be checked by CustomerModel (not implemented). */ + + /* Disable controls that were enabled by menu "File-Update" selection: */ + custControls[ecCustName]~setReadOnly(.true) + custControls[ecCustAddr]~setReadOnly(.true) + custControls[ecCustZip]~setReadOnly(.true) + custControls[ecCustDiscount]~setReadOnly(.true) + self~disableControl("IDC_CUST_BTN_RECORDCHANGES") + + + /*---------------------------------------------------------------------------- + Show Last Order - displays mock sales order info in the Last_Order_Details + field; info is hard-coded in this method. --*/ + ::METHOD showLastOrder unguarded + expose CustControls + -- Notionally get last order from "SalesOrder" component. + orderDate="12/2/11"; orderNum = "AB123"; orderTotal = "$524.58" + lastOrder = orderDate " " orderNum " " orderTotal + custControls[stLastOrder]~setText(lastOrder) + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Get Data - gets data from the CustomerModel component and displays it in the + appropriate controls. --*/ + ::METHOD getData + expose custData + say "CustomerView-getData-01." + idCustomerModel = .local~my.idCustomerModel + custData = idCustomerModel~query + + /*---------------------------------------------------------------------------- + showData - displays data in the dialog's controls. */ + ::METHOD showData + expose custData custControls + say "CustomerView-showData-01." + -- Show CustNo and CustName: + custControls[ecCustNo]~setText(custData[custNo]) + custControls[ecCustName]~setText(custData[custName]) + -- Re-format Cust Address from an array into a string with line-ends + -- after each array element except the last, then show it. + arrCustAddr = custData[CustAddr] + strCustAddr = "" + do i=1 to arrCustAddr~items + if i < arrCustAddr~items then do + strCustAddr = strCustAddr||arrCustAddr[i] || .endofline + end + else do + strCustAddr = strCustAddr || arrCustAddr[i] + end + end + custControls[ecCustAddr]~setText(strCustAddr) + -- Finally, show Zip and Discount: + custControls[ecCustZip]~setText(custData[custZip]) + custControls[ecCustDiscount]~setText(custData[custDiscount]) + --custControls[stLastOrder]~setText("Press Me") + + + /*-------------------------------------------------------------------------- + checkForChanges - after "Record Changes" actioned by the user, check whether + any data has actually changed. If it has: (a) assign new data to old data; + (b) return .true. If it hasn't: return .false. + Note: cannot just compare the two directories since data format in Address + is different. --*/ + ::METHOD checkForChanges + expose custData newCustData + changed = .false + if newCustData[custName] \= custData[custName] then do + custData[custName] = newCustData[custName] + changed = .true + end + if custData[CustAddr]~items \= newCustData[CustAddr]~items then changed = .true + else + do i=1 to custData[custAddr]~items + if custData[custAddr][i] \= newCustData[custAddr][i] then do + changed = .true + leave + end + end + if newCustData[custZip] \= custData[custZip] then do + custdata[custZip] = newCustData[custZip] + changed = .true + end + if newCustData[custDiscount] \= custData[custDiscount] then do + custData[custDiscount] = newCustData[custDiscount] + changed = .true + end + -- If no changes after all, display message box: + if \changed then do + msg = "CustomerView-checkForChanges-01: Nothing was changed! Update not done." + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,"Update Customer","OK","WARNING","DEFBUTTON2 APPLMODAL") + end + else do + say "CustomerView-checkForChanges-02: changed =" changed + custData = newCustData + end + return changed + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + StartCustomerView v01-00 01Jun12 + ----------------- + A routine that creates the CustomerView dialog. + + Changes: + v01-00: First version + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::ROUTINE StartCustomerView PUBLIC + say "StartCustomerView Routine-01: Start." + .Application~setDefaults("O", "CustomerView.h", .false) + dlg = .CustomerView~new("CustomerView.rc", "IDD_CUST_DIALOG") + say "StartCustomerView Routine-02: dlg~activate." + dlg~activate + say "StartCustomerView Routine-03: End." +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog.h b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog.h new file mode 100644 index 0000000..4306015 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog.h @@ -0,0 +1,44 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_DIALOG1 100 +#define IDC_EDIT1 1002 +#define IDC_RADIO1 1003 +#define IDC_RADIO2 1004 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog.rc b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog.rc new file mode 100644 index 0000000..af5b53a --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog.rc @@ -0,0 +1,57 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "ASimpleDialog.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_DIALOG1 DIALOG 0, 0, 186, 95 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "A Simple Dialog" +FONT 8, "Ms Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 130, 72, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 75, 72, 50, 14 + EDITTEXT IDC_EDIT1, 50, 16, 120, 15, ES_AUTOHSCROLL + LTEXT "Statement:", IDC_STATIC, 8, 19, 35, 8, SS_LEFT + GROUPBOX "", IDC_STATIC, 55, 38, 108, 27 + AUTORADIOBUTTON "Agree", IDC_RADIO1, 66, 48, 35, 8 + AUTORADIOBUTTON "Disagree", IDC_RADIO2, 117, 48, 44, 8 +} diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog.rex b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog.rex new file mode 100755 index 0000000..7a95004 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog.rex @@ -0,0 +1,121 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* ooDialog User Guide + Samples\DlgData + ASimpleDialog.rex v01-00 12JLY11 + + This Dialog is intended to illustrate the use of DlgData. It is a very simple + dialog that displays some text, allows the user to change the text, and also + to indicate agreement or disagreement with the text. A response is provided + in a message box. + + Associated files: ASimpleDialog.rc ASimpleDialog.h +------------------------------------------------------------------------------*/ + +-- (0) Add the symbolic IDs in ASimpleDialog.h file to GlobalConstDir: +.Application~useGlobalConstDir("O", "ASimpleDialog.h") + +-- (1) Set text in the edit control: +statement = "It's a fine day today." +dlgData.IDC_EDIT1 = statement + +-- (2a) Create the dialog defined by the .rc file: +dlg = .ASimpleDialog~new("ASimpleDialog.rc", IDD_DIALOG1, dlgData.) + +-- (2b) Display the dialog: +ret = dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +-- (3) When the dialog is closed, and if the user pressed OK, then retrieve +-- the data provided by the user: +if ret == 1 then do -- if the user pressed OK + statement2 = dlgData.1002 -- get data from the edit control + agree = dlgData.IDC_RADIO1 -- get the state of the radio buttons: + disagree = dlgData.1004 + +-- (4) Set up the appropriate message to display: + choice = .true -- Assume user selected a radio button + if \agree & \disagree then choice = .false -- If neither radio button selected. + if statement2 \= statement then - -- If data in edit control changed + newStmt = .true + else newStmt = .false + + -- Set some initial values for the message: + title = 'Response Received' + icon = 'INFORMATION' + + -- Build the appropriate response message: + msg = "Thank you for" + if newStmt then do -- New statement entered: + msg = msg "your statement," + if \choice then do + msg = msg "but you have not indicated whether or not you agree with it." + end + else do -- a choice was made + if agree then msg = msg "and for your agreement with it." + else msg = msg "even though you disagree with it." + end + end + else do -- Original stament unchanged: + if \choice then do + msg = msg "neither agreeing nor disagreeing." + end + else do + if agree then msg = msg "your agreement." + else msg = msg "your disagreement." + end + end +end +else do -- if Cancel Pressed + title = "Dialog Canceled" + icon = "ERROR" + msg = "Thank you for canceling." +end + +-- (5) Display a message to respond to the user's choices: +ret = MessageDialog(msg, 0, title, 'OK', icon, 'SETFOREGROUND') + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" + +::CLASS ASimpleDialog SUBCLASS RcDialog + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog2.rex b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog2.rex new file mode 100755 index 0000000..60e843e --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/ASimpleDialog2.rex @@ -0,0 +1,125 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* ooDialog User Guide + Samples\DlgData + ASimpleDialog2.rex v01-00 12JLY11 + + A Simple Dialog 2 - identical to ASimpleDialog.rex except that: + - this is a subclass of ResDialog + - uses .Application to specify the *.h file. + + This Dialog is intended to illustrate the use of DlgData. It is a very simple + dialog that displays some text, allows the user to change the text and to + indicate agreement or disagreement with the text. On pressing OK or Cancel, + a messagebox provides a response. + + Associated files: ASimpleDialog.dll ASimpleDialog.h +------------------------------------------------------------------------------*/ + +-- (0) Add the symbolic IDs in ASimpleDialog.h file to GlobalConstDir: +.Application~useGlobalConstDir("O", "ASimpleDialog.h") + +-- (1) Set text in the edit control: +statement = "It's a fine day today." +dlgData.IDC_EDIT1 = statement + +-- (2a) Create the dialog defined by the .rc file: +dlg = .ASimpleDialog~new("res\ASimpleDialog.dll", IDD_DIALOG1, dlgData.) + +-- (2b) Display the dialog: +ret = dlg~execute("SHOWTOP", IDI_DLG_OOREXX) + +-- (3) When the dialog is closed, and if the user pressed OK, then retrieve +-- the data provided by the user: +if ret == 1 then do -- if the user pressed OK + statement2 = dlgData.1002 -- get data from the edit control + agree = dlgData.IDC_RADIO1 -- get the state of the radio buttons: + disagree = dlgData.1004 + +-- (4) Set up the appropriate message to display: + choice = .true -- Assume user selected a radio button + if \agree & \disagree then choice = .false -- If neither radio button selected. + if statement2 \= statement then - -- If data in edit control changed + newStmt = .true + else newStmt = .false + + -- Set some initial values for the message: + title = 'Response Received' + icon = 'INFORMATION' + + -- Build the appropriate response message: + msg = "Thank you for" + if newStmt then do -- New statement entered: + msg = msg "your statement," + if \choice then do + msg = msg "but you have not indicated whether or not you agree with it." + end + else do -- a choice was made + if agree then msg = msg "and for your agreement with it." + else msg = msg "even though you disagree with it." + end + end + else do -- Original stament unchanged: + if \choice then do + msg = msg "neither agreeing nor disagreeing." + end + else do + if agree then msg = msg "your agreement." + else msg = msg "your disagreement." + end + end +end +else do -- if Cancel Pressed + title = "Dialog Canceled" + icon = "ERROR" + msg = "Thank you for canceling." +end + +-- (5) Display a message to respond to the user's choices: +ret = MessageDialog(msg, 0, title, 'OK', icon, 'SETFOREGROUND') + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Directives, Classes, or Routines. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::requires "ooDialog.cls" + +::CLASS ASimpleDialog SUBCLASS ResDialog + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/res/ASimpleDialog.dll b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/res/ASimpleDialog.dll new file mode 100644 index 0000000000000000000000000000000000000000..571fdbdc61e1acaa3f7c105295293ba4d1def9ee GIT binary patch literal 2048 zcmeHHO=}ZD7=Cu^N2(+WUW61n!Qe?k%%vb6Qd>c2OGDa&=s~whXadQm?4}?&ZF_E^ zcYi}~9!l{bJ@sIJgC70DAK+zu-ZwMVhduYbw{E{l zPB0_CI2;a}YwNOR26(7(?zdw3wuGKajAugkV6j}0*qQvxE8u|_9mTKH=6FwH7d3H+C#q**u!0VHyuZ3=(VM3i(C$NaQwB?j71L(6%SRAh z%>f>~n$T?X%N6A4r)h#^EGV~hqx^!+`f8IYsL7Sg(7@tmLHXK<5s<`tjV+@#Ij;|dDbM}8;4EN2surKKo` X*(Bx`F`pD8s}l2z-y<#QUs7KIJvWFv literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/res/res.mak b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/res/res.mak new file mode 100644 index 0000000..ccf023a --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/DlgData/res/res.mak @@ -0,0 +1,50 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +# nMake-compatible Make file for the DlgData resource-only DLL. + +all: ASimpleDialog.dll + +ASimpleDialog.dll: ASimpleDialog.res + link /NOLOGO $(@B).res /NOENTRY /DLL /MACHINE:$(MACHINE) /OUT:$(@B).dll + +# Create .res from .rc +ASimpleDialog.res: ..\ASimpleDialog.rc + rc -r -fo$(@B).res ..\$(@B).rc + +clean: + del *.res *.dll 1>nul 2>&1 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/ReadMe.txt b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/ReadMe.txt new file mode 100644 index 0000000..f95760c --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise04/Extras/ReadMe.txt @@ -0,0 +1,49 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + ReadMe + + 1. ooDialog - Additional Examples to Accompany the ooDialog User Guide + ----------------------------------------------------------------------- + + This subdirectory tree contains the example programs referred to in the + appendix of the ooDialog User Guide. The programs are intended to give + context to the discussions in the User Guide, and may, or may not, be of + use to ooRexx programmers by themselves. + + The structure of the subdirectory tree and the programs themselves are + explained in the ooDialog User Guide. diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise04/Startup.rex b/modules/windows/oodialog/userGuide/exercises/Exercise04/Startup.rex new file mode 100755 index 0000000..8ccbe88 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise04/Startup.rex @@ -0,0 +1,64 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise04: The Customer Component v01-00 01Jun12 + + Contains: Startup.rex + + Pre-requisites: + CustomerView.rex - the CustomerView dialog. + CustomerModelData.rex - Customer model and data components. + + Description: The startup script for the CustomerView component. + + Changes: + v01-00 01Jun12: First version. + +------------------------------------------------------------------------------*/ + +.local~my.idCustomerData = .CustomerData~new -- create Customer Data instance +.local~my.idCustomerModel = .CustomerModel~new -- create Customer Model instance +.local~my.idCustomerData~activate +.local~my.idCustomerModel~activate + +call startCustomerView -- a routine in CustomerView.rex + +say "Startup-01: Finished." + +::REQUIRES "CustomerView.rex" +::REQUIRES "CustomerModelData.rex" +/******************************************************************************/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise05/ProductModelData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise05/ProductModelData.rex new file mode 100755 index 0000000..95b4810 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise05/ProductModelData.rex @@ -0,0 +1,169 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 05: The ProductModel and ProductData Components v01-00 03Jun12 + + Contains: classes "ProductModel", "ProductResource", and "ProductDT". + + Pre-requisites: None. + + Changes: + v01-00 03Jun12: First Version +------------------------------------------------------------------------------*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductModel v01-00 03Jun12 + ------------ + The "model" part of the Product component. + + Changes: + v01-00 03Jun12: First Version + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductModel PUBLIC + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + -- Creates an instance and returns it. + aProductModel = self~new + return aProductModel + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD activate PUBLIC + -- Gets its data from ProductData. + expose data + idProductData = .local~my.idProductData + data = idProductData~getData + + + ::METHOD query PUBLIC + -- Returns data requested (no argument = return all) + expose data + return data +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductData v01-00 03Jun12 + ------------ + The "data" part of the Product component. + + Changes: + v01-00 03Jun12: First Version + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductData PUBLIC + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + aProductData = self~new + return aProductData + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate PUBLIC + expose data + data = .ProductDT~new + data~number = "CF300/X" + data~name = "Widget Box" + data~price = "2895" + data~uom = "6" + data~description = "A 10 litre case with flat sides capable of holding quite a lot of stuff." + data~size = "M" + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getData PUBLIC + expose data + return data + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductDT - A business data type for Product data. v01-00 03Jun12 + + Changes: + v01-00 03Jun12: First Version + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/ + +::CLASS ProductDT PUBLIC + + -- dtName XML Name Description + -- --------- ---------- ------------------------------- + -- ProductDT product + ::ATTRIBUTE number -- number Product Number + ::ATTRIBUTE name -- name Product Description + ::ATTRIBUTE price -- price Product Price (rightmost two digits are 100ths of currency unit) +--::ATTRIBUTE currency -- currency Three-letter currency code + ::ATTRIBUTE uom -- uom Product Unit of Measure + ::ATTRIBUTE description -- descrip Product Description + ::ATTRIBUTE size -- size Produce Size Category (S/M/L) + + ::METHOD list PUBLIC + expose number name price uom description size + say "---------------" + say "ProductDT-List:" + say "Number: " number "Name:" name + say "Price:" price "UOM:" uom "Size:" size + say "Description:" description + say "---------------" +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise05/ProductView.h b/modules/windows/oodialog/userGuide/exercises/Exercise05/ProductView.h new file mode 100644 index 0000000..31a55a7 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise05/ProductView.h @@ -0,0 +1,67 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_PRODUCT_VIEW 106 +#define IDR_PRODUCT_VIEW_MENU 107 +#define IDD_PRODUCT_VIEW_ABOUT 108 +#define IDB_PROD_ICON 109 +#define IDC_PRODABT_ICON_PLACE 1000 +#define IDC_PROD_NO 1000 +#define IDC_PROD_UOM 1001 +#define IDC_PROD_STATIC2 1003 +#define IDC_PROD_STATIC3 1004 +#define IDC_PROD_STATIC1 1005 +#define IDC_PROD_STATIC4 1007 +#define IDC_PROD_STATIC5 1008 +#define IDM_PROD_UPDATE 40000 +#define IDM_PROD_REFRESH 40001 +#define IDM_PROD_CLOSE 40002 +#define IDM_PROD_PRINT 40003 +#define IDM_PROD_ABOUT 40004 +#define IDC_PROD_NAME 40010 +#define IDC_PROD_DESCRIPTION 40011 +#define IDC_PROD_LIST_PRICE 40012 +#define IDC_PROD_SIZE_GROUP 40013 +#define IDC_PROD_SAVE_CHANGES 40014 +#define IDC_PROD_RADIO_SMALL 40015 +#define IDC_PROD_RADIO_MEDIUM 40016 +#define IDC_PRODABT_STATIC1 40017 +#define IDC_PROD_RADIO_LARGE 40017 +#define IDC_PRODABT_STATIC2 40018 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise05/ProductView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise05/ProductView.rc new file mode 100644 index 0000000..af4ef9f --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise05/ProductView.rc @@ -0,0 +1,102 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include +#include +#include +#include "ProductView.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDB_PROD_ICON BITMAP ".\\res\\ProductIcon.bmp" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_PRODUCT_VIEW_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "&Update Product", IDM_PROD_UPDATE + MENUITEM "Refresh Data", IDM_PROD_REFRESH + MENUITEM "Print...", IDM_PROD_PRINT + MENUITEM "Close", IDM_PROD_CLOSE + } + POPUP "Help" + { + MENUITEM "About...", IDM_PROD_ABOUT + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PRODUCT_VIEW DIALOG 0, 0, 248, 228 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Product" +FONT 8, "Ms Shell Dlg" +{ + LTEXT "Product Number:", IDC_PROD_STATIC1, 25, 28, 54, 8, SS_LEFT + LTEXT "Product Name:", IDC_PROD_STATIC2, 25, 53, 48, 8, SS_LEFT + LTEXT "List Price:", IDC_PROD_STATIC3, 25, 78, 32, 8, SS_LEFT + LTEXT "UOM:", IDC_PROD_STATIC5, 151, 78, 20, 8, SS_LEFT + LTEXT "Description", IDC_PROD_STATIC4, 25, 103, 36, 8, SS_LEFT + EDITTEXT IDC_PROD_NO, 95, 25, 50, 14, NOT WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_PROD_NAME, 95, 51, 130, 13, ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_PROD_LIST_PRICE, 95, 75, 40, 14, ES_AUTOHSCROLL | ES_READONLY, WS_EX_RIGHT + EDITTEXT IDC_PROD_UOM, 175, 75, 40, 14, ES_AUTOHSCROLL | ES_READONLY, WS_EX_RIGHT + EDITTEXT IDC_PROD_DESCRIPTION, 95, 99, 125, 35, WS_HSCROLL | WS_SIZEBOX | ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY + GROUPBOX "Size Category", IDC_PROD_SIZE_GROUP, 31, 151, 189, 30, WS_GROUP, WS_EX_CLIENTEDGE + AUTORADIOBUTTON "Small", IDC_PROD_RADIO_SMALL, 46, 165, 33, 8, WS_DISABLED + AUTORADIOBUTTON "Medium", IDC_PROD_RADIO_MEDIUM, 110, 165, 41, 8, WS_DISABLED + AUTORADIOBUTTON "Large", IDC_PROD_RADIO_LARGE, 168, 165, 34, 8, WS_DISABLED + DEFPUSHBUTTON "Save Changes", IDC_PROD_SAVE_CHANGES, 180, 195, 52, 14, WS_DISABLED +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PRODUCT_VIEW_ABOUT DIALOG 0, 0, 204, 109 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "About Product View" +FONT 8, "Ms Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 143, 88, 50, 14 + CONTROL "", IDC_PRODABT_ICON_PLACE, WC_STATIC, SS_BITMAP | SS_NOTIFY | 0x00000040, 16, 7, 102, 71 + LTEXT "A view of a Product component.", IDC_PRODABT_STATIC1, 15, 84, 110, 15, SS_LEFT + LTEXT "An example of an About box using .ResDialog.", IDC_PRODABT_STATIC2, 130, 9, 65, 65, SS_LEFT +} diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise05/ProductView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise05/ProductView.rex new file mode 100755 index 0000000..2d7ad52 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise05/ProductView.rex @@ -0,0 +1,480 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 05: ProductView.rex - The ProductView component v01-00 03Jun12 + + Contains: classes "ProductView" and "AboutDialog". + + Pre-requisites: ProductView.dll, ProductView.h. + Support\NumberOnlyEditEx.cls (copied from ooDialog Samples) + + Description: A sample Product View component - part of the sample + Order Management application. + + Changes: + v01-00 03Jun12: First version. + +------------------------------------------------------------------------------*/ + +::requires "ooDialog.cls" +::requires "Support\NumberOnlyEditEx.cls" +::requires "ProductModelData.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductView v01-00 03Jun12 + ----------- + The "view" part of the Product business component. + + Changes: + v01-00 03Jun12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductView SUBCLASS ResDialog PUBLIC + + ::ATTRIBUTE dialogState PRIVATE -- States are: 'closable' or 'inUpdate". + + /*---------------------------------------------------------------------------- + Class Methods: + --------------------------------------------------------------------------*/ + + ::METHOD newInstance CLASS PUBLIC UNGUARDED + say ".ProductView-newInstance-01: Start." + -- Enable use of symbolic IDs in menu creation, and turn off AutoDetection + -- (the third parameter: + .Application~setDefaults("O", "ProductView.h", .false) + -- Create an instance of ProductView and show it: + dlg = .ProductView~new("res\ProductView.dll", IDD_PRODUCT_VIEW) + say ".ProductView-newInstance-02: dlg~Activate." + dlg~activate + + + /*---------------------------------------------------------------------------- + Instance Methods: + --------------------------------------------------------------------------*/ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + say "ProductView-init-01." + -- called first (result of .ProductView~new) + forward class (super) continue + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + say "ProductView-activate-01." + self~dialogState = "closable" + self~execute("SHOWTOP","IDB_PROD_ICON") + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar prodControls prodData + say "ProductView-initDialog-01" + + menuBar = .BinaryMenuBar~new(self, IDR_PRODUCT_VIEW_MENU, , self, .true) + + prodControls = .Directory~new + prodControls[ecProdNo] = self~newEdit("IDC_PROD_NO") + prodControls[ecProdName] = self~newEdit("IDC_PROD_NAME") + prodControls[ecProdPrice] = self~newEdit("IDC_PROD_LIST_PRICE") + prodControls[ecUOM] = self~newEdit("IDC_PROD_UOM") + prodControls[ecProdDescr] = self~newEdit("IDC_PROD_DESCRIPTION") + prodControls[gbSizes] = self~newEdit("IDC_PROD_SIZE_GROUP") -- Do we ever need this? + prodControls[rbSmall] = self~newRadioButton("IDC_PROD_RADIO_SMALL") + prodControls[rbMedium] = self~newRadioButton("IDC_PROD_RADIO_MEDIUM") + prodControls[rbLarge] = self~newRadioButton("IDC_PROD_RADIO_LARGE") + prodControls[pbSaveChanges] = self~newPushButton("IDC_PROD_SAVE_CHANGES") + self~connectButtonEvent("IDC_PROD_SAVE_CHANGES","CLICKED",saveChanges) + + -- Use NumberOnlyEditEx.cls to enforce numeric only entry for Price and UOM: + prodControls[ecProdPrice]~initDecimalOnly(2,.false) -- 2 decimal places, no sign. + prodControls[ecUOM]~initDecimalOnly(0,.false) -- 0 decimal places, no sign. + prodControls[ecProdPrice]~connectCharEvent(onChar) + prodControls[ecUOM]~connectCharEvent(onChar) + + prodData = self~getData -- Gets data from ProductModel into prodData + self~showData -- Show the data + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Event Handler Methods - MenuBar Events: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD updateProduct UNGUARDED + expose prodControls +say "ProductView-updateProduct-01." + -- Enable the controls to allow changes to the data: + prodControls[ecProdName]~setReadOnly(.false) + prodControls[ecProdPrice]~setReadOnly(.false) + prodControls[ecUOM]~setReadOnly(.false) + prodControls[ecProdDescr]~setReadOnly(.false) + prodControls[rbSmall]~enable + prodControls[rbMedium]~enable + prodControls[rbLarge]~enable + self~enableControl("IDC_PROD_SAVE_CHANGES") + prodControls[pbSaveChanges]~state = "FOCUS" -- Put input focus on the button + self~tabToNext() -- put text cursor on Product Description + -- (as if the user had pressed tab) + self~dialogState = "inUpdate" + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD refreshData UNGUARDED + self~disableControl("IDC_PROD_SAVE_CHANGES") + self~showData + self~dialogState = "closable" + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD print UNGUARDED + say "ProductView-print-01" + ret = InfoDialog(.HRS~printMsg) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD close UNGUARDED + say "ProductView-close-01" + self~cancel + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + say "ProductView-about-01" + dlg = .AboutDialog~new("ProductView.dll", IDD_PRODUCT_VIEW_ABOUT) + dlg~execute("SHOWTOP") + + + /*---------------------------------------------------------------------------- + Event Handler Methods - PushButton Events: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + "Save Changes" - Collects new data, checks if there has indeed been a + change, and if not, issues a warning msg. Disables the + button when valid changes made. */ + ::METHOD saveChanges UNGUARDED + expose prodControls prodData + + -- Transform data from view format (as in controls) to app format (a directory): + newProdData = self~xformView2App(prodControls) + + -- Check if anything's changed; if not, show msgbox and exit with controls enabled. + -- If changed, go on to validate data. + result = self~checkForChanges(newProdData) + if result = .false then do + msg = .HRS~nilSaved + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRS~updateProd,"OK","WARNING","DEFBUTTON2 APPLMODAL") + return + end + + -- Now validate data: + result = self~validate(newProdData) -- returns a null string or error messages. + -- Better would be a set of error numbers. + -- If no problems, then show msgbox and go on to disable controls. + if result = "" then do + msg = .HRS~saved + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRS~updateProd,"OK","INFORMATION","DEFBUTTON1 APPLMODAL") + end + -- If problems, then show msgbox and leave user to try again or refresh or exit. + else do + msg = result||.EndOfLine||.HRS~notSaved + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRS~updateProd,"OK","ERROR","DEFBUTTON1 APPLMODAL") + return + end + + -- Send new data to be checked by CustomerModel object (not implemented). + + -- Disable controls that were enabled by menu "ActionsFile-->Update" selection: + prodControls[ecProdName]~setReadOnly(.true) + prodControls[ecProdDescr]~setReadOnly(.true) + prodControls[ecProdPrice]~setReadOnly(.true) + prodControls[ecUom]~setReadOnly(.true) + if newProdData~size \= "S" then prodControls[rbSmall]~disable + if newProdData~size \= "M" then prodControls[rbMedium]~disable + if newProdData~size \= "L" then prodControls[rbLarge]~disable + self~disableControl("IDC_PROD_SAVE_CHANGES") + self~dialogState = "closable" + + prodData = newProdData + prodData~list + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Event Handler Methods - Keyboard Events: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD onChar UNGUARDED + -- called for each character entered in the price or UOM fields. + forward to (arg(6)) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD cancel + -- If in the process of updating, then ask whether any changes should be + -- thrown away and dialog closed. If yes then close by calling the superclass, + -- else nop. If not in update, then close immediately + say "ProductView-cancel-01." + if self~dialogState = "inUpdate" then do + ans = MessageDialog(.HRS~closeInUpdate, self~dlgHandle, .HRS~updateIP, "YESNO", "WARNING", "DEFBUTTON2") + if ans = .PlainBaseDialog~IDYES then return self~cancel:super + else nop + end + else return self~cancel:super + + + /*---------------------------------------------------------------------------- + Application Methods: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getData + -- Get data from the ProductModel: + --expose prodData + say "ProductView-getData-01." + idProductModel = .local~my.idProductModel + prodData = idProductModel~query -- prodData is of type ProductDT + return prodData + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showData + -- Transfrom data (where necessary) to display format, and then disable controls. + expose prodControls prodData + say "ProductView-showData-01." + -- Set data in controls: + prodControls[ecProdNo]~setText( prodData~number ) + prodControls[ecProdName]~setText( prodData~name ) + -- Price in prodData has no decimal point - 2 decimal places are implied - hence /100 for display. + prodControls[ecProdPrice]~setText(prodData~price/100 ) + prodControls[ecUOM]~settext( proddata~uom ) + prodControls[ecProdDescr]~setText(prodData~description ) + size = prodData~size + -- Disable controls + prodControls[ecProdName]~setReadOnly(.true) + prodControls[ecProdPrice]~setReadOnly(.true) + prodControls[ecUOM]~setReadOnly(.true) + prodControls[ecProdDescr]~setReadOnly(.true) + prodControls[rbSmall]~disable + prodControls[rbMedium]~disable + prodControls[rbLarge]~disable + -- But check correct button and enable it to highlight it to the user: + select + when size = "S" then do + .RadioButton~checkInGroup(self,"IDC_PROD_RADIO_SMALL","IDC_PROD_RADIO_LARGE","IDC_PROD_RADIO_SMALL") + prodcontrols[rbSmall]~enable + end + when size = "M" then do + .RadioButton~checkInGroup(self,"IDC_PROD_RADIO_SMALL","IDC_PROD_RADIO_LARGE","IDC_PROD_RADIO_MEDIUM") + prodcontrols[rbMedium]~enable + end + otherwise do + .RadioButton~checkInGroup(self,"IDC_PROD_RADIO_SMALL","IDC_PROD_RADIO_LARGE","IDC_PROD_RADIO_LARGE") + prodcontrols[rbLarge]~enable + end + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD checkForChanges + -- Check whether any data has actually changed when "Save Changes" button + -- has been pressed. Return .true if data changed, else returns .false. + expose prodData + use arg newProdData + + changed = .false + select + when newProdData~name \= prodData~name then changed = .true + when newProdData~price \= prodData~price then changed = .true + when newProdData~uom \= prodData~uom then changed = .true + when newProdData~description \= prodData~description then changed = .true + when newProdData~size \= ProdData~size then changed = .true + otherwise nop + end + return changed + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD validate + -- Validation: 1. Check price/UOM not changed > 50% up or down. + -- 2. Cannot change from Large to Small without UOM increasing + -- by at least 100%; nor from Small to Large without + -- decreasing by more than 50%. + -- 3. Product Description <= 100 characters. + -- 4. Product Name <= 30 characters. + -- Returns string of messages - the null string if all OK. + expose prodData + use arg newProdData + msg = "" + + -- Check Price (catches decimal point errors also): + price = prodData~price; newPrice = newProdData~price + oldUom = prodData~uom; newUom = newProdData~uom -- 'oldUom - avoids name conflict with 'uom' in newProddata~uom. + if ((price/oldUom)*1.5 < newPrice/newUom) | (newPrice/newUom < (price/oldUom)/2) then do + msg = msg||.HRS~badRatio||" " + end + + -- Check Size vs UOM: + if prodData~size = "L" & newProdData~size = "S" - -- Large to Small + & prodData~uom/2 < newProdData~uom then do + msg = msg||.HRS~uomTooBig||" " + end + if prodData~size = "S" & newProdData~size = "L" - -- Small to Large + & prodData~uom*2 > newProdData~uom then do + msg = msg||.HRS~uomTooSmall||" " + end + + -- Check Product Description length: + if newProdData.description~length > 80 then do + msg = msg||.HRS~descrTooBig||" " + end + + -- Check Product Name length: + if newProdData~name~length > 30 then do + msg = msg||.HRS~prodNameTooBig + end + + return msg + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD xformView2App + -- Transforms Product Data from View form (in the GUI controls) to + -- App form (a directory with address as an array). + expose prodControls + prodData = .ProductDT~new + prodData~number = prodControls[ecProdNo]~gettext() + prodData~name = prodControls[ecProdName]~getText() + price = prodControls[ecProdPrice]~getText() + -- Data entered has or assumes a decimal point; but data in "application" + -- is a whole number (e.g. $42.42 is recorded in the database as "4242"). + -- So re-format data from decimal to whole number: + priceTwoDecs = price~format(,2) -- force 2 dec positions + -- Re-display price properly formatted (in case the user did not format correctly - e.g. entered "42" or "38.4"): + prodControls[ecProdPrice]~setText(priceTwoDecs) + -- Now format price to "application" format: + price = (priceTwoDecs*100)~format(,0) -- multiply by 100 and then force whole number. + prodData~price = price + prodData~uom = prodControls[ecUOM]~getText() + prodData~description = prodControls[ecProdDescr]~getText() + select + when prodControls[rbSmall]~checked then prodData~size = "S" + when prodControls[rbMedium]~checked then prodData~size = "M" + otherwise prodData~size = "L" + end + + return prodData + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + AboutDialog v01-00 03Jun12 + ------------- + The "About" class - shows a dialog box that includes a bitmap - part of the + ProductView component. + + Changes: + v01-00 03Jun12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS AboutDialog SUBCLASS ResDialog + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method initDialog + expose font image + resImage = .ResourceImage~new(self) -- Create an instance of a resource image + image = resImage~getImage(IDB_PROD_ICON) -- Create an image from the Product bitmap + stImage = self~newStatic(IDC_PRODABT_ICON_PLACE)~setImage(image) -- Create a static text control and set the image in it + font = self~createFontEx("Ariel", 12) -- Create up a largish font with which to display text and ... + self~newStatic(IDC_PRODABT_STATIC2)~setFont(font) -- ... set the static text to use that font. + -- Provide for a double-click in Product icon: + self~connectStaticNotify("IDC_PRODABT_ICON_PLACE", "DBLCLK", showMsgBox) + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method showMsgBox + say "AboutDialog-showMsgBox-01." + ans = MessageDialog(.HRS~aboutDblClick) + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method leaving + expose font image + self~deleteFont(font) + image~release() + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRS) v01-00 03Jun12 + -------- + The HRS class provides constant character strings for user-visible messages. + + Changes: + v01-00 03Jun12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRS PRIVATE -- Human-Readable Strings + ::CONSTANT aboutDblClick "You double-clicked!" + ::CONSTANT badRatio "The new price/UOM ratio cannot be changed more than 50% up or down." + ::CONSTANT closeInUpdate "Any changes made will be lost. Exit anyway?" + ::CONSTANT descrTooBig "The Product Description is too long." + ::CONSTANT nilSaved "Nothing was changed! Data not saved." + ::CONSTANT notSaved "Changes Not Saved!" + ::CONSTANT prodNameTooBig "The Product Name is too long." + ::CONSTANT saved "Changes saved." + ::CONSTANT uomTooBig "The new UOM is too large." + ::CONSTANT uomTooSmall "The new UOM is too small." + ::CONSTANT updateIP "Update in process" + ::CONSTANT updateProd "Update Product" + ::CONSTANT printMsg "The 'Print...' menu item is not yet implemented." + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise05/Startup.rex b/modules/windows/oodialog/userGuide/exercises/Exercise05/Startup.rex new file mode 100755 index 0000000..a5015d6 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise05/Startup.rex @@ -0,0 +1,57 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 05: The Product component v01-00 03Jun12 + + Startup.rex - the starter" for the Product component. + + Changes: + v01-00 03Jun12: Firect version. + +------------------------------------------------------------------------------*/ + +.local~my.idProductData = .ProductData~newInstance -- create a ProductData instance +.local~my.idProductModel = .ProductModel~newInstance -- create a ProductModel instance +.local~my.idProductData~activate +.local~my.idProductModel~activate + +.ProductView~newInstance + +::requires "ProductView.rex" +::requires "ProductModelData.rex" + +/******************************************************************************/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise05/Support/NumberOnlyEditEx.cls b/modules/windows/oodialog/userGuide/exercises/Exercise05/Support/NumberOnlyEditEx.cls new file mode 100644 index 0000000..9613851 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise05/Support/NumberOnlyEditEx.cls @@ -0,0 +1,526 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * The NumberOnlyEditEx class extends the .Edit class to provide an edit + * control which restricts entry to decimal only, or signed decimal only, + * numbers. + * + * The NumberOnlyEditEx.cls file is meant to be included in any ooDialog + * program where this extension to the edit control is desired. The programmer + * needs to take 4 steps to gain the functionality of a signed decimal number + * only edit control: + * + * 1.) Require the NumberOnlyEditEx.cls file (this file.) + * + * ::requires 'NumberOnlyEditEx.cls' + * + * 2.) Invoke the initDecimalOnly() method on each edit control object that is + * to be a decimal number only edit control. If initDecimalOnly() is not + * invoked, the behaviour of the edit control is unchanged. + * + * editObject = self~newEdit(IDC_EDIT) + * editObject~initDecimalOnly(decimalPlaces, allowSign) + * + * arguments: + * + * decimalPlaces [optional] The number of decimal places allowed in the + * number. The default is 2. Specifying 0 + * decimal places is acceptable. + * + * allowSign [optional] If a sign character (+ or -) is allowed as the + * leading character of the number. The default + * is .false. Specify .true to allow a sign + * character. + * + * 3.) For each decimal only edit control, the character event must be + * connected to a method in the Rexx dialog object. + * + * editObject = self~newEdit(IDC_EDIT) + * editObject~connectCharEvent(onChar) + * + * 4.) In the connected character event handler, the message and its arguments + * must be forwarded on to the onChar() method of the edit control. The + * 6th argument to the event handler is the dialog control object where the + * character event occurred. That is the object the event must be forwared + * to. + * + * When the programmer connects the character event to a method named + * onChar, the event handler is simple: + * + * ::method onChar unguarded + * forward to (arg(6)) + * + * If the programmer chooses a different method name for the event handler, + * then he must be sure to forward to the onChar() method of the edit + * control: + * + * ::method myOwnMethodName unguarded + * forward message 'onChar' to (arg(6)) + * + * And of course there is no reason why the event handler can not be coded + * using the explicit arguments: + * + * ::method myOwnMethodName unguarded + * use arg char, isShift, isCtrl, isAlt, misc, control + * forward message 'onChar' to (control) + */ + + -- Extend the .Edit control by inheriting the .NumberOnlyEditEx mixin class. + + .Edit~inherit(.NumberOnlyEditEx, .EditControl) + +::requires 'ooDialog.cls' +::requires 'winsystm.cls' + +::class 'NumberOnlyEditEx' public mixinclass object + +-- Users of the signed decimal number only edit control must invoke +-- initDecimalOnly() first to assign decimal places and specify if the sign +-- character is allowed. Until this is done, there is no change to the +-- behaviour of the Edit control object. +::method initDecimalOnly + expose decimalPlaces signOk initialized clipBoard + use strict arg decimalPlaces = 2, plusMinus = .false + + if plusMinus~isA(.String), plusMinus~datatype('O') then signOk = plusMinus + else signOk = .false + + initialized = .true + clipBoard = .WindowsClipboard~new + +-- The onChar() method should be inovked at every character event. Returning +-- true allows the character, returning false disallows the character. When a +-- character is not allowed, an edit ballon is set with a message explaining to +-- the user why the character is not appearing when they type. +::method onChar unguarded + expose decimalPlaces initialized signOk + use arg char, isShift, isCtrl, isAlt, misc, control + + if \ var('initialized') then return .true + + if misc~pos("extended") <> 0, self~isExtendedKey(char) then return .true + + if char == 8 then return .true + if signOk, (char == 43 | char == 45) then return self~checkSign + if char == 46 then return self~checkDecimal + if char >= 48, char <= 57 then return self~checkDigit + + if isCtrl, \isAlt, \isShift then return self~checkControlKey(char) + + reply .false + self~charBalloon + + +/** checkDigit() + * + * Checks that the digit being typed, at the cursor position, is allowed. + */ +::method checkDigit private unguarded + expose decimalPlaces signOk + + text = self~getText + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + if signOk, cursorPos == 1 then do + c = text~left(1) + + if c == '-' | c == '+' then do + reply .false + self~showBalloon(.MT~NUM_TITLE, .MT~HAS_SIGN, "ERROR") + return + end + return .true + end + + if decimalPos == 0 then return .true + + if cursorPos <= decimalPos then return .true + + if text~length < (decimalPos + decimalPlaces) then return .true + + reply .false + + msg = self~decimalPlacesUsedMsg + self~showBalloon(.MT~NUM_TITLE, msg, "ERROR") + + +/** checkSign() + * + * Checks that the sign character being typed is allowed at the current cursor + * position. Note that this method is only invoked when the sign character is + * allowed. + */ +::method checkSign private unguarded + expose decimalPlaces + + text = self~getText + cursorPos = self~getCaretPos + + if cursorPos == 1 then do + if self~hasSign(text) then do + reply .false + self~showBalloon(.MT~SIGN_TITLE, .MT~HAS_SIGN, "ERROR") + return + end + + return .true + end + + reply .false + + decimalPos = text~pos('.') + if decimalPos <> 0 | decimalPlaces == 0 then msg = .MT~ONLY_NUMBER + else msg = .MT~ONLY_DECIMAL_NUMBER + + self~showBalloon(.MT~SIGN_TITLE, msg, "ERROR") + + +/** checkDecimal() + * + * Checks that the decimal point being typed is allowed at the current cursor + * position. + */ +::method checkDecimal private unguarded + expose decimalPlaces signOk + + text = self~getText + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + if decimalPlaces == 0 then do + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + return + end + + if decimalPos <> 0 then do + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + return + end + + if cursorPos == 1, signOk, self~hasSign(text) then do + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + return + end + + if text~length < cursorPos + decimalPlaces then return .true + + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + + +/** checkControlKey() + * + * Invoked for a control key combination (Ctrl-?). Anything other than Ctrl-V + * is automatically allowed. Ctrl-V is of course the paste operation. For + * Ctrl-V, we check that the result after pasting the text would be a valid + * signed decimal number, under the constraints for this object. If not, it + * is disallowed and a ballon set. + */ +::method checkControlKey private unguarded + expose clipBoard decimalPlaces + use strict arg char + + if char \== 22 then return .true -- Not Ctrl-V + + -- If there is no text data available we don't care, pasting it will not do + -- any harm. + if \ clipBoard~isDataAvailable then return .true + + pastedText = clipBoard~paste + + -- We have text to paste, need to check is the text acceptable, + -- and is it acceptable for where it will be placed. + text = self~getText + len = text~length + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + -- isValidDecimal() checks that the resulting text after inserting the pasted + -- text is valid. + if \ self~isValidDecimal(pastedText, text, cursorPos) then do + reply .false + self~pasteBalloon(pastedText, text, cursorPos) + return + end + + return .true + + +/** decimalPointBalloon() + * + * This method produces the proper balloon message text when a decimal point has + * been typed, but is not allowed at the current position. + */ +::method decimalPointBalloon private unguarded + expose decimalPlaces signOk + use strict arg decimalPos, cursorPos, text + + select + when cursorPos == 1 then do + if self~hasSign(text) then msg = .MT~HAS_SIGN + else if decimalPlaces == 0, signOk then msg = .MT~ONLY_WHOLE_SIGNED_NUMBER + else if signOk then msg = .MT~ONLY_SIGNED_NUMBER + else msg = .MT~ONLY_NUMBER + end + when decimalPlaces == 0 then do + msg = .MT~ONLY_WHOLE_NUMBER + end + when cursorPos <= decimalPos then do + msg = .MT~ONLY_NUMBER + end + when (decimalPos + decimalPlaces) > text~length then do + msg = .MT~ONLY_NUMBER + end + otherwise do + msg = self~decimalPlacesUsedMsg + end + end + -- End select + + self~showBalloon(.MT~DEC_TITLE, msg, "ERROR") + + +/** charBalloon() + * + * This method produces the proper balloon message when a character is typed. + */ +::method charBalloon private unguarded + expose decimalPlaces signOk + + text = self~getText + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + msg = .MT~ONLY_NUMBER + + select + when cursorPos == 1 then do + if self~hasSign(text) then msg = .MT~HAS_SIGN + else if decimalPlaces == 0, signOk then msg = .MT~ONLY_WHOLE_SIGNED_NUMBER + else if decimalPlaces == 0, \signOk then msg = .MT~ONLY_WHOLE_NUMBER + else if decimalPos == 0, signOk then msg = .MT~ONLY_SIGNED_DECIMAL_NUMBER + else if decimalPos == 0, \signOk then msg = .MT~ONLY_DECIMAL_NUMBER + else if signOk then msg = .MT~ONLY_SIGNED_NUMBER + else msg = .MT~ONLY_NUMBER + end + when decimalPlaces == 0 then do + msg = .MT~ONLY_WHOLE_NUMBER + end + when decimalPos == 0 then do + msg = .MT~ONLY_DECIMAL_NUMBER + end + when cursorPos <= decimalPos then do + msg = .MT~ONLY_NUMBER + end + when (decimalPos + decimalPlaces) > text~length then do + msg = .MT~ONLY_NUMBER + end + otherwise do + msg = self~decimalPlacesUsedMsg + end + end + -- End select + + self~showBalloon(.MT~CHAR_TITLE, msg, "ERROR") + + +/** pasteBalloon() + * + * This method produces the proper balloon message when text is pasted into the + * edit control that is not allowed. + */ +::method pasteBalloon private unguarded + expose decimalPlaces signOk + use strict arg pastedText, text, cursorPos + + if signOk then do + if decimalPlaces == 0 then msg = .MT~ONLY_PASTE_WHOLE_SIGNED + else msg = .MT~ONLY_PASTE_A_SIGNED decimalPlaces .MT~ONLY_PASTE_B + end + else do + if decimalPlaces == 0 then msg = .MT~ONLY_PASTE_WHOLE + else msg = .MT~ONLY_PASTE_A decimalPlaces .MT~ONLY_PASTE_B + end + + resultText = text~substr(1, cursorPos - 1) || pastedText || text~substr(cursorPos) + + -- Balloon text has to be less than 1023 characters. If we don't exceed that + -- length, we will show the incorrect text to the user. Otherwise we just + -- show the short message. Note that new line characters can be used to + -- format the balloon text. + len = msg~length + resultText~length + .MT~PASTED_A~length + .MT~PASTED_B~length + 8 + + if len < 1023 then do + msg ||= .endOfLine~copies(2) || .MT~PASTED_A || - + .endOfLine~copies(2) || '"'resultText'"' || - + .endOfLine~copies(2) || .MT~PASTED_B + end + + self~showBalloon(.MT~PASTE_TITLE, msg, "ERROR") + + +/** decimalPlacesUsedMsg() + * + * Convenience method to return the proper message for the situation where the + * allowable number of decimal places have been filled. + */ +::method decimalPlacesUsedMsg private unguarded + expose decimalPlaces + + if decimalPlaces == 1 then return .MT~ONLY_1_DECIMAL + else return .MT~ONLY_DECIMALS_A decimalPlaces .MT~ONLY_DECIMALS_B + + +/** isValidDecimal() + * + * Checks that the resulting text after the pasted text is inserted into text at + * the current position, results in a valid number using the current + * restrictions. Decimal places and sign allowed or not. + */ +::method isValidDecimal private unguarded + expose decimalPlaces signOk + use strict arg pasteText, text, cursorPos + + resultText = text~substr(1, cursorPos - 1) || pasteText || text~substr(cursorPos) + + -- Can't have any type of space character, tab, new line, etc.. + if resultText \== resultText~space(0) then return .false + + -- Eliminate obvious problems with decimals. + countDots = resultText~countStr(".") + if countDots > 1 then return .false + if decimalPlaces == 0, countDots > 0 then return .false + + -- Eliminate any problems with the sign character. + if signOk then do + if resultText~pos('-') > 1 | resultText~pos('+') > 1 then return .false + end + else do + if resultText~pos('-') <> 0 | resultText~pos('+') <> 0 then return .false + end + + + decimalPos = resultText~pos('.') + if decimalPos > 0 then do + if resultText~length - decimalPos > decimalPlaces then return .false + + -- Remove the decimal char so we can test for all digits. + resultText = resultText~changeStr('.', '') + end + + -- Remove the sign character if it exists. + if self~hasSign(resultText) then resultText = resultText~substr(2) + + -- Exponential notation can not be allowed. + if resultText~caselessPos('E') <> 0 then return .false + + if \ resultText~datatype('W') then return .false + + return .true + + +/** isExtendedKey + * + * Convenience method to test if the character, char, is an extended key we want + * to pass on to the edit control + */ +::method isExtendedKey private + use strict arg char + + if char >= 33, char <= 40 then return .true + if char == 45 | char == 46 | char == 8 then return .true + return .false + + +/** hasSign + * + * Convenience method to test if a text string starts with a sign (+ or -) + * character. + */ +::method hasSign private + use strict arg text + + c = text~left(1) + if c == '-' | c == '+' then return .true + return .false + + +/** getCaretPos() + * + * Returns the current caret (cursor) position of this edit control. + */ +::method getCaretPos private + return self~selection~startChar + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Class: MT + + This class is used to provide constant character strings. The strings are + used for the balloon messages put up by the NumberOnlyEditEx mixin class. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'MT' private +::constant CHAR_TITLE "Unacceptable Character" +::constant DEC_TITLE "Unacceptable Decimal Point" +::constant NUM_TITLE "Unacceptable Number" +::constant SIGN_TITLE "Unacceptable Sign Character" +::constant PASTE_TITLE "Unacceptable Pasted Text" + +::constant ONLY_NUMBER "You can only type a number here." +::constant ONLY_SIGNED_NUMBER "You can only type a number or the sign here." +::constant ONLY_DECIMAL_NUMBER "You can only type a number or the decimal point here." +::constant ONLY_SIGNED_DECIMAL_NUMBER "You can only type a number, the sign, or the decimal point here." +::constant ONLY_WHOLE_NUMBER "You can only type a number here. Only whole numbers are allowed." +::constant ONLY_WHOLE_SIGNED_NUMBER "You can only type a number or the sign here. Only whole numbers are allowed." + +::constant HAS_SIGN "You can not type here. The sign character is already in place." +::constant ONLY_1_DECIMAL "You can not type here. Only 1 decimal place is allowed." +::constant ONLY_DECIMALS_A "You can not type here. Only" +::constant ONLY_DECIMALS_B "decimal places are allowed." + +::constant ONLY_PASTE_WHOLE "You can only paste text here that produces a whole number." +::constant ONLY_PASTE_WHOLE_SIGNED "You can only paste text here that produces a signed whole number." +::constant ONLY_PASTE_A_SIGNED "You can only paste text here that produces a signed decimal number with" +::constant ONLY_PASTE_A "You can only paste text here that produces a decimal number with" +::constant ONLY_PASTE_B "or less decimal places." +::constant PASTED_A "Resulting text of:" +::constant PASTED_B "is not valid." diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise05/res/ProductIcon.bmp b/modules/windows/oodialog/userGuide/exercises/Exercise05/res/ProductIcon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..13ca9acc4179b04c02b504064d5b3f0218fe66f8 GIT binary patch literal 268234 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 NNPq-NNI<+V{0~hZ)gJ%= literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise05/res/ProductView.dll b/modules/windows/oodialog/userGuide/exercises/Exercise05/res/ProductView.dll new file mode 100644 index 0000000000000000000000000000000000000000..cb2b24ee20f4e3612ac3f444b72a213622fe7817 GIT binary patch literal 271360 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 2>&1 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerListView.h b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerListView.h new file mode 100644 index 0000000..62b5eb4 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerListView.h @@ -0,0 +1,48 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDI_CUSTLIST_DLGICON 103 +#define IDD_CUSTLIST_DIALOG 104 +#define IDR_CUSTLIST_MENU 105 +#define IDC_CUSTLIST_LIST 1001 +#define IDM_CUSTLIST_NEWCUST 40000 +#define IDC_CUSTLIST_SHOWCUST 40001 +#define IDM_CUSTLIST_ABOUT 40002 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerListView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerListView.rc new file mode 100644 index 0000000..073d8f2 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerListView.rc @@ -0,0 +1,73 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include +#include +#include +#include "CustomerListView.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_CUSTLIST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Customer...", IDM_CUSTLIST_NEWCUST + } + POPUP "Help" + { + MENUITEM "About...", IDM_CUSTLIST_ABOUT + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_CUSTLIST_DIALOG DIALOG 0, 0, 225, 273 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Customer List" +FONT 8, "Ms Shell Dlg" +{ + PUSHBUTTON "Cancel", IDCANCEL, 150, 235, 50, 14 + CONTROL "", IDC_CUSTLIST_LIST, WC_LISTVIEW, WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SORTASCENDING | LVS_NOSORTHEADER , 15, 10, 190, 215 + DEFPUSHBUTTON "Show Customer", IDC_CUSTLIST_SHOWCUST, 89, 235, 54, 14, WS_DISABLED +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_CUSTLIST_DLGICON ICON ".\\customer\\bmp\\CustList.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerListView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerListView.rex new file mode 100755 index 0000000..a776f31 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerListView.rex @@ -0,0 +1,250 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 06: The Customer ListView v01-00 06Jun12 + + Contains: classes "CustomerListView" and "HRSclv". + + Pre-requisite: CustomerListView.rc, CustomerListView.h, CustList.ico + + Description: Provides a list of Customers and supports viewing any given + Customer via a double-click on that Customer's item in the list. + This is an "Intermediate" component - it is invoked by OrderMgmt, + and invokes CustomerView. + + v01-00 06Jun12: First Version. + + Outstanding Problems: None reported. +*******************************************************************************/ + + +.Application~addToConstDir("Customer\CustomerListView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "customer\customerview.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerListView v01-04 19Feb12 + ---------------- + The view of a list of Customers. + Changes: + v01-01: First version + v01-02: Corrected for standalone invocation. + v01-03 28Jan12: Changed name of HRS class to HRSplv. + v01-04 11Feb12: moved .application~setDefaults() to app startup file. + changed to .application~addToConstDir() here. + v01-05 19Feb12: Moved .Application~addToConstDir statement from newInstance + method to top of file - just before ::requires statement(s). + v01-06 29Mar12: Very minor mods - all just minor clean-ups. All comments removed + + + [interface (idl format)] <> + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerListView SUBCLASS RcDialog PUBLIC + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use arg rootDlg + dlg = self~new("Customer\CustomerListView.rc", "IDD_CUSTLIST_DIALOG") + dlg~activate(rootDlg) -- Must be the last statement. + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + forward class (super) continue + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + menuBar = .ScriptMenuBar~new("Customer\CustomerListView.rc", "IDR_CUSTLIST_MENU", , , .true) + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose rootDlg + use arg rootDlg + if rootDlg = "SA" then do -- If standalone operation required + rootDlg = self -- To pass on to children + self~execute("SHOWTOP","IDI_CUSTLIST_DLGICON") + end + else self~popupAsChild(rootDlg, "SHOWTOP", ,"IDI_CUSTLIST_DLGICON") + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar lvCustomers btnShowCustomer + -- Called by ooDialog after SHOWTOP. + + menuBar~attachTo(self) + + lvCustomers = self~newListView("IDC_CUSTLIST_LIST"); + lvCustomers~addExtendedStyle("GRIDLINES FULLROWSELECT") + lvCustomers~insertColumnPX(0,"Number",60,"LEFT") + lvCustomers~insertColumnPX(1,"Name",220,"LEFT") + lvCustomers~insertColumnPX(2,"Zip",80,"LEFT") + self~connectListViewEvent("IDC_CUSTLIST_LIST","CLICK",itemSelected) -- Single click + self~connectButtonEvent("IDC_CUSTLIST_SHOWCUST","CLICKED",showCustomer) + self~connectListViewEvent("IDC_CUSTLIST_LIST","ACTIVATE",openItem) -- Double-click + + self~loadList + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newCustomer UNGUARDED + self~noMenuFunction(.HRSclv~newCust) + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSclv~helpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSclv~noMenu, self~hwnd, title, 'WARNING') + + + /*---------------------------------------------------------------------------- + Event Handling Methods - List Items + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD itemSelected UNGUARDED + use arg id, itemIndex, columnIndex, keyState + /* This method is fired when the user clicks on a row in the ListView. + If the user clicks on an empty row, then itemIndex is set to -1, else + the itemIndex is set to the 0-based row number. + If the user double-clicks on a row, this method is fired in response + to the first click but not to the second. If the row is empty, the second + click of the double-click is ignored, else the double-click method is + fired. + */ + if itemIndex > -1 then self~enableControl("IDC_CUSTLIST_SHOWCUST") + else self~disableControl("IDC_CUSTLIST_SHOWCUST") + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD openItem UNGUARDED + -- User double-clicked on an item in the ListView. + -- Note: does not get fired if double-click was on an empty row. + self~showCustomer + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showCustomer UNGUARDED + expose lvCustomers rootDlg + item = lvCustomers~selected + if item = -1 then do -- if no item selected. + ret = MessageDialog(.HRSclv~nilSelected, self~hwnd, title, 'WARNING') + return + end + info=.Directory~new + if lvCustomers~getItemInfo(item, info) then do + say "CustomerListView-showCustomer-02: info~text =" info~text + .local~my.idCustomerData = .CustomerData~new -- create Customer Data instance + .local~my.idCustomerModel = .CustomerModel~new -- create Customer Model instance + .local~my.idCustomerData~activate + .local~my.idCustomerModel~activate + .CustomerView~newInstance(rootDlg,"CU003") + self~disableControl("IDC_CUSTLIST_SHOWCUST") + end + else do + say "CustomerListView-showCustomer-04: ~getItemInfo returned .false." + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD loadList + expose lvCustomers + lvCustomers~addRow( , ,"CU001", "ABC Inc.", "TX 20152") + lvCustomers~addRow( , ,"CU002", "Frith Inc.", "CA 30543") + lvCustomers~addRow( , ,"CU003", "LMN & Co", "NY 47290-1201") + lvCustomers~addRow( , ,"CU005", "EJ Smith", "NJ 12345") + lvCustomers~addRow( , ,"CU010", "Red-On Inc.","AZ 12345") + lvCustomers~addRow( , ,"AB15784", "Joe Bloggs & Co Ltd","LB7 4EJ") + /*do i = 1 to 50 + lvCustomers~addRow(i, , "Line" i, i) + end*/ + lvCustomers~setColumnWidth(1) -- set width of 2nd column to longest text entry. + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + HRSclv (Human-Readable Strings for CustomerListView) v01-00 06Jun12 + --- + The HRSclv class provides constant character strings for user-visible messages + issued by the CustomerListView class. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSclv PRIVATE -- Human-Readable Strings + ::CONSTANT noMenu "This menu item is not yet implemented." + ::CONSTANT newCust "New Customer" + ::CONSTANT helpAbout "Help - About" + ::CONSTANT nilSelected "Please select an item first." + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerModelData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerModelData.rex new file mode 100755 index 0000000..c4a3fd3 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerModelData.rex @@ -0,0 +1,142 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 04&06: The CustomerModel and CustomerData Classes v01-00 07Jun12 + + Contains: classes "CustomerModel" and "CustomerResource". + Pre-requisites: None. + + Outstanding Problems: + None. + + Changes: + v01-00 07Jun12: First version. +------------------------------------------------------------------------------*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerModel v01-00 07Jun12 + ------------ + The "model" part of the Customer component. + + Changes: + v01-00 07Jun12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerModel PUBLIC + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + -- Creates an instance and returns it. + aCustomerModel = self~new + return aCustomerModel + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD activate PUBLIC + -- Gets its data from ProductData. + expose idCustomerData + idCustomerData = .local~my.idCustomerData + + + ::METHOD query PUBLIC + -- Returns data requested (no argument = return all) + expose idCustomerData + say "CustomerModel-query-01." + data = idCustomerData~getData + return data +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerData v01-00 07Jun12 + ------------ + The "data" part of the Customer component. + Changes: + v01-00 07Jun12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerData PUBLIC + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + aCustomerData = self~new + return aCustomerData + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate PUBLIC + expose custData + custData = .directory~new + custData[custNo] = "AB15784" + custData[custName] = "Joe Bloggs & Co Ltd" + arrCustAddr = .array~new + arrCustAddr[1] = "28 Frith Street" + arrCustAddr[2] = "Hardington" + arrCustAddr[3] = "Blockshire" + custData[CustAddr] = arrCustAddr + custData[custZip] = "LB7 4EJ" + custData[custDiscount]= "B1" + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getData PUBLIC + expose custData + say "CustomerData-getData-01." + return custData + +/*============================================================================*/ + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerView.h b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerView.h new file mode 100644 index 0000000..26d87d2 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerView.h @@ -0,0 +1,63 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_CUST_DIALOG 102 +#define IDR_CUST_MENU 103 +#define IDI_CUST_DLGICON 105 +#define IDC_CUST_LBL_CUSTNO 1001 +#define IDC_CUST_LBL_DISCOUNT 1002 +#define IDC_CUST_BTN_SHOWLASTORDER 1003 +#define IDM_CUST_NEW 40000 +#define IDM_CUST_UPDATE 40001 +#define IDM_CUST_PRINT 40002 +#define IDM_CUST_LAST_ORDER 40003 +#define IDC_CUST_EDT_CUSTNO 40043 +#define IDC_CUST_EDT_CUSTNAME 40044 +#define IDC_CUST_BTN_RECORDCHANGES 40069 +#define IDC_CUST_LBL_CUSTNAME 40070 +#define IDC_CUST_LBL_CUSTADDR 40071 +#define IDC_CUST_LBL_ZIP 40072 +#define IDC_CUST_LBL_LASTORDER 40073 +#define IDC_CUST_STC_LASTORDERDETAILS 40077 +#define IDC_CUST_EDT_CUSTADDR 40078 +#define IDC_CUST_EDT_DISCOUNT 40079 +#define IDC_CUST_EDT_CUSTZIP 40080 +#define IDC_CUST_STC_ERRORMSG 40081 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerView.rc new file mode 100644 index 0000000..cab2d63 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerView.rc @@ -0,0 +1,85 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "customerview.h" + + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_CUST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Customer...", IDM_CUST_NEW + MENUITEM "&Update...", IDM_CUST_UPDATE + MENUITEM "Print...", IDM_CUST_PRINT + MENUITEM "Last Order", IDM_CUST_LAST_ORDER + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_CUST_DIALOG DIALOG 0, 0, 275, 239 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "*CustomerName*" +FONT 8, "Microsoft Sans Serif" +{ + LTEXT "Name:", IDC_CUST_LBL_CUSTNAME, 18, 47, 22, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTNO, 85, 20, 65, 15, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Customer Number:", IDC_CUST_LBL_CUSTNO, 18, 22, 59, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTNAME, 85, 45, 165, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Address:", IDC_CUST_LBL_CUSTADDR, 18, 72, 28, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTADDR, 85, 70, 167, 40, ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY + LTEXT "Zip Code:", IDC_CUST_LBL_ZIP, 20, 120, 32, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTZIP, 85, 120, 65, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Last Order:", IDC_CUST_LBL_LASTORDER, 18, 177, 36, 8, SS_LEFT + LTEXT " ", IDC_CUST_STC_LASTORDERDETAILS, 88, 177, 145, 8, SS_LEFT + LTEXT "Discount Code:", IDC_CUST_LBL_DISCOUNT, 18, 149, 50, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_DISCOUNT, 85, 145, 20, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT " ", IDC_CUST_STC_ERRORMSG, 18, 215, 8, 8, SS_LEFT + DEFPUSHBUTTON "Record Changes", IDC_CUST_BTN_RECORDCHANGES, 130, 195, 58, 14, WS_DISABLED + PUSHBUTTON "Show Last Order", IDC_CUST_BTN_SHOWLASTORDER, 195, 195, 58, 14 +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_CUST_DLGICON ICON ".\\customer\\bmp\\Customer.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerView.rex new file mode 100755 index 0000000..b6fc6f5 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/CustomerView.rex @@ -0,0 +1,366 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 06: The CustomerView component v01-01 07Jun12 + + Contains: class "CustomerView"; routine "startCustomerView". + Pre-requisites: CustomerView.rc, CustomerView.h. + + Description: A sample Customer View component - part of the sample + Order Management application. This is a "leaf" component - + it does not invoke other components. + + Changes: + v01-00 01Jun12: First version (Exercise04). + v01-01 07Jun12: Minor changes for Exercise06. + +------------------------------------------------------------------------------*/ + + +.Application~addToConstDir("Customer\CustomerView.h") + + +::requires "ooDialog.cls" +::requires "CustomerModelData.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerView v02-05 19Feb12 + ------------- + The "view" (or "gui") part of the Customer component - part of the sample + Order Management application. + Changes: + v00-02: Prevented close on enter key by providing no-op "ok" method. + Changed tab order on window by changing sequence of controls in .rc file + v00-03: Changed symbolic IDs to conform with naming convention + Added initAutoDetection method because deleted dlgData. from + dlg~new statement in starter.rex. + v00-04: Took out the OK method - include that in Exercise05. + v00-05: Modified to use CustomerData and CustomerModel classes. + Mods after Exercise04: + v02-00: Added "newInstance" class method - removed routine "StartCustomerView". + v02-01 19Sep11: Corrected for stand-alone invocation. + v02-02 04Oct11: Added msgbox for unimplemented menu item. + v02-03 28Jan12: Changed class name HRS to HRSclv to allow for multiple + HRS classes in same file at some future time. + v02-04 11Feb12: moved .application~setDefaults() to app startup file. + changed to .application~addToConstDir() here. + v02-05 19Feb12: Moved .Application~addToConstDir statement from newInstance + method to top of file - just before ::requires statement(s). + + + [interface (idl format)] + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerView SUBCLASS RcDialog PUBLIC + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC UNGUARDED + expose hasParent + -- ADDED FOR EXERCISE06. Statements in the old "StartCustomerView" Routine + -- have been moved here. The ~activate statement has also changed. + use arg rootDlg, customerNo + --say ".CustomerView-newInstance-01: Start." + -- Create an instance of CustomerView and show it: + dlg = .CustomerView~new("Customer\CustomerView.rc", "IDD_CUST_DIALOG") + --say ".CustomerView-newInstance-02: root =" rootDlg + dlg~activate(rootDlg, customerNo) + + + /*---------------------------------------------------------------------------- + Dialog Creation Methods: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Init - creates the dialog instance but does not make it visible. --*/ + ::METHOD init + expose menuBar + --say "CustomerView-init-01." + + forward class (super) continue + + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Create Menu Bar - Creates the menu bar on the dialog. --*/ + ::METHOD createMenuBar + expose menuBar + --say "CustomerView-createMenuBar-01." + menuBar = .ScriptMenuBar~new("Customer\CustomerView.rc", "IDR_CUST_MENU", , , .true) + return .true + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Activate - Shows the Dialog - i.e. makes it visible to the user. --*/ + ::METHOD activate unguarded + use arg rootDlg, customerNo -- ADDED FOR EXERCISE06. + --say "CustomerView-activate-01." + if rootDlg = "SA" then self~execute("SHOWTOP","IDI_CUST_DLGICON") --ADDED FOR EXERCISE06. + else self~popUpAsChild(rootDlg,"SHOWTOP",,"IDI_CUST_DLGICON") --ADDED FOR EXERCISE06. + return + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + InitDialog - Called by ooDialog -- */ + ::METHOD initDialog + expose menuBar custControls + --say "CustomerView-initDialog-01." + menuBar~attachTo(self) + -- Create objects that map to the edit controls defined by the "customer.rc" + -- so they can be programmatically used elsewhere in the class: + custControls = .Directory~new + custControls[ecCustNo] = self~newEdit("IDC_CUST_EDT_CUSTNO") + custControls[ecCustName] = self~newEdit("IDC_CUST_EDT_CUSTNAME") + custControls[ecCustAddr] = self~newEdit("IDC_CUST_EDT_CUSTADDR") + custControls[ecCustZip] = self~newEdit("IDC_CUST_EDT_CUSTZIP") + custControls[ecCustDiscount] = self~newEdit("IDC_CUST_EDT_DISCOUNT") + custControls[stLastOrder] = self~newStatic("IDC_CUST_STC_LASTORDERDETAILS") + -- Create an object for the "Record Change" pushbutton in order to be able + -- to change its focus later: + custControls[btnRecordChanges] = self~newPushButton("IDC_CUST_BTN_RECORDCHANGES") + -- Define event handler methods for push-buttons: + self~connectButtonEvent("IDC_CUST_BTN_RECORDCHANGES","CLICKED",recordChanges) + self~connectButtonEvent("IDC_CUST_BTN_SHOWLASTORDER","CLICKED",showLastOrder) + + self~setTitle(.HRScv~dlgTitle) -- set dialog title. + + -- Get app data and then show it: + self~getData + self~showData + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + MenuBar Methods: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + New Customer... Not fully implemented - merely tells user to use the + Customer List object. --*/ + ::METHOD newCustomer unguarded + answer = MessageDialog(.HRScv~useList, self~hwnd,.HRScv~useListCap,"INFORMATION") + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Update - Sets fields to edit mode so that user can change the data. + Business Rule: Customer Number cannot be changed. --*/ + ::METHOD update unguarded + expose custControls + say "CustomerView-Update-01" + custControls[ecCustName]~setReadOnly(.false) + custControls[ecCustAddr]~setReadOnly(.false) + custControls[ecCustZip]~setReadOnly(.false) + custControls[ecCustDiscount]~setReadOnly(.false) + self~enableControl("IDC_CUST_BTN_RECORDCHANGES") + custControls[btnRecordChanges]~state = "FOCUS" -- Put focus on the button + self~focusControl("IDC_CUST_EDT_CUSTNAME") -- place cursor in the CustName edit control. + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Last Order - Displays info about the last order placed by this customer.--*/ + ::METHOD lastOrder unguarded + expose custControls + use arg button + orderDate="31/12/11"; orderNum = "ZZ999"; orderTotal = "$999.99" + lastOrder = orderDate " " orderNum " " orderTotal + custControls[stLastOrder]~setText(lastOrder) + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Print - Not implemented yet --*/ + ::METHOD print unguarded + msg = "The 'Print...' menu item is not yet implemented." + ret = MessageDialog(.HRScv~noPrint, self~hwnd, .HRScv~noPrintCap, 'WARNING') + + + /*---------------------------------------------------------------------------- + PushButton Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Record Changes - Collects new data, checks if there has indeed been a + change, and if not, issues a warning msg and disables + the button. --*/ + ::METHOD recordChanges unguarded + expose custControls custData newCustData + --say "CustomerView-recordChanges-01" + + newCustData = .directory~new + newCustData[custName] = custControls[ecCustName]~getLine(1) + newCustData[custAddr] = .array~new + do i=1 to custControls[ecCustAddr]~lines + newCustData[custAddr][i] = custControls[ecCustAddr]~getLine(i) + end + newCustData[custZip] = custControls[ecCustZip]~getLine(1) + newCustData[custDiscount] = custControls[ecCustDiscount]~getLine(1) + + -- Check if anything's changed: + result = self~checkForChanges + if result then say "CustomerView-recordChanges-01: There were changes!" + else say "CustomerView-recordChanges-02: No Changes Found" + + /* Send new data to be checked by CustomerModel (not implemented). */ + + /* Disable controls that were enabled by menu "File-Update" selection: */ + custControls[ecCustName]~setReadOnly(.true) + custControls[ecCustAddr]~setReadOnly(.true) + custControls[ecCustZip]~setReadOnly(.true) + custControls[ecCustDiscount]~setReadOnly(.true) + self~disableControl("IDC_CUST_BTN_RECORDCHANGES") + + + /*---------------------------------------------------------------------------- + Show Last Order - displays mock sales order info in the Last_Order_Details + field; info is hard-coded in this method. --*/ + ::METHOD showLastOrder unguarded + expose CustControls + -- Notionally get last order from "SalesOrder" component. + orderDate="12/2/11"; orderNum = "AB123"; orderTotal = "$524.58" + lastOrder = orderDate " " orderNum " " orderTotal + custControls[stLastOrder]~setText(lastOrder) + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Get Data - gets data from the CustomerModel component and displays it in the + appropriate controls. --*/ + ::METHOD getData + expose custData + --say "CustomerView-getData-01." + idCustomerModel = .local~my.idCustomerModel + custData = idCustomerModel~query + + /*---------------------------------------------------------------------------- + showData - displays data in the dialog's controls. */ + ::METHOD showData + expose custData custControls + --say "CustomerView-showData-01." + -- Show CustNo and CustName: + custControls[ecCustNo]~setText(custData[custNo]) + custControls[ecCustName]~setText(custData[custName]) + -- Re-format Cust Address from an array into a string with line-ends + -- after each array element except the last, then show it. + arrCustAddr = custData[CustAddr] + strCustAddr = "" + do i=1 to arrCustAddr~items + if i < arrCustAddr~items then do + strCustAddr = strCustAddr||arrCustAddr[i] || .endofline + end + else do + strCustAddr = strCustAddr || arrCustAddr[i] + end + end + custControls[ecCustAddr]~setText(strCustAddr) + -- Finally, show Zip and Discount: + custControls[ecCustZip]~setText(custData[custZip]) + custControls[ecCustDiscount]~setText(custData[custDiscount]) + --custControls[stLastOrder]~setText("Press Me") + + + /*-------------------------------------------------------------------------- + checkForChanges - after "Record Changes" actioned by the user, check whether + any data has actually changed. If it has: (a) assign new data to old data; + (b) return .true. If it hasn't: return .false. + Note: cannot just compare the two directories since data format in Address + is different. --*/ + ::METHOD checkForChanges + expose custData newCustData + changed = .false + if newCustData[custName] \= custData[custName] then do + custData[custName] = newCustData[custName] + changed = .true + end + if custData[CustAddr]~items \= newCustData[CustAddr]~items then changed = .true + else + do i=1 to custData[custAddr]~items + if custData[custAddr][i] \= newCustData[custAddr][i] then do + changed = .true + leave + end + end + if newCustData[custZip] \= custData[custZip] then do + custdata[custZip] = newCustData[custZip] + changed = .true + end + if newCustData[custDiscount] \= custData[custDiscount] then do + custData[custDiscount] = newCustData[custDiscount] + changed = .true + end + -- If no changes after all, display message box: + if \changed then do + msg = .HRScv~nilChanged + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRScv~nilChangedCap,"OK","WARNING","DEFBUTTON2 APPLMODAL") + end + else do + say "CustomerView-checkForChanges-02: changed =" changed + custData = newCustData + end + return changed + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRScv) v02-03 28Jan12 + -------- + This class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRScv PRIVATE -- Human-Readable Strings + ::CONSTANT nilChanged "Nothing was changed! Update not done." + ::CONSTANT nilChangedCap "Update Customer" + ::CONSTANT noPrint "The 'Print...' menu item is not yet implemented." + ::CONSTANT noPrintCap "*Customer Name*" + ::CONSTANT dlgTitle "*Customer*" + ::CONSTANT useList "You must use the Customer List to create a new Customer." + ::CONSTANT useListCap "Create New Customer" +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/StartupCustomer.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/StartupCustomer.rex new file mode 100755 index 0000000..7048805 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/StartupCustomer.rex @@ -0,0 +1,60 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise06: Stand-alone startup for CustomerView + startupCustomer.rex v01-00 07Jun12 + + Contains: Startup code. + Pre-requisites: Must be run from the parent folder of the Customer folder. + + Changes: + v01-00 07Jun12: First Version + + Outstanding Problems: None reported. +*******************************************************************************/ + +.Application~setDefaults("O", , .false) + +.local~my.idCustomerData = .CustomerData~new -- create Customer Data instance +.local~my.idCustomerModel = .CustomerModel~new -- create Customer Model instance +.local~my.idCustomerData~activate +.local~my.idCustomerModel~activate + +.CustomerView~newInstance("SA") + +::REQUIRES "Customer\CustomerView.rex" +::REQUIRES "Customer\CustomerModelData.rex" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/StartupCustomerList.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/StartupCustomerList.rex new file mode 100755 index 0000000..cbfdbd1 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/StartupCustomerList.rex @@ -0,0 +1,57 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise06: Stand-alone startup for CustomerList + startupCustomerList.rex v01-00 07Jun12 + + Contains: Startup code. + Pre-requisites: Must be run from the parent folder of the Customer folder. + + Changes: + v01-00 107Jun12: First Version + + Outstanding Problems: None reported. +*******************************************************************************/ + +.Application~setDefaults("O", , .false) + +.CustomerListView~newInstance("SA") + +::requires "Customer\CustomerListView.rex" + + +/******************************************************************************/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/bmp/CustList.bmp b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/bmp/CustList.bmp new file mode 100644 index 0000000000000000000000000000000000000000..962bee3d71bbf3cfc2d2c720d9aaf2a0cab826b5 GIT binary patch literal 2166 zcmeH`&25A*5QPURhe)|#r2|eWAO)a^YuZ`mxb;v47108DZ{8T3UBJ;^a>;1@gFnBS zXS{rTUY^b4g8mJykJi`|W(e@t7qu3TY>Z`DY|#uOX8dshUElY1b#}#w8Gl@O|FUVC zEd6!B$`(6jHi+2{?}iRBs86ZYmT}Z*sltEY!S3`mURK9ETU_hccwwGf@ASXmadygw zJ$;22cvoNH!b#`sQqmp8`T6>t9C86%7TrT038ZH($&WdOl<}f{qyrmA_FAv-6tZ=s zj`bx+Vx?WjTTZNMS>gZLP-!^kHk((nG|zL^XuCgExIrZuXJMeBQeT2rN1SKlZKA>C zyB^_<^j-k^_0-vkCk_KUJU&qw4DLBXpY!RpDE}>2ZJg5eq-ce{#`%J_{L*KuxDPC# z`7-ODa26#-~|{Wk=os literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/bmp/CustList.ico b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/bmp/CustList.ico new file mode 100644 index 0000000000000000000000000000000000000000..c9d256654be2bff669c25ee04cbaa94be30d3c56 GIT binary patch literal 2686 zcmeH`F?NG65JWfc#Z9Wvq4**p4(enIE_QJWoJ%s#$s<~3{PNK;w)>sEvKxDh7f-PEB?x|ecR ziN4opCE-8tWH8-(zBN2`x2{))D<5L7UQK>IMvpv?c@^fLp;&0ug;2T}u{zU)) literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/bmp/Customer.ico b/modules/windows/oodialog/userGuide/exercises/Exercise06/Customer/bmp/Customer.ico new file mode 100644 index 0000000000000000000000000000000000000000..e6bc7cc2927a80f725f2d30d0696b7e7cd8937d3 GIT binary patch literal 2686 zcmeHHK~4iP3`|8%oVF6;1spgc^#exoV|Ye?UdDEuwUf{l5}d&8W@C?MY-hVI<%AE> zhP9TD$5Nh4DX+K)*A?dJiYT z_k>AbRGN~g1ze+`SG3RtM%<{jX1;jN3<5UZlcLhR&d~4PK!ZE4Zp0G!TMFfpm(MjEL|+&mdh zFiSw7YO#TixC^*E@+LEp{y0aROeA-mx&}u9NMqJ*|Xj4NOpC=x16QlmJt#Le|R@Lv$YhkL6`$qjv zJHi_q4{_$>^dx8}+!d9f-oxb$I9)E%+cAz@H;j$#z^{(_PtFQMS&)8Ek_9B6$1mVg zG}u(X22dLc0qHNe)^H3A1Bjaj8vG@WzjFUfIH^FwV|o8eQeIoWh3mkPo!i$ZnBg=Y j+lhpXR2}fp;RNS|1so-?Uz;{i*VtFl(DeWI51zm$4RLx4 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Extras/Popups/OffsetPopups.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Extras/Popups/OffsetPopups.rex new file mode 100755 index 0000000..c5ce015 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Extras/Popups/OffsetPopups.rex @@ -0,0 +1,286 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* ooDialog User Guide + Samples\Popups + OffsetPopups.rex v01-00 07Jun12 + + The four dialogs in this file illustrate how popups can be tested in + stand-alone mode with a single code base. If a given popup pops up another + dialog, then this is treated as part of the "stand-alone" operation of the + first dialog. + + Associated files: None. + + Invocation: OffsetPopups [runType] [offset] + + "runType" controls which dialog to surface in "standalone" mode as follows: + "p" for parent, "c" for child, or "g" for grandchild, "gg" for + greatgrandchild. Parent is the default (and of course "standalone mode" has + no meaning for the parent dialog, as when run it's always the root dialog. + "offset" is a number that governs the extent to which a descendant dialog + is visually offset from the ancestor that surfaced it. + The default is runtype = Parent and offset = 0. + + Changes: + v01-00 07Jun12: First Version + +------------------------------------------------------------------------------*/ + +parse upper arg runtype offset +progName = "OffsetPopups" +if runtype = "?" then do + say + say "+-----------------------------------------------------------------------+" + say "| Demonstration of Popups, four generations, where any generation |" + say "| can be run 'standalone' - that is, as the 'parent' of other 'younger' |" + say "| dialogs. |" + say "| |" + say "| Syntax: 'OffsetPopups [runType] [offset]' |" + say "| |" + say "| - runType: Defines the 'root' dialog as follows: |" + say "| 'p/P' or null for Parent, 'c/C' for Child, |" + say "| 'g/G' for GrandChild, 'gg/GG' for GreatGrandChild. |" + say "| Default is 'P'. |" + say "| |" + say "| - offset: a number (e.g. 100). If present, visibly offsets |" + say "| a descendant dialog from its immediate ancestor. |" + say "| Default is 0 - that is, no offset. |" + say "+-----------------------------------------------------------------------+" + exit +end + +-- Work out which of the four possible formats of parameters applies: +if runtype = "" & offset = "" then case = 1 +if runtype~datatype = "NUM" & offset = "" then case = 2 +if ("PCG"~caselessPos(runtype) >0 | runtype = "GG") & offset = "" then case = 3 +if ("PCG"~caselessPos(runtype) >0 | runtype = "GG") & offset~datatype = "NUM" then case = 4 + +-- Set up parameter values: +select + when case = 1 then do + runtype = "P"; offset = 0 + end + when case = 2 then do + offset = runtype; runtype = "P"; + end + when case = 3 then do + offset = 0 + end + when case = 4 then nop + otherwise do + say "Parameter Error. Run '"||progName||" ?' for parameter values." + exit + end +end + +-- Set up offset amount in View class attribute: +.View~offsetAmount = offset + +-- Launch First Dialog: +select + when runtype = "P" then .ParentDialog~newInstance() + when runtype = "C" then .ChildDialog~newInstance("SA") + when runtype = "G" then .GrandChildDialog~newInstance("SA") + when runtype = "GG" then .GreatGrandChildDialog~newInstance("SA") + otherwise nop +end + +::REQUIRES "ooDialog.cls" + + +/*---------------------------------------------------------------------------*/ + +::CLASS 'ParentDialog' SUBCLASS View -- modified for offset + + ::METHOD newInstance CLASS + dlg = self~new + dlg~activate + + + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "Parent Dialog for Popups", "CENTER") + + + ::METHOD defineDialog + self~createPushButton(901, 142, 99, 50, 14, "DEFAULT", "Pop Up Child", popup) + + + ::METHOD activate UNGUARDED + self~execute("SHOWTOP") + + + ::METHOD popup UNGUARDED + popupPos = self~getPopupPos() -- added for offset + .ChildDialog~newInstance(self, popupPos) + +/*---------------------------------------------------------------------------*/ + + +/*---------------------------------------------------------------------------*/ + +::CLASS 'ChildDialog' SUBCLASS View -- modified for offset + + ::METHOD newInstance CLASS + use arg rootDlg, dlgPos -- modified for offset + dlg = self~new + dlg~activate(rootDlg, dlgPos) -- modified for offset + + + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "Child Dialog", "CENTER") + + + ::METHOD defineDialog + self~createPushButton(901, 142, 99, 100, 14, "DEFAULT", "Pop Up Grandchild", popup) + + + ::METHOD activate UNGUARDED + expose rootDlg dlgPos standalone -- modified for offset + use arg rootDlg, dlgPos -- modified for offset + if rootDlg = "SA" then do + rootDlg = self + standAlone = .true -- added for offset + self~execute("SHOWTOP") + end + else self~popupAsChild(rootDlg, "SHOWTOP") + + + ::METHOD initDialog -- added for offset + expose rootDlg dlgPos standalone + if standalone \= .true then self~offset(dlgPos) + + + ::METHOD popup UNGUARDED + expose rootDlg -- modified for offset + popupPos = self~getPopupPos() + .GrandChildDialog~newInstance(rootDlg, popupPos) -- modified for offset +/*---------------------------------------------------------------------------*/ + + +/*---------------------------------------------------------------------------*/ + +::CLASS 'GrandChildDialog' SUBCLASS View -- modified for offset + + ::METHOD newInstance CLASS + use arg rootDlg, dlgPos -- modified for offset + dlg = self~new + dlg~activate(rootDlg, dlgPos) -- modified for offset + + + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "Grandchild", "CENTER") + + + ::METHOD defineDialog + self~createPushButton(901, 142, 99, 100, 14, "DEFAULT", "Pop Up GreatGrandchild", popup) + + + ::METHOD activate UNGUARDED + expose rootDlg dlgPos standalone -- modified for offset + use arg rootDlg, dlgPos -- modified for offset + if rootDlg = "SA" then do + rootDlg = self + standAlone = .true -- added for offset + self~execute("SHOWTOP") + end + else self~popupAsChild(rootDlg, "SHOWTOP") + + + ::METHOD initDialog -- added for offset + expose rootDlg dlgPos standalone + if standalone \= .true then self~offset(dlgPos) + + + ::METHOD popup UNGUARDED + expose rootDlg + popupPos = self~getPopupPos(offset) + .GreatGrandChildDialog~newInstance(rootDlg, popupPos) -- modified for offset + +/*---------------------------------------------------------------------------*/ + + +/*---------------------------------------------------------------------------*/ + +::CLASS 'GreatGrandChildDialog' SUBCLASS View -- modified for offset + + ::METHOD newInstance CLASS + use arg rootDlg, dlgPos -- modified for offset + dlg = self~new + dlg~activate(rootDlg, dlgPos) -- modified for offset + + + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "GreatGrandchild", "CENTER") + + + ::METHOD activate + expose rootDlg dlgPos -- added for offset + use arg rootDlg, dlgPos -- modified for offset + if rootDlg = "SA" then self~execute("SHOWTOP") + else self~popupAsChild(rootDlg, "SHOWTOP") + + + ::METHOD initDialog -- added for offset + expose rootdlg dlgPos + if rootDlg \= "SA" then self~offset(dlgPos) + +/*---------------------------------------------------------------------------*/ + + +/*---------------------------------------------------------------------------*/ + +::CLASS View SUBCLASS UserDialog -- added for offset + + ::ATTRIBUTE offsetAmount CLASS PUBLIC + + ::METHOD getPopupPos + popupPos = self~getRealpos + offset = .View~offsetAmount + popupPos~incr(offset,offset) + return popupPos + + ::METHOD offset + use arg dlgPos + self~moveTo(dlgPos, 'SHOWWINDOW') + self~ensureVisible() + +/*---------------------------------------------------------------------------*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Extras/Popups/Popups.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Extras/Popups/Popups.rex new file mode 100755 index 0000000..2fdb292 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Extras/Popups/Popups.rex @@ -0,0 +1,221 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* ooDialog User Guide + Samples\Popups + Popups.rex v01-00 07Jun12 + + The four dialogs in this file illustrate how popups can be tested in + stand-alone mode with a single code base. If a given dialog pops up another + dialog, then this is part of the "stand-alone" operation of the + first dialog. + + Associated files: None. + + Invocation: popups [runType] + + "runType" controls which dialog to surface in "standalone" mode as follows: + "p" for parent, "c" for child, or "g" for grandchild, "gg" for + greatgrandchild. Of course "standalone mode" has no meaning for the + parent dialog, as when run it's always the root. + + The default is runtype = Parent. + + Changes: + v01-00 07Jun12: First Version + +------------------------------------------------------------------------------*/ + +parse upper arg runtype +progName = "Popups" +if runtype = "?" then do + say + say "+-----------------------------------------------------------------------+" + say "| Demonstration of Popups, four generations, where any generation |" + say "| can be run 'standalone' - that is, as the 'parent' of other 'younger' |" + say "| dialogs. |" + say "| |" + say "| Syntax: 'Popups [runType]' |" + say "| |" + say "| - runType: Defines the 'root' dialog as follows: |" + say "| 'p/P' or null for Parent, 'c/C' for Child, |" + say "| 'g/G' for GrandChild, 'gg/GG' for GreatGrandChild. |" + say "| Default is 'P'. |" + say "+-----------------------------------------------------------------------+" + exit +end + +-- Work out which of the four possible formats of parameters applies: +if runtype = "" then runtype = "P" + +-- Launch First Dialog: +select + when runtype = "P" then .ParentDialog~newInstance(offset) + when runtype = "C" then .ChildDialog~newInstance("SA",offset) + when runtype = "G" then .GrandChildDialog~newInstance("SA",offset) + when runtype = "GG" then .GreatGrandChildDialog~newInstance("SA",offset) + otherwise do + say "Parameter Error. Run '"||progName||" ?' for parameter values." + exit + end +end + +::REQUIRES "ooDialog.cls" + + +/*---------------------------------------------------------------------------*/ + +::CLASS 'ParentDialog' SUBCLASS UserDialog + + ::METHOD newInstance CLASS + dlg = self~new + dlg~activate() + + + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "Parent Dialog for Popups", "CENTER") + + + ::METHOD defineDialog + self~createPushButton(901, 142, 99, 50, 14, "DEFAULT", "Pop Up Child", popup) + + + ::METHOD activate UNGUARDED + self~execute("SHOWTOP") + + + ::METHOD popup UNGUARDED + .ChildDialog~newInstance(self) + +/*---------------------------------------------------------------------------*/ + + +/*---------------------------------------------------------------------------*/ + +::CLASS 'ChildDialog' SUBCLASS UserDialog + + ::METHOD newInstance CLASS + use arg rootDlg + dlg = self~new + dlg~activate(rootDlg) + + + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "Child Dialog", "CENTER") + + + ::METHOD defineDialog + self~createPushButton(901, 142, 99, 100, 14, "DEFAULT", "Pop Up Grandchild", popup) + + + ::METHOD activate UNGUARDED + expose rootDlg + use arg rootDlg + if rootDlg = "SA" then do + rootDlg = self + self~execute("SHOWTOP") + end + else self~popupAsChild(rootDlg, "SHOWTOP") + + + ::METHOD popup UNGUARDED + expose rootDlg + .GrandChildDialog~newInstance(rootDlg) + +/*---------------------------------------------------------------------------*/ + + +/*---------------------------------------------------------------------------*/ + +::CLASS 'GrandChildDialog' SUBCLASS UserDialog + + ::METHOD newInstance CLASS + use arg rootDlg + dlg = self~new + dlg~activate(rootDlg) + + + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "Grandchild", "CENTER") + + + ::METHOD defineDialog + self~createPushButton(901, 142, 99, 100, 14, "DEFAULT", "Pop Up GreatGrandchild", popup) + + + ::METHOD activate + expose rootDlg + use arg rootDlg + if rootDlg = "SA" then do + rootDlg = self + self~execute("SHOWTOP") + end + else self~popupAsChild(rootDlg, "SHOWTOP") + + + ::METHOD popup UNGUARDED + expose rootDlg + .GreatGrandChildDialog~newInstance(rootDlg) + +/*---------------------------------------------------------------------------*/ + + +/*---------------------------------------------------------------------------*/ + +::CLASS 'GreatGrandChildDialog' SUBCLASS UserDialog + + ::METHOD newInstance CLASS + use arg rootDlg + dlg = self~new + dlg~activate(rootDlg) + + + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "GreatGrandchild", "CENTER") + + + ::METHOD activate + use arg rootDlg + if rootDlg = "SA" then self~execute("SHOWTOP") + else self~popupAsChild(rootDlg, "SHOWTOP") + +/*---------------------------------------------------------------------------*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Extras/ReadMe.txt b/modules/windows/oodialog/userGuide/exercises/Exercise06/Extras/ReadMe.txt new file mode 100644 index 0000000..f95760c --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Extras/ReadMe.txt @@ -0,0 +1,49 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + ReadMe + + 1. ooDialog - Additional Examples to Accompany the ooDialog User Guide + ----------------------------------------------------------------------- + + This subdirectory tree contains the example programs referred to in the + appendix of the ooDialog User Guide. The programs are intended to give + context to the discussions in the User Guide, and may, or may not, be of + use to ooRexx programmers by themselves. + + The structure of the subdirectory tree and the programs themselves are + explained in the ooDialog User Guide. diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderFormView.h b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderFormView.h new file mode 100644 index 0000000..99b425d --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderFormView.h @@ -0,0 +1,53 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDR_ORDFORM_MENU 102 +#define IDD_ORDFORM_DIALOG 105 +#define IDI_ORDFORM_DLGICON 107 +#define IDC_CANCEL 1001 +#define IDM_ORDFORM_PLACE 40000 +#define IDM_ORDFORM_ABOUT 40001 +#define IDC_ORDFORM_DATE 40002 +#define IDM_ORDFORM_SAVE 40003 +#define IDM_ORDFORM_CANCEL 40004 +#define IDC_ORDFORM_ORDNO 40005 +#define IDC_ORDFORM_TABS 40009 +#define IDC_ORDFORM_PLACEORDER 40010 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderFormView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderFormView.rc new file mode 100644 index 0000000..a0d72fc --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderFormView.rc @@ -0,0 +1,98 @@ +//*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "OrderFormView.h" + + + + +// +// Menu resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_ORDFORM_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "Place Order...", IDM_ORDFORM_PLACE + MENUITEM "Save Order...", IDM_ORDFORM_SAVE + MENUITEM "Cancel Order", IDM_ORDFORM_CANCEL + } + POPUP "Help" + { + MENUITEM "About", IDM_ORDFORM_ABOUT + } +} + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDFORM_DIALOG DIALOG 0, 0, 272, 278 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_SYSMENU +CAPTION "Order Form" +FONT 8, "Ms Shell Dlg" +{ + CONTROL "", IDC_ORDFORM_DATE, DATETIMEPICK_CLASS, WS_TABSTOP | DTS_RIGHTALIGN, 185, 9, 70, 15 + EDITTEXT IDC_ORDFORM_ORDNO, 50, 9, 40, 14, ES_AUTOHSCROLL + LTEXT "Order No.", IDC_STATIC, 10, 14, 32, 8, SS_LEFT + LTEXT "Date", IDC_STATIC, 158, 12, 16, 8, SS_LEFT + LTEXT "Total Cost:", IDC_STATIC, 116, 194, 35, 8, SS_LEFT + LTEXT "Discount", IDC_STATIC, 116, 208, 29, 8, SS_LEFT + PUSHBUTTON "Place Order", IDC_ORDFORM_PLACEORDER, 200, 244, 50, 14 + LTEXT "Tax", IDC_STATIC, 116, 222, 13, 8, SS_LEFT + RTEXT "0.00", IDC_STATIC, 164, 208, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_STATIC, 164, 222, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_STATIC, 215, 222, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_STATIC, 215, 194, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_STATIC, 215, 208, 40, 8, SS_RIGHT + CONTROL "", IDC_ORDFORM_TABS, WC_TABCONTROL, 0, 15, 44, 245, 135 + PUSHBUTTON "Cancel Order", IDC_CANCEL, 132, 244, 46, 14 +} + + + +// +// Icon resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_ORDFORM_DLGICON ICON ".\\Order\\bmp\\OrderForm.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderFormView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderFormView.rex new file mode 100755 index 0000000..aed5e8f --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderFormView.rex @@ -0,0 +1,188 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 06: The OrderFormView class v01-00 07Jun12 + OrderFormView.rex + + Contains: class "OrderFormView", class "HRSofv". + Pre-requisite files: OrderFormView.rc, OrderFormView.h. + + Changes: + v01-00 07Jun12: First version. + +------------------------------------------------------------------------------*/ + + +.Application~addToConstDir("Order\OrderFormView.h") + + +::requires "ooDialog.cls" + + +/*============================================================================== + OrderFormView v01-00 07Jun12 + ------------- + The "view" (or "gui") Data Entry part of the Sales Order component. + + Changes: + v01-00 07Jun12: First Version + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderFormView SUBCLASS RcDialog PUBLIC + + ::METHOD newInstance CLASS PUBLIC + use arg rootDlg, orderNo + dlg = self~new("Order\OrderFormView.rc", "IDD_ORDFORM_DIALOG") + --say ".OrderFormView-newInstance: rootDlg =" rootDlg + dlg~activate(rootDlg, orderNo) + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + -- creates the dialog instance but does not make it visible. + expose menuBar + say "OrderFormView-init-01" + + forward class (super) continue + + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + say "OrderFormView-createMenuBar-01" + menuBar = .ScriptMenuBar~new("Order\OrderFormView.rc", IDR_ORDFORM_MENU, , , .true) + + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate unguarded + use arg rootDlg + -- Shows the Dialog - i.e. makes it visible to the user. + say "OrderFormView-activate-01" + if rootDlg = "SA" then self~execute("SHOWTOP","IDI_ORDFORM_DLGICON") + else self~popUpAsChild(rootDlg,"SHOWTOP",,"IDI_ORDFORM_DLGICON") + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + -- Called by ooDialog after SHOWTOP. + expose menuBar custControls + say "OrderFormView-initDialog-01" + + menuBar~attachTo(self) + + btnCancelOrder = self~newPushButton("IDC_CANCEL") + btnPlaceOrder = self~newPushButton("IDC_ORDFORM_PLACEORDER") + self~connectButtonEvent("IDC_CANCEL","CLICKED",cancel) + self~connectButtonEvent("IDC_ORDFORM_PLACEORDER","CLICKED",placeOrderBtn) + + return + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD placeOrder UNGUARDED + self~noMenuFunction(.HRSofv~PlaceOrder) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD saveOrder UNGUARDED + self~noMenuFunction(.HRSofv~SaveOrder) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD CancelOrder UNGUARDED + self~cancel + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSofv~HelpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSofv~NoMenu, self~hwnd, title, 'WARNING') + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + -- "Cancel" - This method over-rides the default Windows action of + -- 'cancel window' for an Escape key. + ::METHOD cancel + response = askDialog(.HRSofv~QExit, "N") + if response = 1 then forward class (super) + return + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Button Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD placeOrderBtn UNGUARDED + ret = MessageDialog(.HRSofv~NoBtn, self~hwnd, "Place Order Button", 'WARNING') + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRSofv) v01-00 07Jun12 + -------- + The HRSofv class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSofv PRIVATE -- Human-Readable Strings + ::CONSTANT QExit "Are you sure you want to cancel this Order and throw away all changes?" + ::CONSTANT NoMenu "This menu item is not yet implemented." + ::CONSTANT NoBtn "This button is not yet implemented." + ::CONSTANT PlaceOrder "Place Order" + ::CONSTANT SaveOrder "Save Order" + ::CONSTANT CancelOrder "Cancel Order" + ::CONSTANT HelpAbout "Help - About" + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderListView.h b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderListView.h new file mode 100644 index 0000000..bc886a6 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderListView.h @@ -0,0 +1,48 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_ORDLIST_LISTVIEW 106 +#define IDI_ORDLIST_DLGICON 107 +#define IDR_ORDLIST_MENU 108 +#define IDC_ORDLIST_LIST 1000 +#define IDC_ORDLIST_SHOWORDER 1001 +#define IDM_ORDLIST_NEWORDER 40000 +#define IDM_ORDLIST_ABOUT 40001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderListView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderListView.rc new file mode 100644 index 0000000..317a390 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderListView.rc @@ -0,0 +1,73 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include +#include +#include +#include "OrderListView.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_ORDLIST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Order...", IDM_ORDLIST_NEWORDER + } + POPUP "Help" + { + MENUITEM "About...", IDM_ORDLIST_ABOUT + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDLIST_LISTVIEW DIALOG 0, 0, 255, 273 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Order List" +FONT 8, "Ms Shell Dlg" +{ + PUSHBUTTON "Cancel", IDCANCEL, 150, 235, 50, 14 + CONTROL "", IDC_ORDLIST_LIST, WC_LISTVIEW, WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SORTASCENDING, 15, 10, 225, 215 + DEFPUSHBUTTON "Show Order", IDC_ORDLIST_SHOWORDER, 89, 235, 42, 14, WS_DISABLED +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_ORDLIST_DLGICON ICON ".\\order\\bmp\\OrderList.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderListView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderListView.rex new file mode 100755 index 0000000..8716ba1 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderListView.rex @@ -0,0 +1,250 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 06: The Order ListView v01-00 07Jun12 + + Contains: class "OrderListView", "HRSolv" + + Pre-requisite files: OrderListView.rc, OrderListView.h. + + Description: Provides a list of Orders and supports viewing any given + Order via a double-click on that Order's item in the list. + This is an "Intermediate" component - it is invoked by OrderMgmt, + and invokes OrderView. + + Changes: + v01-00 07Jun12: First Version + + Outstanding Problems: None reported. + +*******************************************************************************/ + + +.Application~addToConstDir("Order\OrderListView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "Order\OrderView.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderListView v01-00 07Jun12 + ------------- + The view of a list of products. + Changes: + v01-00 07Jun12: First version + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderListView SUBCLASS RcDialog PUBLIC + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use arg rootDlg + say ".OrderListView-newInstance-01: root =" "'"||rootDlg||"'" + dlg = self~new("Order\OrderListView.rc", "IDD_ORDLIST_LISTVIEW") + say ".OrderListView-newInstance-02." + dlg~activate(rootDlg) -- Must be the last statement. + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + forward class (super) continue + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + say "OrderListView-createMenuBar-01." + menuBar = .ScriptMenuBar~new("Order\OrderListView.rc", "IDR_ORDLIST_MENU", , , .true) + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate unguarded + expose rootDlg + use arg rootDlg + say "OrderListView-activate-01: root =" rootDlg + --trace i + if rootDlg = "SA" then do -- If standalone operation required + rootDlg = self -- To pass on to children + self~execute("SHOWTOP","IDI_ORDLIST_DLGICON") + end + else self~popupAsChild(rootDlg, "SHOWTOP", ,"IDI_ORDLIST_DLGICON") + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar lvOrders btnShowOrder + -- Called by ooDialog after SHOWTOP. + + menuBar~attachTo(self) + + say "OrderListView-initDialog-01"; say + lvOrders = self~newListView("IDC_ORDLIST_LIST"); + lvOrders~addExtendedStyle(GRIDLINES FULLROWSELECT) + lvOrders~insertColumnPX(0,"OrderNo",60,"LEFT") + lvOrders~insertColumnPX(1,"CustNo",80,"LEFT") + lvOrders~insertColumnPX(2,"CustName",130,"LEFT") + lvOrders~insertColumnPX(3,"Date",80,"LEFT") + self~connectListViewEvent("IDC_ORDLIST_LIST","CLICK",itemSelected) + self~connectListViewEvent("IDC_ORDLIST_LIST","ACTIVATE",openItem) + self~connectButtonEvent("IDC_ORDLIST_SHOWORDER","CLICKED",showOrder) + + self~loadList + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newOrder UNGUARDED + self~noMenuFunction(.HRSolv~newOrder) + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSolv~helpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSolv~noMenu, self~hwnd, title, 'WARNING') + + + /*---------------------------------------------------------------------------- + Event Handling Methods - List Items + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD itemSelected unguarded + expose lvOrders --btnShowOrder + use arg id, itemIndex, columnIndex, keyState + if itemIndex > -1 then self~enableControl("IDC_ORDLIST_SHOWORDER") + else self~disableControl("IDC_ORDLIST_SHOWORDER") + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD openItem UNGUARDED + say "OrderListView-openItem-01: item selected =" item + self~showOrder + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showOrder unguarded + expose lvOrders rootDlg + item = lvOrders~selected + say "OrderListView-showOrder-01: item selected =" item + if item = -1 then do -- if no item selected. + ret = MessageDialog(.HRSolv~nilSelected, self~hwnd, title, 'WARNING') + return + end + info=.Directory~new + if lvOrders~getItemInfo(item, info) then do + say "OrderListView-showOrder-02: info~text =" info~text + .local~my.idOrderData = .OrderData~new -- create Order Data instance + .local~my.idOrderModel = .OrderModel~new -- create Order Model instance + .local~my.idOrderData~activate + .local~my.idOrderModel~activate + .OrderView~newInstance(rootDlg,"DM00263") + --say "OrderListView-showOrder-03: after startOrderView" + self~disableControl("IDC_ORDLIST_SHOWORDER") + end + else do + say "OrderListView-showOrder-04: ~getItemInfo returned .false." + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD loadList + expose lvOrders + + lvOrders~addRow( 1, ,"DM00263", "CU003", "ABC Inc.", "21Nov12") + lvOrders~addRow( 2, ,"DM10473", "AB15784", "Frith Inc.", "12Oct12") + lvOrders~addRow( 3, ,"DM13003", "CU001", "LMN & Co", "07Jun12") + lvOrders~addRow( 4, ,"AS49005", "CU003", "EJ Smith", "30Aug12") + lvOrders~addRow( 5, ,"AM72010", "CU005", "Red-On Inc.","17Jan13") + lvOrders~addRow( 6, ,"OZ15784", "CU003", "Joe Bloggs & Co Ltd","28Feb13") + /*do i = 1 to 50 + lvOrders~addRow(i, , "Line" i, i) + end*/ + lvOrders~setColumnWidth(1) -- set width of 2nd column to longest text entry. + + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + HRSolv (Human-Readable Strings for OrderListView) v01-00 07Jun12 + --- + The HRSolv class provides constant character strings for user-visible messages + issued by the OrderListView class. + + Changes: + v01-00 07Jun12: First Version + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +::CLASS HRSolv PRIVATE -- Human-Readable Strings + ::CONSTANT noMenu "This menu item is not yet implemented." + ::CONSTANT newOrder "New Order" + ::CONSTANT helpAbout "Help - About" + ::CONSTANT nilSelected "Please select an item first." + +/*============================================================================*/ + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderModelData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderModelData.rex new file mode 100755 index 0000000..df26493 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderModelData.rex @@ -0,0 +1,139 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 06: The OrderModel and OrderData Classes v01-00 07Jun12 + + Contains: classes "OrderModel" and "OrderResource". + Pre-requisites: None. + + Outstanding Problems: + None. + + Changes: + v01-00 07Jun12: First version. +------------------------------------------------------------------------------*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderModel v01-00 07Jun12 + ------------ + The "model" part of the Order component. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderModel PUBLIC + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + -- Creates an instance and returns it. + aOrderModel = self~new + return aOrderModel + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD activate PUBLIC + -- Gets its data from ProductData. + expose idOrderData + idOrderData = .local~my.idOrderData + + + ::METHOD query PUBLIC + -- Returns data requested (no argument = return all) + expose idOrderData + say "OrderModel-query-01." + data = idOrderData~getData + return data +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderData v01-00 07Jun12 + ------------ + The "data" part of the Order component. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderData PUBLIC + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + aOrderData = self~new + return aOrderData + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate PUBLIC + expose custData + custData = .directory~new + custData[custNo] = "AB15784" + custData[custName] = "Joe Bloggs & Co Ltd" + arrCustAddr = .array~new + arrCustAddr[1] = "28 Frith Street" + arrCustAddr[2] = "Hardington" + arrCustAddr[3] = "Blockshire" + custData[CustAddr] = arrCustAddr + custData[custZip] = "LB7 4EJ" + custData[custDiscount]= "B1" + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getData PUBLIC + expose custData + say "OrderData-getData-01." + return custData + +/*============================================================================*/ + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderView.h b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderView.h new file mode 100644 index 0000000..969b70a --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderView.h @@ -0,0 +1,51 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_ORDER_DIALOG 108 +#define IDI_ORDER_DLGICON 109 +#define IDR_ORDER_MENU 110 +#define IDC_ORDER_NAMEADDR 1000 +#define IDC_ORDER_DATE 1001 +#define IDM_ORDER_DOTHIS 40000 +#define IDM_ORDER_ABOUT 40001 +#define IDC_ORDER_ORDNO 40007 +#define IDC_ORDER_CUSTNO 40008 +#define IDC_ORDER_ITEMS 40009 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderView.rc new file mode 100644 index 0000000..a8f21c7 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderView.rc @@ -0,0 +1,87 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include +#include +#include +#include "OrderView.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_ORDER_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "An Action", IDM_ORDER_DOTHIS + } + POPUP "Help" + { + MENUITEM "About", IDM_ORDER_ABOUT + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDER_DIALOG DIALOG 0, 0, 272, 271 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_SYSMENU +CAPTION "Sales Order" +FONT 8, "Ms Shell Dlg" +{ + CONTROL "", IDC_ORDER_DATE, DATETIMEPICK_CLASS, WS_TABSTOP | DTS_RIGHTALIGN, 185, 15, 70, 15 + EDITTEXT IDC_ORDER_ORDNO, 215, 35, 40, 14, ES_AUTOHSCROLL + EDITTEXT IDC_ORDER_CUSTNO, 215, 55, 40, 14, ES_AUTOHSCROLL + LTEXT "Order No.", IDC_STATIC, 174, 38, 32, 8, SS_LEFT + LTEXT "Customer No.", IDC_STATIC, 170, 58, 44, 8, SS_LEFT + CONTROL "", IDC_ORDER_ITEMS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_ICON, 20, 75, 240, 115 + LTEXT "Date", IDC_STATIC, 158, 18, 16, 8, SS_LEFT + LTEXT "Total Cost:", IDC_STATIC, 116, 200, 35, 8, SS_LEFT + LTEXT "Discount", IDC_STATIC, 116, 214, 29, 8, SS_LEFT + DEFPUSHBUTTON "Cancel", IDCANCEL, 190, 245, 37, 14 + LTEXT "Tax", IDC_STATIC, 116, 228, 13, 8, SS_LEFT + RTEXT "0.00", IDC_STATIC, 164, 214, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_STATIC, 164, 228, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_STATIC, 215, 228, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_STATIC, 215, 200, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_STATIC, 215, 214, 40, 8, SS_RIGHT + EDITTEXT IDC_ORDER_NAMEADDR, 20, 30, 103, 39, ES_AUTOHSCROLL + LTEXT "Customer:", IDC_STATIC, 28, 16, 32, 8, SS_LEFT +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_ORDER_DLGICON ICON ".\\Order\\bmp\\OrderForm.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderView.rex new file mode 100755 index 0000000..b44f5d6 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/OrderView.rex @@ -0,0 +1,174 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 06: The OrderView class v01-00 07Jun12 + + OrderFormView.rex + + Contains: class "OrderView". + Pre-requisite files: OrderView.rc, OrderView.h. + + Description: A sample Order View component - part of the sample + Order Management application. + This is a "leaf" component - invoked by OrderListView. + + Outstanding Problems: None reported. + + Changes: + v01-00 07Jun12: First Version + +------------------------------------------------------------------------------*/ + + +.Application~addToConstDir("Order\OrderView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "Order\OrderModelData.rex" + + +/*============================================================================== + OrderView v01-00 07Jun12 + ------------- + The "view" (or "gui") part of the Order component - part of the sample + Order Management application. + + Changes: + v01-00 07Jun12: First Version. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderView SUBCLASS RcDialog PUBLIC + + ::METHOD newInstance CLASS PUBLIC + expose rootDlg + use arg rootDlg, orderNo + say ".OrderView-newInstance: rootDlg =" rootDlg + dlg = self~new("Order\OrderView.rc", "IDD_ORDER_DIALOG") + dlg~activate(rootDlg, orderNo) + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + -- creates the dialog instance but does not make it visible. + expose menuBar + say "OrderView-init-01" + + forward class (super) continue + + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + say "OrderView-createMenuBar-01" + menuBar = .ScriptMenuBar~new("Order\OrderView.rc", IDR_ORDER_MENU, , , .true) + + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate unguarded + use arg rootDlg + -- Shows the Dialog - i.e. makes it visible to the user. + say "OrderView-activate-01" + if rootDlg = "SA" then self~execute("SHOWTOP","IDI_ORDER_DLGICON") + else self~popUpAsChild(rootDlg,"SHOWTOP",,"IDI_ORDER_DLGICON") + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + -- Called by ooDialog after SHOWTOP. + expose menuBar custControls + say "OrderView-initDialog-01" + + menuBar~attachTo(self) + + return + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD anAction UNGUARDED + self~noMenuFunction(.HRSov~anAction) + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSov~HelpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSov~NoMenu, self~hwnd, title, 'WARNING') + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + -- "Cancel" - This method over-rides the default Windows action of + -- 'cancel window' for an Escape key. + ::METHOD cancel + response = askDialog(.HRSov~QExit, "N") + if response = 1 then forward class (super) + return + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRSov) v01-00 07Jun12 + -------- + The HRSofv class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSov PRIVATE -- Human-Readable Strings + ::CONSTANT anAction "An Action" + ::CONSTANT NoMenu "This menu item is not implemented." + ::CONSTANT QExit "Are you sure you want to cancel this Order View?" + ::CONSTANT HelpAbout "About Sales Order" + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/StartupOrder.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/StartupOrder.rex new file mode 100755 index 0000000..bb77162 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/StartupOrder.rex @@ -0,0 +1,54 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise06: Stand-alone startup for OrderForm + startupOrder.rex v01-00 07Jun12 + + Contains: Startup code. + Pre-requisites: Must be run from the parent folder of the Order folder. + + Changes: + v01-00 07Jun12: First Version + + Outstanding Problems: None reported. +*******************************************************************************/ + +.Application~setDefaults("O", , .false) + +.OrderView~newInstance("SA") + +::REQUIRES "Order\OrderView.rex" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/StartupOrderForm.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/StartupOrderForm.rex new file mode 100755 index 0000000..3884c32 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/StartupOrderForm.rex @@ -0,0 +1,54 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise06: Stand-alone startup for OrderForm + startupOrderForm.rex v01-00 07Jun12 + + Contains: Startup code. + Pre-requisites: Must be run from the parent folder of the Order folder. + + Changes: + v01-00 07Jun12: First Version + + Outstanding Problems: None reported. +*******************************************************************************/ + +.Application~setDefaults("O", , .false) + +.OrderFormView~newInstance("SA") + +::REQUIRES "Order\OrderFormView.rex" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/StartupOrderList.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/StartupOrderList.rex new file mode 100755 index 0000000..6d3c89b --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/StartupOrderList.rex @@ -0,0 +1,54 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise06: Stand-alone startup for OrderForm + startupOrderForm.rex v01-00 07Jun12 + + Contains: Startup code. + Pre-requisites: Must be run from the parent folder of the Order folder. + + Changes: + v01-00 07Jun12: First Version + + Outstanding Problems: None reported. +*******************************************************************************/ + +.Application~setDefaults("O", , .false) + +.OrderListView~newInstance("SA") + +::REQUIRES "Order\OrderListView.rex" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/bmp/OrderForm.bmp b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/bmp/OrderForm.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2c2ca388d05f61ac583536dae5d3f5fb1542e966 GIT binary patch literal 2166 zcmeHIOAf*y5XHoWi5rPG=*k0l0OH>37?(X-Z&u$MrXx;m0t;3;Da_|}=wm2wyFU&= z7gT4#c9lJw(@)Jp3Ne4^(Xk6E`N+W+8 zrgmdIXq;qO6}D6A=rtHuzE(N;Q%27G*XqxfjoOX%!+W1k01{QAA@PNK2(Ems(#$_H z-}Z3Y$~>3yAB$VsYWMIj&R;%yqLlmx;>y=59sD^oB|dR4e?qLKUfek+Gs*2_<}Ywd nJ962=f82kl;%Rj$qK_pY?39&!e12^q*|XOYzW1Hhzhz(rb0Pbg literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/bmp/OrderList.bmp b/modules/windows/oodialog/userGuide/exercises/Exercise06/Order/bmp/OrderList.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4cc094ed82be0c3180c2b8688e39ecfed14165fc GIT binary patch literal 16438 zcmeI2O-?I841|X@OD@2Y6J#B+=gzrV=p=knWW{5*(|>@2hN8P`Tvc|$dm8cibvSO< z*P(p>DA)1ldfDE~Pvv#owzt>YbzPTl=bhK(c;#!ydXuA-vm2vpn*Ve@209RAS! z=hE}NukuU{f3-*+?|twyf2;%aueRUZr=ho=ZpaSngf`ybt2NFHx}_?bV}0s80dcW+*;ANaBK`R_md>pfR* z{aQcpbN;ao&_C~ddh=@iz>lTR&p-WJ4ZZI(d_OyX>a2pZ@_TiA@nruk9r&&0Z|U_u zCl6@p!HeeSKI(v$Ztrt^fSMlX`_u)|n}zrQ@xeNp)4GrPAiA><9}=w` z(Q~OYD>u5*59????|tZi_?dBgjv!3b|YFdq_ulRRyE zllKL$EARmDl-5dnOAF(x(F0xAq3`8mV>C@u6UkY|$1r*2XW;-fLA{+4tpnA +#include +#include +#include "OrderMgrView.h" + + + + +// +// Menu resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_ORDMGR_MENU MENU +{ + POPUP "Orders" + { + MENUITEM "New Order...", IDM_ORDMGR_NEWORDER + MENUITEM "Order List...", IDM_ORDMGR_ORDERLIST + MENUITEM "Order Search...", IDM_ORDMGR_ORDERSEARCH + } + POPUP "Customers" + { + MENUITEM "Customer List...", IDM_ORDMGR_CUSTLIST + MENUITEM "Customer Search...", IDM_ORDMGR_CUSTSEARCH + } + POPUP "Products" + { + MENUITEM "Product List...", IDM_ORDMGR_PRODLIST + MENUITEM SEPARATOR + MENUITEM "Product Search...", IDM_ORDMGR_PRODSEARCH + } + POPUP "New" + { + MENUITEM "Product...", IDM_ORDMGR_PRODNEW + MENUITEM "Customer...", IDM_ORDMGR_CUSTNEW + MENUITEM "Order...", IDM_ORDMGR_ORDERNEW + } + POPUP "Help" + { + MENUITEM "About", IDM_ORDMGR_ABOUT + } +} + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDMGR DIALOG 0, 0, 310, 209 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "Dialog" +FONT 8, "Ms Shell Dlg" +{ + PUSHBUTTON "Exit Application", IDC_ORDMGR_EXIT, 245, 186, 60, 15 + PUSHBUTTON "Reset Icons", IDC_ORDMGR_RESET, 5, 186, 50, 15 + CONTROL "", IDC_ORDMGR_ICONS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_ICON, 5, 5, 300, 175 +} diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/OrderMgr/OrderMgrView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/OrderMgr/OrderMgrView.rex new file mode 100755 index 0000000..ce5ea8a --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/OrderMgr/OrderMgrView.rex @@ -0,0 +1,333 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 06: OrderMgrView.rex v01-00 30Jly13 + + Contains: class: "OrderMgrView", "HRSomv" + + Description: A sample Order Manager View class - part of the sample + Order Manager component. + + Outstanding Problems: None reported. + + Changes: + v01-00 07Jun12: First Version (ooDialog 4.2.1) - used dlgArea for re-sizing. + 18Jan13: Second Version (ooDialog 4.2.2) - uses ResizingAdmin for + re-sizing. + 30Jly14: Corrected .ImageList~create(...) statement in + createIconList method. +------------------------------------------------------------------------------*/ + +-- Use the global .constDir for symbolic IDs - load them from OrderMgrView.h +.Application~addToConstDir("OrderMgr\OrderMgrView.h") + +call "OrderMgr\RequiresList.rex" + +::REQUIRES "ooDialog.cls" + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderMgrView v01-00 18Jan13 + -------------------- + To the user, this class is the Order Management Application. It provides + access to the various functions required for managing Sales orders. + In this Exercise, however, only very basic application function is provided. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderMgrView SUBCLASS RcDialog PUBLIC INHERIT ResizingAdmin + + ::ATTRIBUTE lv PRIVATE -- The ListView that contains the icons. + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + say ".OrderMgrView-newInstance-01." + dlg = .OrderMgrView~new("OrderMgr\OrderMgrView.rc", IDD_ORDMGR) + dlg~activate + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + expose menuBar records + forward class (super) continue + say "OrderMgrView-init-01." + menuBar = .ScriptMenuBar~new("OrderMgr\OrderMgrView.rc", IDR_ORDMGR_MENU, , , .true) + self~createIconList + records = self~initRecords + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD defineDialog + say "OrderMgrView-defineDialog-01." + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + say "OrderMgrView-activate-01." + self~execute("SHOWTOP", IDI_DLG_OOREXX) + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar records iconList + say "OrderMgrView-initDialog-01." + menuBar~attachTo(self) + + -- Create a proxy for the List View and store in instance variable 'lv'. + self~lv = self~newListView(IDC_ORDMGR_ICONS) + + -- Add the Image List to the ListView: + self~lv~setImageList(iconList, NORMAL) + -- Add icons (i.e. records) to the ListView: + do i=1 to records~items + self~lv~addRow(, i-1, records[i]~name) + end + + self~connectListViewEvent(IDC_ORDMGR_ICONS, "ACTIVATE", "onDoubleClick") + -- Following line required to allow icons to be dragged around the listview. + self~connectListViewEvent(IDC_ORDMGR_ICONS, "BEGINDRAG", "DefListDragHandler") + self~connectButtonEvent("IDC_ORDMGR_EXIT", "CLICKED",exitApp) + self~connectButtonEvent("IDC_ORDMGR_RESET","CLICKED",resetIcons) + self~setTitle(.HRSomv~WindowTitle) -- set dialog title. + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createIconList PRIVATE + -- This method simulates getting the icon "data" for the OrderMgr view. + -- The icon data is loaded into 'iconList' which is an 'ImageList' as + -- required by the ListView control. + expose iconList + --say "OrderMgrView-createIconList." + imgCustList = .Image~getImage("customer\bmp\CustList.bmp") + imgProdList = .Image~getImage("product\res\ProdList.bmp") + imgOrderList = .Image~getImage("order\bmp\OrderList.bmp") + imgOrderForm = .Image~getImage("order\bmp\OrderForm.bmp") + iconList = .ImageList~create(.Size~new(64, 64), .Image~toId(ILC_COLOR4), 4, 0) + -- Boldly assume no errors in creating the Image List or in the ~getImage statements. + iconList~add(imgCustList) -- item 0 in iconList (item 1 in records) + iconList~add(imgProdList) -- item 1 in iconList (item 2 in records) + iconList~add(imgOrderList) -- item 2 in iconList (item 3 in records) + iconList~add(imgOrderForm) -- item 3 in iconList (item 4 in records) + imgCustList~release + imgProdList~release + imgOrderList~release + imgOrderForm~release + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initRecords PRIVATE + -- This method simulates getting the "data" for the OrderMgr view. + expose records + records = .array~new() + + rec = .directory~new + rec~ID = "CustomerList" + rec~name = "Customer List" + records[1] = rec + + rec = .directory~new + rec~ID = "ProductList" + rec~name = "Product List" + records[2] = rec + + rec = .directory~new + rec~ID = "OrderList" + rec~name = "Sales Orders" + records[3] = rec + + rec = .directory~new + rec~ID = "OrderForm" + rec~name = "New Order" + records[4] = rec + + return records + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - Orders - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newOrder UNGUARDED + expose records + self~showModel(records[4]) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD orderList UNGUARDED + expose records + self~showModel(records[3]) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD orderSearch UNGUARDED + self~noMenuFunction(.HRSomv~OrdSrch) + + /*- - Customers - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD customerList UNGUARDED + expose records + self~showModel(records[1]) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD customerSearch UNGUARDED + self~noMenuFunction(.HRSomv~CustSrch) + + /*- - Products - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD productList + expose records + self~showModel(records[2]) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD productSearch UNGUARDED + self~noMenuFunction(.HRSomv~ProdSrch) + + /*- - New - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD product UNGUARDED + self~noMenuFunction(.HRSomv~NewProd) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD customer UNGUARDED + self~noMenuFunction(.HRSomv~NewCust) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD order UNGUARDED + self~newOrder + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSomv~HelpAbout) + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSomv~NoMenu, self~hwnd, title, 'WARNING') + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Icon Double-Click + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD onDoubleClick UNGUARDED + expose records + --use arg id + --say "OrderMgrView-onDoubleClick-01." + -- Get the index of the item with the focus, use the index to retrieve + -- the item's record: + index = self~lv~focused -- lv is an attribute of the superclass. + record = records[index+1] + --say "OrderMgrView-onDoubleClick-02: Record ID =" record~ID + self~showModel(record) + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - PushButton Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD resetIcons + r = self~lv~arrange + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD exitApp UNGUARDED + --say "OrderMgrView-exitApp-01." + self~cancel + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD cancel + --say "OrderMgrView-cancel-01." + response = askDialog(.HRSomv~QExit, "N") + if response = 1 then forward class (super) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD ok + -- Invoked when enter key pressed - if passed to superclass, cancels dialog. + return -- do not close dialog - appears as a no-op to the user. + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showModel UNGUARDED + /* Surface the view of an icon (i.e. view of the model represented by the icon). + Ideally, if already instantiated, surface it, else makeInstance. + In this version, get as many as you like - but all have the same data!.*/ + use arg record -- record is a directory object. + className = record~ID + --say "OrderMgrView-showModel-01: className =" className + viewClassName = className||"View" + interpret "."||viewClassName||"~newInstance(self)" + --say "OrderMgrView-showModel-02:" + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + HRSomv (Human-Readable Strings for OrderMgrView) v01-00 07Jun12 + --- + The HRSomv class provides constant character strings for user-visible messages + issued by the OrderMgrBaseView class. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +::CLASS HRSomv PRIVATE -- Human-Readable Strings + ::CONSTANT QExit "Are you sure you want to close all windows and exit the application?" + ::CONSTANT NoMenu "This menu item is not yet implemented." + ::CONSTANT OM "Order Manager" + ::CONSTANT OrdSrch "Order Search" + ::CONSTANT CustSrch "Customer Search" + ::CONSTANT ProdSrch "Product Search" + ::CONSTANT NewCust "New Customer" + ::CONSTANT NewProd "New Product" + ::CONSTANT HelpAbout "Help - About" + ::CONSTANT WindowTitle "Sales Order Management" -- Dialog Caption + ::CONSTANT Reset "Reset Icons" -- PushButton + ::CONSTANT ExitApp "Exit Application" -- PushButton +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/OrderMgr/RequiresList.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/OrderMgr/RequiresList.rex new file mode 100755 index 0000000..4b4a3de --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/OrderMgr/RequiresList.rex @@ -0,0 +1,58 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 06: RequiresList.rex v01-00 07Jun12 + + Contains: The list of View components that OrderMgrView requires. + + Pre-requisites: Class "OrderMgrView + + Description: This script is called by OrderMgrView. + + Outstanding Problems: None reported. + + Changes: + v01-00 07Jun12: First Version +------------------------------------------------------------------------------*/ + +--say "RequiresList." + +::REQUIRES "Customer\CustomerListView.rex" +::REQUIRES "Product\ProductListView.rex" +::REQUIRES "Order\OrderListView.rex" +::REQUIRES "Order\OrderFormView.rex" + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductListView.h b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductListView.h new file mode 100644 index 0000000..67f5489 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductListView.h @@ -0,0 +1,48 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_PRODLIST_DIALOG 102 +#define IDR_PRODLIST_MENU 104 +#define IDI_PRODLIST_DLGICON 105 +#define IDC_PRODLIST_SHOWPRODUCT 1000 +#define IDC_PRODLIST_LISTVIEW 1001 +#define IDM_PRODLIST_NEWPROD 40000 +#define IDM_PRODLIST_ABOUT 40001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductListView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductListView.rc new file mode 100644 index 0000000..539fa1e --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductListView.rc @@ -0,0 +1,76 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include +#include +#include +#include "ProductListView.h" + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_PRODLIST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Product...", IDM_PRODLIST_NEWPROD + } + POPUP "Help" + { + MENUITEM "About...", IDM_PRODLIST_ABOUT + } +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PRODLIST_DIALOG DIALOG 0, 0, 225, 273 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Product List" +FONT 8, "Ms Shell Dlg" +{ + PUSHBUTTON "Cancel", IDCANCEL, 150, 235, 50, 14 + CONTROL "", IDC_PRODLIST_LISTVIEW, WC_LISTVIEW, WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SORTASCENDING, 15, 10, 190, 215 + DEFPUSHBUTTON "Show Product", IDC_PRODLIST_SHOWPRODUCT, 90, 235, 50, 14, WS_DISABLED +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_PRODLIST_DLGICON ICON ".\\product\\res\\ProdList.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductListView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductListView.rex new file mode 100755 index 0000000..5148d8d --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductListView.rex @@ -0,0 +1,237 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise06: The Product List View v01-00 06Jun12 + + Contains: classes "ProductListView, HRSplv (for human-readable strings) + + Pre-requisites: ProductListView.rc, ProductListView.h, ProdList.ico + + Description: An "intermediate" component - called by OrderMgr, + invokes "ProductView". + + Changes: + v01-00 06Jun12: First version. + + Outstanding Problems: None reported. +*******************************************************************************/ + +.Application~addToConstDir("Product\ProductListView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "Product\ProductView.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductListView v01-00 06Jun12 + ------------- + The view of a list of products. + Changes: + v01-00: First version + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductListView SUBCLASS RcDialog PUBLIC + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use arg rootDlg + --say ".ProductListView-newInstance-01: rootDlg =" rootDlg + dlg = self~new("Product\ProductListView.rc", "IDD_PRODLIST_DIALOG") + --say ".ProductListView-newInstance-02." + dlg~activate(rootDlg) + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + forward class (super) continue + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + --say "ProductListView-createMenuBar-01." + menuBar = .ScriptMenuBar~new("Product\ProductListView.rc", "IDR_PRODLIST_MENU", , , .true) + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate unguarded + expose rootDlg + use arg rootDlg + --say "ProductListView-activate-01: root =" root + + if rootDlg = "SA" then do -- If standalone operation required + rootDlg = self -- To pass on to children + self~execute("SHOWTOP","IDI_PRODLIST_DLGICON") + end + else self~popupAsChild(rootDlg, "SHOWTOP", ,"IDI_PRODLIST_DLGICON") + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar lvProducts btnShowProduct + -- Called by ooDialog after SHOWTOP. + + menuBar~attachTo(self) + + --say "ProductListView-initDialog-01"; say + lvProducts = self~newListView("IDC_PRODLIST_LISTVIEW"); + lvProducts~addExtendedStyle(GRIDLINES FULLROWSELECT) + lvProducts~insertColumnPX(0,"Number",60,"LEFT") + lvProducts~insertColumnPX(1,"Name",150,"LEFT") + lvProducts~insertColumnPX(2,"Zip",50,"LEFT") + self~connectListViewEvent("IDC_PRODLIST_LISTVIEW","CLICK",itemSelected) + self~connectListViewEvent("IDC_PRODLIST_LISTVIEW","ACTIVATE",openItem) + self~connectButtonEvent("IDC_PRODLIST_SHOWPRODUCT","CLICKED",showProduct) + + self~loadList + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newProduct UNGUARDED + self~noMenuFunction(.HRSplv~newProd) + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSplv~helpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg caption + ret = MessageDialog(.HRSplv~noMenu, self~hwnd, caption, 'WARNING') + + /*---------------------------------------------------------------------------- + Event Handling Methods - List Items + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD itemSelected unguarded + expose lvProducts + use arg id, itemIndex, columnIndex, keyState + --say "ProductListView-itemSelected: itemIndex, columnIndex, keyState:" itemIndex columnIndex keyState + --say "ProductListView-itemSelected: item selected is:"lvProducts~selected + if itemIndex > -1 then self~enableControl("IDC_PRODLIST_SHOWPRODUCT") + else self~disableControl("IDC_PRODLIST_SHOWPRODUCT") + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD openItem UNGUARDED + --say "ProductListView-openItem-01: item selected =" item + self~showProduct + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD showProduct UNGUARDED + expose lvProducts rootDlg + item = lvProducts~selected + say "ProductListView-showProduct-01: item selected =" item + if item = -1 then do -- if no item selected. + ret = MessageDialog(.HRSplv~nilSelected, self~hwnd, title, 'WARNING') + return + end + info=.Directory~new + if lvProducts~getItemInfo(item, info) then do + --say "ProductListView-showProduct-02: info~text =" info~text + --say "ProductListView-showProduct-03; root =" root + .local~my.idProductData = .ProductData~newInstance -- create a ProductData instance + .local~my.idProductModel = .ProductModel~newInstance -- create a ProductModel instance + .local~my.idProductData~activate + .local~my.idProductModel~activate + .ProductView~newInstance(rootDlg,"CU003") + --say "ProductListView-showProduct-04: after startProductView" + self~disableControl("IDC_PRODLIST_SHOWPRODUCT") + end + else do + say "ProductListView-showProduct-05: ~getItemInfo returned .false." + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD loadList + expose lvProducts + lvProducts~addRow(2, ,"CU003","Widget, 5in") + lvProducts~addRow(4, ,"CU025","Slodget, case of 24", "RG7 3UP") + lvProducts~addRow(3, ,"DX210","Driblet, 5in, 10-pack, no delivery.", "021956") + do i = 1 to 50 + lvProducts~addRow(i, , "Line" i, i) + end + lvProducts~setColumnWidth(1) -- set width of 2nd column to longest text entry. + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + HRSplv (Human-Readable Strings for ProductListView) v01-00 06Jun12 + ------ + The HRS class provides constant character strings for user-visible messages + issued by the ProductListView class. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +::CLASS HRSplv PRIVATE -- Human-Readable Strings + ::CONSTANT noMenu "This menu item is not yet implemented." + ::CONSTANT newProd "New Product" + ::CONSTANT helpAbout "Help - About" + ::CONSTANT nilSelected "Please select an item first." + +/*============================================================================*/ + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductModelData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductModelData.rex new file mode 100755 index 0000000..b88897c --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductModelData.rex @@ -0,0 +1,171 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 04b: The ProductModel and ProductData Classes v00-03 08Aug11 + + Contains: classes "ProductModel", "ProductResource", and "ProductDT". + Pre-requisites: None. + + Outstanding Problems: + None. + + Changes: + v00-02: 21Jly11 + v00-03: Correct "return" statement not in right place (typo in code!!) + Renamed the ProductDT attributes (initial "prod" deemed extraneous) + - 26Aug11: added some comments - no change to function. +------------------------------------------------------------------------------*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductModel v00-02 12Jly11 + ------------ + The "model" part of the Product component. + + interface productModel{ + aProductModel newInstance() -- Class method. + null activate() + aProductDT query() + }; + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductModel PUBLIC + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + -- Creates an instance and returns it. + aProductModel = self~new + return aProductModel + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD activate PUBLIC + -- Gets its data from ProductData. + expose data + idProductData = .local~my.idProductData + data = idProductData~getData + + + ::METHOD query PUBLIC + -- Returns data requested (no argument = return all) + expose data + say "ProductModel-query." + return data +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductData v01-00 20Jly11 + ------------ + The "data" part of the Product component. + [interface (idl format)] + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductData PUBLIC + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + aProductData = self~new + return aProductData + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate PUBLIC + expose data + data = .ProductDT~new + data~number = "CF300/X" + data~name = "Widget Box" + data~price = "2895" + data~uom = "6" + data~description = "A 10 litre case with flat sides capable of holding quite a lot of stuff." + data~size = "M" + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getData PUBLIC + expose data + say "ProductData-getData." + return data + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductDT - A business data type for Product data. v00-02 07Aug11 + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/ + +::CLASS ProductDT PUBLIC + + -- dtName XML Name Description + -- --------- ---------- ------------------------------- + -- ProductDT product + ::ATTRIBUTE number -- number Product Number + ::ATTRIBUTE name -- name Product Description + ::ATTRIBUTE price -- price Product Price (rightmost two digits are 100ths of currency unit) +--::ATTRIBUTE currency -- currency Three-letter currency code + ::ATTRIBUTE uom -- uom Product Unit of Measure + ::ATTRIBUTE description -- descrip Product Description + ::ATTRIBUTE size -- size Produce Size Category (S/M/L) + + ::METHOD list PUBLIC + expose number name price uom description size + say "---------------" + say "ProductDT-List:" + say "Number: " number "Name:" name + say "Price:" price "UOM:" uom "Size:" size + say "Description:" description + say "---------------" +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductView.h b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductView.h new file mode 100644 index 0000000..b22805a --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductView.h @@ -0,0 +1,69 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_PRODUCT_VIEW 106 +#define IDR_PRODUCT_VIEW_MENU 107 +#define IDD_PRODUCT_VIEW_ABOUT 108 +#define IDB_PROD_ICON 112 +#define IDI_PROD_DLGICON 113 +#define IDC_PRODABT_ICON_PLACE 1000 +#define IDC_PROD_NO 1000 +#define IDC_PROD_UOM 1001 +#define IDC_PROD_DESCRIPTION 1002 +#define IDC_PROD_STATIC2 1003 +#define IDC_PROD_STATIC3 1004 +#define IDC_PROD_STATIC1 1005 +#define IDC_PROD_STATIC4 1007 +#define IDC_PROD_STATIC5 1008 +#define IDM_PROD_UPDATE 40000 +#define IDM_PROD_REFRESH 40001 +#define IDM_PROD_CLOSE 40002 +#define IDM_PROD_PRINT 40003 +#define IDM_PROD_ABOUT 40004 +#define IDC_PROD_NAME 40010 +#define IDC_PROD_LIST_PRICE 40012 +#define IDC_PROD_SIZE_GROUP 40013 +#define IDC_PROD_SAVE_CHANGES 40014 +#define IDC_PROD_RADIO_SMALL 40015 +#define IDC_PROD_RADIO_MEDIUM 40016 +#define IDC_PRODABT_STATIC1 40017 +#define IDC_PROD_RADIO_LARGE 40017 +#define IDC_PRODABT_STATIC2 40018 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductView.rc new file mode 100644 index 0000000..742651b --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductView.rc @@ -0,0 +1,124 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + + +#include +#include +#include +#include "ProductView.h" + + + + +// +// Bitmap resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDB_PROD_ICON BITMAP ".\\res\\producticon.bmp" + + + +// +// Menu resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_PRODUCT_VIEW_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "&Update Product", IDM_PROD_UPDATE + MENUITEM "Refresh Data", IDM_PROD_REFRESH + MENUITEM "Print...", IDM_PROD_PRINT + MENUITEM "Close", IDM_PROD_CLOSE + } + POPUP "Help" + { + MENUITEM "About...", IDM_PROD_ABOUT + } +} + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PRODUCT_VIEW DIALOG 0, 0, 248, 228 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Product" +FONT 8, "Ms Shell Dlg" +{ + LTEXT "Product Number:", IDC_PROD_STATIC1, 25, 28, 54, 8, SS_LEFT + LTEXT "Product Name:", IDC_PROD_STATIC2, 25, 53, 48, 8, SS_LEFT + LTEXT "List Price:", IDC_PROD_STATIC3, 25, 78, 32, 8, SS_LEFT + LTEXT "UOM:", IDC_PROD_STATIC5, 151, 78, 20, 8, SS_LEFT + LTEXT "Description", IDC_PROD_STATIC4, 25, 103, 36, 8, SS_LEFT + EDITTEXT IDC_PROD_NO, 95, 25, 50, 14, NOT WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_PROD_NAME, 95, 51, 130, 13, ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_PROD_LIST_PRICE, 95, 75, 40, 14, ES_AUTOHSCROLL | ES_READONLY, WS_EX_RIGHT + EDITTEXT IDC_PROD_UOM, 175, 75, 40, 14, ES_AUTOHSCROLL | ES_READONLY, WS_EX_RIGHT + GROUPBOX "Size Category", IDC_PROD_SIZE_GROUP, 31, 151, 189, 30, WS_GROUP, WS_EX_CLIENTEDGE + AUTORADIOBUTTON "Small", IDC_PROD_RADIO_SMALL, 46, 165, 33, 8, WS_DISABLED + AUTORADIOBUTTON "Medium", IDC_PROD_RADIO_MEDIUM, 110, 165, 41, 8, WS_DISABLED + AUTORADIOBUTTON "Large", IDC_PROD_RADIO_LARGE, 168, 165, 34, 8, WS_DISABLED + DEFPUSHBUTTON "Save Changes", IDC_PROD_SAVE_CHANGES, 180, 195, 52, 14, WS_DISABLED + EDITTEXT IDC_PROD_DESCRIPTION, 95, 100, 125, 30, ES_MULTILINE +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PRODUCT_VIEW_ABOUT DIALOG 0, 0, 204, 109 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "About Product View" +FONT 8, "Ms Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 143, 88, 50, 14 + CONTROL "", IDC_PRODABT_ICON_PLACE, WC_STATIC, SS_BITMAP | SS_NOTIFY | SS_REALSIZECONTROL, 16, 7, 102, 71 + LTEXT "A view of a Product component.", IDC_PRODABT_STATIC1, 15, 84, 110, 15, SS_LEFT + LTEXT "An example of an About box using .ResDialog.", IDC_PRODABT_STATIC2, 130, 9, 65, 65, SS_LEFT +} + + + +// +// Icon resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_PROD_DLGICON ICON ".\\res\\Product.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductView.rex new file mode 100755 index 0000000..b684411 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/ProductView.rex @@ -0,0 +1,499 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 06: ProductView.rex - The ProductView component v01-01 01Apr13 + + Contains: classes "ProductView", "AboutDialog", and "HRSpv". + + Pre-requisites: ProductView.dll, ProductView.h, Pproduct.ico, ProductIcon.bmp, + Support\NumberOnlyEditEx.cls (copied from ooDialog Samples + into the folder Exercise06\Support) + + Description: A sample Product View component - part of the sample + Order Management application. + + Outstanding Problems: None reported. + + Changes: + v01-00 03Jun12: First version for Exercise05. + v01-01 06Jun12: Minor changes for Exercise06. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + +------------------------------------------------------------------------------*/ + +.Application~addToConstDir("Product\ProductView.h") + + +::requires "ooDialog.cls" +::requires "Support\NumberOnlyEditEx.cls" +::requires "Product\ProductModelData.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductView v01-01 06Jun12 + ----------- + The "view" part of the Product component. Now designed to operate from its own + folder. Should be invoked from immediately outside the Product folder. + [interface (idl format)] + + Changes: + v01-00 03Jun12: First version. + v01-01 06Jun12: Minor changes for Exercise06. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductView SUBCLASS ResDialog PUBLIC + + ::ATTRIBUTE dialogState PRIVATE -- States are: 'closable' or 'inUpdate". + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC UNGUARDED + use arg rootDlg, productNo --ADDED FOR EXERCISE06. + if parent = "SA" then hasParent = .false; else hasParent = .true + --say ".ProductView-newInstance-01: rootDlg =" rootDlg + .Application~addToConstDir("Product\ProductView.h") + -- Create an instance of ProductView and show it: + dlg = .ProductView~new("Product\res\ProductView.dll", IDD_PRODUCT_VIEW) + dlg~activate(rootDlg, productNo) -- CHANGED FOR EXERCISE06. + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + --say "ProductView-init-01." + -- called first (result of .ProductView~new) + forward class (super) continue + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + use arg rootDlg, productNo --ADDED FOR EXERCISE06. + --say "ProductView-activate-01: rootDlg =" rootDlg + self~dialogState = "closable" + if rootDlg = "SA" then self~execute("SHOWTOP","IDI_PROD_DLGICON") --ADDED FOR EXERCISE06. + else self~popUpAsChild(rootDlg,"SHOWTOP",,"IDI_PROD_DLGICON") --ADDED FOR EXERCISE06. + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar prodControls prodData + --say "ProductView-initDialog-01" + + menuBar = .BinaryMenuBar~new(self, IDR_PRODUCT_VIEW_MENU, , self, .true) + + prodControls = .Directory~new + prodControls[ecProdNo] = self~newEdit("IDC_PROD_NO") + prodControls[ecProdName] = self~newEdit("IDC_PROD_NAME") + prodControls[ecProdPrice] = self~newEdit("IDC_PROD_LIST_PRICE") + prodControls[ecUOM] = self~newEdit("IDC_PROD_UOM") + prodControls[ecProdDescr] = self~newEdit("IDC_PROD_DESCRIPTION") + prodControls[gbSizes] = self~newEdit("IDC_PROD_SIZE_GROUP") + prodControls[rbSmall] = self~newRadioButton("IDC_PROD_RADIO_SMALL") + prodControls[rbMedium] = self~newRadioButton("IDC_PROD_RADIO_MEDIUM") + prodControls[rbLarge] = self~newRadioButton("IDC_PROD_RADIO_LARGE") + prodControls[pbSaveChanges] = self~newPushButton("IDC_PROD_SAVE_CHANGES") + self~connectButtonEvent("IDC_PROD_SAVE_CHANGES","CLICKED",saveChanges) + + -- Use NumberOnlyEditEx.cls to enforce numeric only entry for Price and UOM: + prodControls[ecProdPrice]~initDecimalOnly(2,.false) -- 2 decimal places, no sign. + prodControls[ecUOM]~initDecimalOnly(0,.false) -- 0 decimal places, no sign. + prodControls[ecProdPrice]~connectCharEvent(onChar) + prodControls[ecUOM]~connectCharEvent(onChar) + + prodData = self~getData -- Gets data from ProductModel into prodData + self~showData -- Show the data + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Event Handler Methods - MenuBar Events: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD updateProduct UNGUARDED + expose prodControls + + -- Enable the controls to allow changes to the data: + prodControls[ecProdName]~setReadOnly(.false) + prodControls[ecProdPrice]~setReadOnly(.false) + prodControls[ecUOM]~setReadOnly(.false) + prodControls[ecProdDescr]~setReadOnly(.false) + prodControls[rbSmall]~enable + prodControls[rbMedium]~enable + prodControls[rbLarge]~enable + self~enableControl("IDC_PROD_SAVE_CHANGES") + prodControls[pbSaveChanges]~state = "FOCUS" -- Put input focus on the button + self~tabToNext() -- put text cursor on Product Description + -- (as if the user had pressed tab) + self~dialogState = "inUpdate" + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD refreshData UNGUARDED + self~disableControl("IDC_PROD_SAVE_CHANGES") + self~showData + self~dialogState = "closable" + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD print UNGUARDED + -- say "ProductView-print-01" + ans = MessageDialog(.HRSpv~printMsg) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD close UNGUARDED + --say "ProductView-close-01" + return self~cancel:super + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + --say "ProductView-about-01" + dlg = .AboutDialog~new("ProductView.dll", IDD_PRODUCT_VIEW_ABOUT) + dlg~execute("SHOWTOP") + + + /*---------------------------------------------------------------------------- + Event Handler Methods - PushButton Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + "Save Changes" - Collects new data, checks if there has indeed been a + change, and if not, issues a warning msg. Disables the + button when valid changes made. */ + ::METHOD saveChanges UNGUARDED + expose prodControls prodData + + -- Transform data from view format (as in controls) to app format (a directory): + newProdData = self~xformView2App(prodControls) + + -- Check if anything's changed; if not, show msgbox and exit with controls enabled. + -- If changed, go on to validate data. + result = self~checkForChanges(newProdData) + if result = .false then do + msg = .HRSpv~nilSaved + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRSpv~updateProd,"OK","WARNING","DEFBUTTON2 APPLMODAL") + return + end + + -- Now validate data: + result = self~validate(newProdData) -- returns a null string or error messages. + -- Better would be a set of error numbers. + -- If no problems, then show msgbox and go on to disable controls. + if result = "" then do + msg = .HRSpv~saved + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRSpv~updateProd,"OK","INFORMATION","DEFBUTTON1 APPLMODAL") + end + -- If problems, then show msgbox and leave user to try again or refresh or exit. + else do + msg = result||.EndOfLine||.HRSpv~notSaved + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRSpv~updateProd,"OK","ERROR","DEFBUTTON1 APPLMODAL") + return + end + + -- Send new data to be checked by CustomerModel object (not implemented). + + -- Disable controls that were enabled by menu "ActionsFile-->Update" selection: + prodControls[ecProdName]~setReadOnly(.true) + prodControls[ecProdDescr]~setReadOnly(.true) + prodControls[ecProdPrice]~setReadOnly(.true) + prodControls[ecUom]~setReadOnly(.true) + if newProdData~size \= "S" then prodControls[rbSmall]~disable + if newProdData~size \= "M" then prodControls[rbMedium]~disable + if newProdData~size \= "L" then prodControls[rbLarge]~disable + self~disableControl("IDC_PROD_SAVE_CHANGES") + self~dialogState = "closable" + + prodData = newProdData + prodData~list + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Event Handler Methods - Keyboard Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD onChar UNGUARDED + -- called for each character entered in the price or UOM fields. + forward to (arg(6)) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + "OK" - This is a no-op method that over-rides the default Windows action + of 'close window' for an Enter key --*/ + ::METHOD ok unguarded + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD cancel + -- If in the process of updating, then ask whether any changes should be + -- thrown away and dialog closed. If yes then close by calling the superclass, + -- else nop. If not in update, then close immediately + if self~dialogState = "inUpdate" then do + ans = MessageDialog(.HRSpv~closeInUpdate, self~dlgHandle, .HRSpv~updateIP, "YESNO", "WARNING", "DEFBUTTON2") + if ans = .PlainBaseDialog~IDYES then return self~cancel:super + else nop + end + else return self~cancel:super + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getData + -- Get data from the ProductModel: + --expose prodData + --say "ProductView-getData-01." + idProductModel = .local~my.idProductModel + prodData = idProductModel~query -- prodData is of type ProductDT + return prodData + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showData + -- Transfrom data (where necessary) to display format, and then disable controls. + expose prodControls prodData + --say "ProductView-showData-01." + -- Set data in controls: + prodControls[ecProdNo]~setText( prodData~number ) + prodControls[ecProdName]~setText( prodData~name ) + -- Price in prodData has no decimal point - 2 decimal places are implied - hence /100 for display. + prodControls[ecProdPrice]~setText(prodData~price/100 ) + prodControls[ecUOM]~settext( proddata~uom ) + prodControls[ecProdDescr]~setText(prodData~description ) + size = prodData~size + -- Disable controls + prodControls[ecProdName]~setReadOnly(.true) + prodControls[ecProdPrice]~setReadOnly(.true) + prodControls[ecUOM]~setReadOnly(.true) + prodControls[ecProdDescr]~setReadOnly(.true) + prodControls[rbSmall]~disable + prodControls[rbMedium]~disable + prodControls[rbLarge]~disable + -- But check correct button and enable it to highlight it to the user: + select + when size = "S" then do + .RadioButton~checkInGroup(self,"IDC_PROD_RADIO_SMALL","IDC_PROD_RADIO_LARGE","IDC_PROD_RADIO_SMALL") + prodcontrols[rbSmall]~enable + end + when size = "M" then do + .RadioButton~checkInGroup(self,"IDC_PROD_RADIO_SMALL","IDC_PROD_RADIO_LARGE","IDC_PROD_RADIO_MEDIUM") + prodcontrols[rbMedium]~enable + end + otherwise do + .RadioButton~checkInGroup(self,"IDC_PROD_RADIO_SMALL","IDC_PROD_RADIO_LARGE","IDC_PROD_RADIO_LARGE") + prodcontrols[rbLarge]~enable + end + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD checkForChanges + -- Check whether any data has actually changed when "Save Changes" button + -- has been pressed. Return .true if data changed, else returns .false. + expose prodData + use arg newProdData + + changed = .false + select + when newProdData~name \= prodData~name then changed = .true + when newProdData~price \= prodData~price then changed = .true + when newProdData~uom \= prodData~uom then changed = .true + when newProdData~description \= prodData~description then changed = .true + when newProdData~size \= ProdData~size then changed = .true + otherwise nop + end + return changed + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD validate + -- Validation: 1. Check price/UOM not changed > 50% up or down. + -- 2. Cannot change from Large to Small without UOM increasing + -- by at least 100%; nor from Small to Large without + -- decreasing by more than 50%. + -- 3. Product Description <= 100 characters. + -- 4. Product Name <= 30 characters. + -- Returns string of messages - the null string if all OK. + expose prodData + use arg newProdData + msg = "" + + -- Check Price (catches decimal point errors also): + price = prodData~price; newPrice = newProdData~price + oldUom = prodData~uom; newUom = newProdData~uom -- 'oldUom - avoids name conflict with 'uom' in newProddata~uom. + if ((price/oldUom)*1.5 < newPrice/newUom) | (newPrice/newUom < (price/oldUom)/2) then do + msg = msg||.HRSpv~badRatio||" " + end + + -- Check Size vs UOM: + if prodData~size = "L" & newProdData~size = "S" - -- Large to Small + & prodData~uom/2 < newProdData~uom then do + msg = msg||.HRSpv~uomTooBig||" " + end + if prodData~size = "S" & newProdData~size = "L" - -- Small to Large + & prodData~uom*2 > newProdData~uom then do + msg = msg||.HRSpv~uomTooSmall||" " + end + + -- Check Product Description length: + if newProdData.description~length > 80 then do + msg = msg||.HRSpv~descrTooBig||" " + end + + -- Check Product Name length: + if newProdData~name~length > 30 then do + msg = msg||.HRSpv~prodNameTooBig + end + + return msg + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD xformView2App + -- Transforms Product Data from View form (in the GUI controls) to + -- App form (a directory with address as an array). + expose prodControls + prodData = .ProductDT~new + prodData~number = prodControls[ecProdNo]~gettext() + prodData~name = prodControls[ecProdName]~getText() + price = prodControls[ecProdPrice]~getText() + -- Data entered has or assumes a decimal point; but data in "application" + -- is a whole number (e.g. $42.42 is recorded in the database as "4242"). + -- So re-format data from decimal to whole number: + priceTwoDecs = price~format(,2) -- force 2 dec positions + -- Re-display price properly formatted (in case the user did not format correctly - e.g. entered "42" or "38.4"): + prodControls[ecProdPrice]~setText(priceTwoDecs) + -- Now format price to "application" format: + price = (priceTwoDecs*100)~format(,0) -- multiply by 100 and then force whole number. + prodData~price = price + prodData~uom = prodControls[ecUOM]~getText() + prodData~description = prodControls[ecProdDescr]~getText() + select + when prodControls[rbSmall]~checked then prodData~size = "S" + when prodControls[rbMedium]~checked then prodData~size = "M" + otherwise prodData~size = "L" + end + + return prodData + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + AboutDialog v01-00 03Jun12 + ------------- + The "About" class - shows a dialog box that includes a bitmap - part of the + ProductView component. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS AboutDialog SUBCLASS ResDialog + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method initDialog + expose font image + resImage = .ResourceImage~new(self) -- Create an instance of a resource image + image = resImage~getImage(IDB_PROD_ICON) -- Create an image from the Product bitmap + stImage = self~newStatic(IDC_PRODABT_ICON_PLACE)~setImage(image) -- Create a static text control and set the image in it + font = self~createFontEx("Ariel", 12) -- Create up a largish font with which to display text and ... + self~newStatic(IDC_PRODABT_STATIC2)~setFont(font) -- ... set the static text to use that font. + -- Provide for a double-click in Product icon: + self~connectStaticNotify("IDC_PRODABT_ICON_PLACE", "DBLCLK", showMsgBox) + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method showMsgBox + --say "AboutDialog-showMsgBox-01." + ans = MessageDialog(.HRSpv~AboutDblClick) + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method leaving + expose font image + self~deleteFont(font) + image~release() + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRSpv) v01-00 03Jun12 + ------------------------------ + The HRSpv class provides constant character strings for user-visible messages. + + Changes: + v00-03 11Feb12: Changed class name NRS to HRSpv + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSpv PRIVATE -- Human-Readable Strings + ::CONSTANT AboutDblClick "You double-clicked!" + ::CONSTANT badRatio "The new price/UOM ratio cannot be changed more than 50% up or down." + ::CONSTANT closeInUpdate "Any changes made will be lost. Exit anyway?" + ::CONSTANT descrTooBig "The Product Description is too long." + ::CONSTANT nilSaved "Nothing was changed! Data not saved." + ::CONSTANT notSaved "Changes Not Saved!" + ::CONSTANT prodNameTooBig "The Product Name is too long." + ::CONSTANT saved "Changes saved." + ::CONSTANT uomTooBig "The new UOM is too large." + ::CONSTANT uomTooSmall "The new UOM is too small." + ::CONSTANT updateIP "Update in process" + ::CONSTANT updateProd "Update Product" + ::CONSTANT printMsg "The 'Print...' menu item is not yet implemented." + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/StartupProduct.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/StartupProduct.rex new file mode 100755 index 0000000..78a0069 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/StartupProduct.rex @@ -0,0 +1,62 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise06: Stand-alone startup for Product + startupProduct.rex v01-00 06Jun12 + + Contains: Startup code. + Pre-requisites: Must be run from the parent folder of the Product folder. + + Changes: + v01-00 06Jun12: First Version + + Outstanding Problems: None reported. +*******************************************************************************/ + +.Application~setDefaults("O", , .false) + +.local~my.idProductData = .ProductData~newInstance -- create a ProductData instance +.local~my.idProductModel = .ProductModel~newInstance -- create a ProductModel instance +.local~my.idProductData~activate +.local~my.idProductModel~activate + +.ProductView~newInstance("SA") + +::requires "Product\ProductView.rex" +::requires "Product\ProductModelData.rex" + +/******************************************************************************/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/StartupProductList.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/StartupProductList.rex new file mode 100755 index 0000000..c0e1e48 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/StartupProductList.rex @@ -0,0 +1,57 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise06: Stand-alone startup for ProductList + startupProductList.rex v01-00 06Jun12 + + Contains: Startup code. + Pre-requisites: Must be run from the parent folder of the Product folder. + + Changes: + v01-00 06Jun12: First Version + + Outstanding Problems: None reported. +*******************************************************************************/ + +.Application~setDefaults("O", , .false) + +.ProductListView~newInstance("SA") + +::requires "Product\ProductListView.rex" + + +/******************************************************************************/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/ProdList.bmp b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/ProdList.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6e4e8c14117bbb55d59e59ab37c5452bc0ebf503 GIT binary patch literal 2166 zcmd6mO-{rx426xv0*MV3H($6=ixaCD#mPHm@VaAGoZeWbKXY zymIL1Q$AEpZtBbs~FcyPw2{w~hckMz#zq^_LIH2z8MnmEV&Or0>%WWQ z+~@in%neJGZ#7{*78M{8^TLqNw^~c=9mFH8%hcaMo#UYRRuix)>LRDXnGgEg5kGI_Beam(4 G{^1vcAq+$S literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/ProdList.ico b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/ProdList.ico new file mode 100644 index 0000000000000000000000000000000000000000..51333f85647fcd2128fd4443472a5a2a4cd5b2a1 GIT binary patch literal 2686 zcmeH`y>Y`Z426-qRH>3C1E@-$1ypzi?T|6Nx$+)BP$0!4biNcROj{&{50ChfB=Uma zy1rw6m7h0}PZ9aTwc@(tqJ1`Yg_!Ty>^uHunQ8uvZ5XmFi|FQ?Lv+@SnE5h4r`4XH z@U4XQ4B+1AQ+{@6^(pTh`uOOTHOH4OKSXn)erJ8k8;5~DIcxn^**J`2eazZBfom-X1{t2L}6-a9|A<4=}OmuW(CJ-$kv!gEKz$ z4{@eG(>te=x^l6h@h@`M#5Lw0?Y_@A5@+|V|1OH_nCo*eH*8gY)C7CVZx}@})Mp$4 zT+b31ug!YEHK{T&d{sb?LoDeTzaggmB;KTP<3Hq4S#?YrCes(YIlTR z;D&O)hOpFFV1pW)fCLj3?M%5W8dliybz|C%3zvp(@|^cvCMPo=P(Y8x0vb#3#spXa z)DYT&M6&yTt9Gv!p3Y8qy1L-;`S6mwBCq{^czSy9R#oBEGxu`y^w9Uq5A`X(lz5{(2&|Kubz5+Fem%I4G*LetX-lhDizK9JDt zEZ&pw+#JI5^N1`gU?3XBz~UkXmzFTNyo`@4D~QEn__Vr;&sl40_(G!V>-e#;fnS@O z_!^JnTUH{0IOTU;M}p=$r9pJVfI)t4Z6TRVB2Jmu-iE%j17mj=$y5rdy*>Qi-$y!~ zMmm#0h8)&m2mXf+xRm^obC;YetvAc0%F7Iuk|bSvsBpRIBr6vg${9t&Q!Y22vat&c z6*ikqym~kP{F;-u-a6y3UtzF29Mv`TPX3@Nw`=$4eT!hNVz3Ir*(yNEyRQz<^VW2q zeB-nz*ck*-Jb$sy$sgT5QCfQZ2w*mwkDa^EWu^A0sj#>JC^8k6G`^t!al745+V0Tk Ve*BDIcQv=T{!~kI?$`Xw`~Vw((KY}8 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/ProductIcon.bmp b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/ProductIcon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..13ca9acc4179b04c02b504064d5b3f0218fe66f8 GIT binary patch literal 268234 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 NNPq-NNI<+V{0~hZ)gJ%= literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/ProductView.dll b/modules/windows/oodialog/userGuide/exercises/Exercise06/Product/res/ProductView.dll new file mode 100644 index 0000000000000000000000000000000000000000..e7e1e640150a2f6497bb2a457e36c6c9ce132afa GIT binary patch literal 272896 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 2>&1 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Startup.rex b/modules/windows/oodialog/userGuide/exercises/Exercise06/Startup.rex new file mode 100755 index 0000000..b2988c0 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Startup.rex @@ -0,0 +1,63 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 06: The Order Management Application + Startup.rex v01-00 06Jun12 + + Description: This file is the "application" or "root" or "starter" part + of the sample Order Management application. + + Changes: + v00-01 06Jun12: First version. + +------------------------------------------------------------------------------*/ + +parse arg pwOption +if pwOption = "enterPW" then do + pwd = PasswordBox("Please enter your password","Sign In") + if pwd \= "Password" then exit +end + +-- Set application defaults: +.Application~setDefaults("O", , .false) + +-- Start OrderMgrView: +.OrderMgrView~newInstance + +::REQUIRES "OrderMgr\OrderMgrView.rex" + +/******************************************************************************/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise06/Support/NumberOnlyEditEx.cls b/modules/windows/oodialog/userGuide/exercises/Exercise06/Support/NumberOnlyEditEx.cls new file mode 100644 index 0000000..9613851 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise06/Support/NumberOnlyEditEx.cls @@ -0,0 +1,526 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * The NumberOnlyEditEx class extends the .Edit class to provide an edit + * control which restricts entry to decimal only, or signed decimal only, + * numbers. + * + * The NumberOnlyEditEx.cls file is meant to be included in any ooDialog + * program where this extension to the edit control is desired. The programmer + * needs to take 4 steps to gain the functionality of a signed decimal number + * only edit control: + * + * 1.) Require the NumberOnlyEditEx.cls file (this file.) + * + * ::requires 'NumberOnlyEditEx.cls' + * + * 2.) Invoke the initDecimalOnly() method on each edit control object that is + * to be a decimal number only edit control. If initDecimalOnly() is not + * invoked, the behaviour of the edit control is unchanged. + * + * editObject = self~newEdit(IDC_EDIT) + * editObject~initDecimalOnly(decimalPlaces, allowSign) + * + * arguments: + * + * decimalPlaces [optional] The number of decimal places allowed in the + * number. The default is 2. Specifying 0 + * decimal places is acceptable. + * + * allowSign [optional] If a sign character (+ or -) is allowed as the + * leading character of the number. The default + * is .false. Specify .true to allow a sign + * character. + * + * 3.) For each decimal only edit control, the character event must be + * connected to a method in the Rexx dialog object. + * + * editObject = self~newEdit(IDC_EDIT) + * editObject~connectCharEvent(onChar) + * + * 4.) In the connected character event handler, the message and its arguments + * must be forwarded on to the onChar() method of the edit control. The + * 6th argument to the event handler is the dialog control object where the + * character event occurred. That is the object the event must be forwared + * to. + * + * When the programmer connects the character event to a method named + * onChar, the event handler is simple: + * + * ::method onChar unguarded + * forward to (arg(6)) + * + * If the programmer chooses a different method name for the event handler, + * then he must be sure to forward to the onChar() method of the edit + * control: + * + * ::method myOwnMethodName unguarded + * forward message 'onChar' to (arg(6)) + * + * And of course there is no reason why the event handler can not be coded + * using the explicit arguments: + * + * ::method myOwnMethodName unguarded + * use arg char, isShift, isCtrl, isAlt, misc, control + * forward message 'onChar' to (control) + */ + + -- Extend the .Edit control by inheriting the .NumberOnlyEditEx mixin class. + + .Edit~inherit(.NumberOnlyEditEx, .EditControl) + +::requires 'ooDialog.cls' +::requires 'winsystm.cls' + +::class 'NumberOnlyEditEx' public mixinclass object + +-- Users of the signed decimal number only edit control must invoke +-- initDecimalOnly() first to assign decimal places and specify if the sign +-- character is allowed. Until this is done, there is no change to the +-- behaviour of the Edit control object. +::method initDecimalOnly + expose decimalPlaces signOk initialized clipBoard + use strict arg decimalPlaces = 2, plusMinus = .false + + if plusMinus~isA(.String), plusMinus~datatype('O') then signOk = plusMinus + else signOk = .false + + initialized = .true + clipBoard = .WindowsClipboard~new + +-- The onChar() method should be inovked at every character event. Returning +-- true allows the character, returning false disallows the character. When a +-- character is not allowed, an edit ballon is set with a message explaining to +-- the user why the character is not appearing when they type. +::method onChar unguarded + expose decimalPlaces initialized signOk + use arg char, isShift, isCtrl, isAlt, misc, control + + if \ var('initialized') then return .true + + if misc~pos("extended") <> 0, self~isExtendedKey(char) then return .true + + if char == 8 then return .true + if signOk, (char == 43 | char == 45) then return self~checkSign + if char == 46 then return self~checkDecimal + if char >= 48, char <= 57 then return self~checkDigit + + if isCtrl, \isAlt, \isShift then return self~checkControlKey(char) + + reply .false + self~charBalloon + + +/** checkDigit() + * + * Checks that the digit being typed, at the cursor position, is allowed. + */ +::method checkDigit private unguarded + expose decimalPlaces signOk + + text = self~getText + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + if signOk, cursorPos == 1 then do + c = text~left(1) + + if c == '-' | c == '+' then do + reply .false + self~showBalloon(.MT~NUM_TITLE, .MT~HAS_SIGN, "ERROR") + return + end + return .true + end + + if decimalPos == 0 then return .true + + if cursorPos <= decimalPos then return .true + + if text~length < (decimalPos + decimalPlaces) then return .true + + reply .false + + msg = self~decimalPlacesUsedMsg + self~showBalloon(.MT~NUM_TITLE, msg, "ERROR") + + +/** checkSign() + * + * Checks that the sign character being typed is allowed at the current cursor + * position. Note that this method is only invoked when the sign character is + * allowed. + */ +::method checkSign private unguarded + expose decimalPlaces + + text = self~getText + cursorPos = self~getCaretPos + + if cursorPos == 1 then do + if self~hasSign(text) then do + reply .false + self~showBalloon(.MT~SIGN_TITLE, .MT~HAS_SIGN, "ERROR") + return + end + + return .true + end + + reply .false + + decimalPos = text~pos('.') + if decimalPos <> 0 | decimalPlaces == 0 then msg = .MT~ONLY_NUMBER + else msg = .MT~ONLY_DECIMAL_NUMBER + + self~showBalloon(.MT~SIGN_TITLE, msg, "ERROR") + + +/** checkDecimal() + * + * Checks that the decimal point being typed is allowed at the current cursor + * position. + */ +::method checkDecimal private unguarded + expose decimalPlaces signOk + + text = self~getText + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + if decimalPlaces == 0 then do + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + return + end + + if decimalPos <> 0 then do + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + return + end + + if cursorPos == 1, signOk, self~hasSign(text) then do + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + return + end + + if text~length < cursorPos + decimalPlaces then return .true + + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + + +/** checkControlKey() + * + * Invoked for a control key combination (Ctrl-?). Anything other than Ctrl-V + * is automatically allowed. Ctrl-V is of course the paste operation. For + * Ctrl-V, we check that the result after pasting the text would be a valid + * signed decimal number, under the constraints for this object. If not, it + * is disallowed and a ballon set. + */ +::method checkControlKey private unguarded + expose clipBoard decimalPlaces + use strict arg char + + if char \== 22 then return .true -- Not Ctrl-V + + -- If there is no text data available we don't care, pasting it will not do + -- any harm. + if \ clipBoard~isDataAvailable then return .true + + pastedText = clipBoard~paste + + -- We have text to paste, need to check is the text acceptable, + -- and is it acceptable for where it will be placed. + text = self~getText + len = text~length + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + -- isValidDecimal() checks that the resulting text after inserting the pasted + -- text is valid. + if \ self~isValidDecimal(pastedText, text, cursorPos) then do + reply .false + self~pasteBalloon(pastedText, text, cursorPos) + return + end + + return .true + + +/** decimalPointBalloon() + * + * This method produces the proper balloon message text when a decimal point has + * been typed, but is not allowed at the current position. + */ +::method decimalPointBalloon private unguarded + expose decimalPlaces signOk + use strict arg decimalPos, cursorPos, text + + select + when cursorPos == 1 then do + if self~hasSign(text) then msg = .MT~HAS_SIGN + else if decimalPlaces == 0, signOk then msg = .MT~ONLY_WHOLE_SIGNED_NUMBER + else if signOk then msg = .MT~ONLY_SIGNED_NUMBER + else msg = .MT~ONLY_NUMBER + end + when decimalPlaces == 0 then do + msg = .MT~ONLY_WHOLE_NUMBER + end + when cursorPos <= decimalPos then do + msg = .MT~ONLY_NUMBER + end + when (decimalPos + decimalPlaces) > text~length then do + msg = .MT~ONLY_NUMBER + end + otherwise do + msg = self~decimalPlacesUsedMsg + end + end + -- End select + + self~showBalloon(.MT~DEC_TITLE, msg, "ERROR") + + +/** charBalloon() + * + * This method produces the proper balloon message when a character is typed. + */ +::method charBalloon private unguarded + expose decimalPlaces signOk + + text = self~getText + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + msg = .MT~ONLY_NUMBER + + select + when cursorPos == 1 then do + if self~hasSign(text) then msg = .MT~HAS_SIGN + else if decimalPlaces == 0, signOk then msg = .MT~ONLY_WHOLE_SIGNED_NUMBER + else if decimalPlaces == 0, \signOk then msg = .MT~ONLY_WHOLE_NUMBER + else if decimalPos == 0, signOk then msg = .MT~ONLY_SIGNED_DECIMAL_NUMBER + else if decimalPos == 0, \signOk then msg = .MT~ONLY_DECIMAL_NUMBER + else if signOk then msg = .MT~ONLY_SIGNED_NUMBER + else msg = .MT~ONLY_NUMBER + end + when decimalPlaces == 0 then do + msg = .MT~ONLY_WHOLE_NUMBER + end + when decimalPos == 0 then do + msg = .MT~ONLY_DECIMAL_NUMBER + end + when cursorPos <= decimalPos then do + msg = .MT~ONLY_NUMBER + end + when (decimalPos + decimalPlaces) > text~length then do + msg = .MT~ONLY_NUMBER + end + otherwise do + msg = self~decimalPlacesUsedMsg + end + end + -- End select + + self~showBalloon(.MT~CHAR_TITLE, msg, "ERROR") + + +/** pasteBalloon() + * + * This method produces the proper balloon message when text is pasted into the + * edit control that is not allowed. + */ +::method pasteBalloon private unguarded + expose decimalPlaces signOk + use strict arg pastedText, text, cursorPos + + if signOk then do + if decimalPlaces == 0 then msg = .MT~ONLY_PASTE_WHOLE_SIGNED + else msg = .MT~ONLY_PASTE_A_SIGNED decimalPlaces .MT~ONLY_PASTE_B + end + else do + if decimalPlaces == 0 then msg = .MT~ONLY_PASTE_WHOLE + else msg = .MT~ONLY_PASTE_A decimalPlaces .MT~ONLY_PASTE_B + end + + resultText = text~substr(1, cursorPos - 1) || pastedText || text~substr(cursorPos) + + -- Balloon text has to be less than 1023 characters. If we don't exceed that + -- length, we will show the incorrect text to the user. Otherwise we just + -- show the short message. Note that new line characters can be used to + -- format the balloon text. + len = msg~length + resultText~length + .MT~PASTED_A~length + .MT~PASTED_B~length + 8 + + if len < 1023 then do + msg ||= .endOfLine~copies(2) || .MT~PASTED_A || - + .endOfLine~copies(2) || '"'resultText'"' || - + .endOfLine~copies(2) || .MT~PASTED_B + end + + self~showBalloon(.MT~PASTE_TITLE, msg, "ERROR") + + +/** decimalPlacesUsedMsg() + * + * Convenience method to return the proper message for the situation where the + * allowable number of decimal places have been filled. + */ +::method decimalPlacesUsedMsg private unguarded + expose decimalPlaces + + if decimalPlaces == 1 then return .MT~ONLY_1_DECIMAL + else return .MT~ONLY_DECIMALS_A decimalPlaces .MT~ONLY_DECIMALS_B + + +/** isValidDecimal() + * + * Checks that the resulting text after the pasted text is inserted into text at + * the current position, results in a valid number using the current + * restrictions. Decimal places and sign allowed or not. + */ +::method isValidDecimal private unguarded + expose decimalPlaces signOk + use strict arg pasteText, text, cursorPos + + resultText = text~substr(1, cursorPos - 1) || pasteText || text~substr(cursorPos) + + -- Can't have any type of space character, tab, new line, etc.. + if resultText \== resultText~space(0) then return .false + + -- Eliminate obvious problems with decimals. + countDots = resultText~countStr(".") + if countDots > 1 then return .false + if decimalPlaces == 0, countDots > 0 then return .false + + -- Eliminate any problems with the sign character. + if signOk then do + if resultText~pos('-') > 1 | resultText~pos('+') > 1 then return .false + end + else do + if resultText~pos('-') <> 0 | resultText~pos('+') <> 0 then return .false + end + + + decimalPos = resultText~pos('.') + if decimalPos > 0 then do + if resultText~length - decimalPos > decimalPlaces then return .false + + -- Remove the decimal char so we can test for all digits. + resultText = resultText~changeStr('.', '') + end + + -- Remove the sign character if it exists. + if self~hasSign(resultText) then resultText = resultText~substr(2) + + -- Exponential notation can not be allowed. + if resultText~caselessPos('E') <> 0 then return .false + + if \ resultText~datatype('W') then return .false + + return .true + + +/** isExtendedKey + * + * Convenience method to test if the character, char, is an extended key we want + * to pass on to the edit control + */ +::method isExtendedKey private + use strict arg char + + if char >= 33, char <= 40 then return .true + if char == 45 | char == 46 | char == 8 then return .true + return .false + + +/** hasSign + * + * Convenience method to test if a text string starts with a sign (+ or -) + * character. + */ +::method hasSign private + use strict arg text + + c = text~left(1) + if c == '-' | c == '+' then return .true + return .false + + +/** getCaretPos() + * + * Returns the current caret (cursor) position of this edit control. + */ +::method getCaretPos private + return self~selection~startChar + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Class: MT + + This class is used to provide constant character strings. The strings are + used for the balloon messages put up by the NumberOnlyEditEx mixin class. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'MT' private +::constant CHAR_TITLE "Unacceptable Character" +::constant DEC_TITLE "Unacceptable Decimal Point" +::constant NUM_TITLE "Unacceptable Number" +::constant SIGN_TITLE "Unacceptable Sign Character" +::constant PASTE_TITLE "Unacceptable Pasted Text" + +::constant ONLY_NUMBER "You can only type a number here." +::constant ONLY_SIGNED_NUMBER "You can only type a number or the sign here." +::constant ONLY_DECIMAL_NUMBER "You can only type a number or the decimal point here." +::constant ONLY_SIGNED_DECIMAL_NUMBER "You can only type a number, the sign, or the decimal point here." +::constant ONLY_WHOLE_NUMBER "You can only type a number here. Only whole numbers are allowed." +::constant ONLY_WHOLE_SIGNED_NUMBER "You can only type a number or the sign here. Only whole numbers are allowed." + +::constant HAS_SIGN "You can not type here. The sign character is already in place." +::constant ONLY_1_DECIMAL "You can not type here. Only 1 decimal place is allowed." +::constant ONLY_DECIMALS_A "You can not type here. Only" +::constant ONLY_DECIMALS_B "decimal places are allowed." + +::constant ONLY_PASTE_WHOLE "You can only paste text here that produces a whole number." +::constant ONLY_PASTE_WHOLE_SIGNED "You can only paste text here that produces a signed whole number." +::constant ONLY_PASTE_A_SIGNED "You can only paste text here that produces a signed decimal number with" +::constant ONLY_PASTE_A "You can only paste text here that produces a decimal number with" +::constant ONLY_PASTE_B "or less decimal places." +::constant PASTED_A "Resulting text of:" +::constant PASTED_B "is not valid." diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerFile.txt b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerFile.txt new file mode 100644 index 0000000..651d7bc --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerFile.txt @@ -0,0 +1,6 @@ +CustNo | CustName | CustDisc | CustAddr | Zip +AB0784 | ABC Enterprises Inc. | B1 | 2145 Engle Blvd,Hardtown,FL | 37043 +AC0027 | Frith Motors Inc. | B1 | 124 Freeview St.,Mackfield,TX | 78254 +BA0314 | LMN & Partners | C2 | 116 High St.,Ensleigh,NV | 84394 +BA0526 | EJ Smith United Inc. | C1 | 3 Ventry Rd,Ventry,MS | 38216 +CU0003 | Red-On & Locus Inc. | A1 | 43 Main St,Plingford,AR | 48231 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerListView.h b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerListView.h new file mode 100644 index 0000000..62b5eb4 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerListView.h @@ -0,0 +1,48 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDI_CUSTLIST_DLGICON 103 +#define IDD_CUSTLIST_DIALOG 104 +#define IDR_CUSTLIST_MENU 105 +#define IDC_CUSTLIST_LIST 1001 +#define IDM_CUSTLIST_NEWCUST 40000 +#define IDC_CUSTLIST_SHOWCUST 40001 +#define IDM_CUSTLIST_ABOUT 40002 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerListView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerListView.rc new file mode 100644 index 0000000..073d8f2 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerListView.rc @@ -0,0 +1,73 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include +#include +#include +#include "CustomerListView.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_CUSTLIST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Customer...", IDM_CUSTLIST_NEWCUST + } + POPUP "Help" + { + MENUITEM "About...", IDM_CUSTLIST_ABOUT + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_CUSTLIST_DIALOG DIALOG 0, 0, 225, 273 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Customer List" +FONT 8, "Ms Shell Dlg" +{ + PUSHBUTTON "Cancel", IDCANCEL, 150, 235, 50, 14 + CONTROL "", IDC_CUSTLIST_LIST, WC_LISTVIEW, WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SORTASCENDING | LVS_NOSORTHEADER , 15, 10, 190, 215 + DEFPUSHBUTTON "Show Customer", IDC_CUSTLIST_SHOWCUST, 89, 235, 54, 14, WS_DISABLED +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_CUSTLIST_DLGICON ICON ".\\customer\\bmp\\CustList.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerListView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerListView.rex new file mode 100755 index 0000000..0c3614f --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerListView.rex @@ -0,0 +1,254 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: The Customer ListView v02-00 08Jan13 + + Contains: classes "CustomerListView" and "HRSclv". + + Pre-requisite: CustomerListView.rc, CustomerListView.h, CustList.ico + + Description: Provides a list of Customers and supports viewing any given + Customer via a double-click on that Customer's item in the list. + This is an "Intermediate" component - it is invoked by OrderMgmt, + and invokes CustomerView. + + v01-00 06Jun12: First Version. + v02-00 08Jan13: Removed stand-alone startup code (not needed after Ex06) + Commented out say's. + + Outstanding Problems: None reported. +*******************************************************************************/ + + +.Application~addToConstDir("Customer\CustomerListView.h") + +::REQUIRES "ooDialog.cls" +::REQUIRES "customer\customerview.rex" + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerListView v02-00 08Jan13 + ---------------- + The view of a list of Customers. + Changes: + v01-01: First version + v01-02: Corrected for standalone invocation. + v01-03 28Jan12: Changed name of HRS class to HRSplv. + v01-04 11Feb12: moved .application~setDefaults() to app startup file. + changed to .application~addToConstDir() here. + v01-05 19Feb12: Moved .Application~addToConstDir statement from newInstance + method to top of file - just before ::requires statement(s). + v01-06 29Mar12: Very minor mods - all just minor clean-ups. All comments removed + v02-00 17Aug12: Exercise07 - modified to use the MVF. + 08Jan13: Removed stand-alone startup (not now needed). + + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerListView SUBCLASS RcView PUBLIC + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use arg idCustomerListModel, rootDlg + --say "CustomerListView-newInstance-01: instName, rootDlg =" idCustomerListModel rootDlg + dlg = self~new("Customer\CustomerListView.rc", "IDD_CUSTLIST_DIALOG") + --say "CustomerListView-newInstance-02: dlg =" dlg + dlg~activate(idCustomerListModel, rootDlg) -- Must be the last statement. + return dlg + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + forward class (super) continue + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + menuBar = .ScriptMenuBar~new("Customer\CustomerListView.rc", "IDR_CUSTLIST_MENU", , , .true) + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose rootDlg modelData + use arg idCustomerListModel, rootDlg + --say "CustomerListView-activate-01." + forward class (super) continue -- required for MVF + modelData = RESULT -- super gets my data! + --say "CustomerListView-activate-02: rootDlg =" rootDlg + self~popupAsChild(rootDlg, "SHOWTOP", ,"IDI_CUSTLIST_DLGICON") + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar lvCustomers btnShowCustomer modelData + -- Called by ooDialog after SHOWTOP. + + menuBar~attachTo(self) + + lvCustomers = self~newListView("IDC_CUSTLIST_LIST"); + lvCustomers~addExtendedStyle("GRIDLINES FULLROWSELECT") + lvCustomers~insertColumnPX(0,"Number",60,"LEFT") + lvCustomers~insertColumnPX(1,"Name",220,"LEFT") + lvCustomers~insertColumnPX(2,"Zip",80,"LEFT") + self~connectListViewEvent("IDC_CUSTLIST_LIST","CLICK",itemSelected) -- Single click + self~connectButtonEvent("IDC_CUSTLIST_SHOWCUST","CLICKED",showCustomer) + self~connectListViewEvent("IDC_CUSTLIST_LIST","ACTIVATE",openItem) -- Double-click + + self~loadList + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newCustomer UNGUARDED + self~noMenuFunction(.HRSclv~newCust) + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSclv~helpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSclv~noMenu, self~hwnd, title, 'WARNING') + + + /*---------------------------------------------------------------------------- + Event Handling Methods - List Items + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD itemSelected UNGUARDED + use arg id, itemIndex, columnIndex, keyState + /* This method is fired when the user clicks on a row in the ListView. + If the user clicks on an empty row, then itemIndex is set to -1, else + the itemIndex is set to the 0-based row number. + If the user double-clicks on a row, this method is fired in response + to the first click but not to the second. If the row is empty, the second + click of the double-click is ignored, else the double-click method is + fired. + */ + if itemIndex > -1 then self~enableControl("IDC_CUSTLIST_SHOWCUST") + else self~disableControl("IDC_CUSTLIST_SHOWCUST") + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD openItem UNGUARDED + -- User double-clicked on an item in the ListView. + -- Note: does not get fired if double-click was on an empty row. + self~showCustomer + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showCustomer UNGUARDED + expose lvCustomers rootDlg + item = lvCustomers~selected + if item = -1 then do -- if no item selected. + ret = MessageDialog(.HRSclv~nilSelected, self~hwnd, title, 'WARNING') + return + end + info=.Directory~new + if lvCustomers~getItemInfo(item, info) then do + --say "CustomerListView-showCustomer-02: info~text =" info~text + objectMgr = .local~my.ObjectMgr -- Ex07 + objectMgr~showModel("CustomerModel", info~text, rootDlg) -- Ex07 + self~disableControl("IDC_CUSTLIST_SHOWCUST") -- Ex07 + end + else do + say "CustomerListView-showCustomer-04: ~getItemInfo returned .false." + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD loadList + expose lvCustomers modelData -- Ex07 + --say "CustomerListView-LoadList-00: modelData =" modelData + -- modelData is a directory. + --say "CustomerListView-loadList-01: No Records =" modelData[count] + rows = modelData[count] -- Ex07 - number of rows + arrData = modelData[records] + --say "CustomerListView-loadList-02:Dims =" arrData~dimension(1) arrData~dimension(2) + do i = 1 to rows -- Ex07 - omit the header line. + --say "CustomerListView-loadList-02: arr[i,1 =" arrData[i,1] + lvCustomers~addRow( , ,arrData[i,1],arrData[i,2],arrData[i,5]) + end + lvCustomers~setColumnWidth(1) -- set width of 2nd column to longest text entry. + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + HRSclv (Human-Readable Strings for CustomerListView) v01-00 06Jun12 + --- + The HRSclv class provides constant character strings for user-visible messages + issued by the CustomerListView class. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSclv PRIVATE -- Human-Readable Strings + ::CONSTANT noMenu "This menu item is not yet implemented." + ::CONSTANT newCust "New Customer" + ::CONSTANT helpAbout "Help - About" + ::CONSTANT nilSelected "Please select an item first." + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerModelsData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerModelsData.rex new file mode 100755 index 0000000..d311931 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerModelsData.rex @@ -0,0 +1,241 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: Customer Models and Data Classes v02-00 01Apr13 + + Contains: classes "CustomerModel" "CustomerListModel" and "CustomerData". + + Pre-requisites: None. + + Outstanding Problems: + None. + + Changes: + v01-00 07Jun12: First version. + v02-00 11Jan13: Modified to use the Model-View Framework with data read from + file using the GenericFile class. CustomerListModel added. + Commented out 'say' instructions. + 31Jan13: Removed 'query' method (it's in the superclass) from both + Customer and CustomerList - also removed code storing data + in self~myData. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + +------------------------------------------------------------------------------*/ + +::REQUIRES "Support\GenericFile.rex" +::REQUIRES "Support\Model.rex" + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerModel v01-01 09Aug12 + ------------ + The "model" part of the Customer component. + + Changes: + v01-00 07Jun12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerModel SUBCLASS Model PUBLIC + + ::ATTRIBUTE myData + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + expose noDataError + use strict arg instanceName + --say ".CustomerModel-newInstance-01; class name =" self~objectName + -- Get my data via my superclass: + forward class (super) continue + customerId = RESULT + return customerId + + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + use strict arg dirData + return self + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerListModel v02-00 13Jan08 + ---------------- + The model for a list of Customers. + Changes: + v00-01 15Aug12: First version + v02-00 13Jan08: Runs under MVF (Ex07). Commented out 'say's. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerListModel SUBCLASS Model PUBLIC + + ::ATTRIBUTE myData + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use arg instanceName + self~wantList = .true -- set super's attribute + forward class (super) continue + return RESULT + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + use arg dirData + --self~myData = arrdata + --say "CustomerListModel-init-01: myData =" self~myData + return self + +-- ::METHOD query PUBLIC + /*---------------------------------------------------------------------------- + query - returns an array of all Customer data. + In MVF this method is invoked by the RcView (or ResView) superclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --say "CustomerListModel-query-01." +-- return self~myData + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerData v01-01 09Aug12 + ------------ + The "data" part of the Customer component. + Changes: + v01-00 07Jun12: First version. + v02-00 09Aug12: Second version - subclasses GenericFile to read data from + a disk file. + 08Jan13: Commented out some 'say' instructions. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerData SUBCLASS GenericFile PUBLIC + + ::ATTRIBUTE created CLASS + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC -- Invoked by ObjectMgr + --use strict arg instanceName + if self~created = "CREATED" then do -- If this is first time + --say ".CustomerData-newInstance-01." + customerDataId = self~new() + self~created = .true + return customerDataId + end + else do + say ".CustomerData-newInstance-02 - Error - Singleton component, so can't have more than one instance." + return .false + end + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init PUBLIC + expose fileName numRecords + fileName = "Customer\CustomerFile.txt" + columns = 5 -- colums in the Customer "table" + numRecords = self~init:super(fileName, columns) + --say "CustomerData-init-01: numRecords:" numRecords + /* + if numRecords > 0 then do + say "CustomerData-init-02: Array is:" + say self~fileArray~tostring + end + */ + return self + + +/*============================================================================*/ + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerDT - A business data type for Customer data. v00-01 05May12 + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/ + +::CLASS CustomerDT PUBLIC + + -- dtName XML Name Description + -- --------- ---------- ------------------------------- + -- ProductDT product + ::ATTRIBUTE custNo -- custNo Customer Number + ::ATTRIBUTE custName -- custName Customer Name + ::ATTRIBUTE discount -- discount Discount code + ::ATTRIBUTE address -- address Customer's address + ::ATTRIBUTE zipCode -- zip ZipCode + + ::METHOD makeDir + dir = .Directory~new + dir["custNo"] = self~custNo + dir["custName"] = self~custName + dir["discount"] = self~discount + dir["address"] = self~address + dir["zipCode"] = self~zipCode + return dir + + ::METHOD list PUBLIC + expose custNo custName discount address zipCode + say "---------------" + say "CustomerDT-List:" + say "CustNo: " custNo " CustName:" custName + say "Address: " address + say "Zip: " zipCode " Discount:" discount + say "---------------" + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerView.h b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerView.h new file mode 100644 index 0000000..26d87d2 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerView.h @@ -0,0 +1,63 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_CUST_DIALOG 102 +#define IDR_CUST_MENU 103 +#define IDI_CUST_DLGICON 105 +#define IDC_CUST_LBL_CUSTNO 1001 +#define IDC_CUST_LBL_DISCOUNT 1002 +#define IDC_CUST_BTN_SHOWLASTORDER 1003 +#define IDM_CUST_NEW 40000 +#define IDM_CUST_UPDATE 40001 +#define IDM_CUST_PRINT 40002 +#define IDM_CUST_LAST_ORDER 40003 +#define IDC_CUST_EDT_CUSTNO 40043 +#define IDC_CUST_EDT_CUSTNAME 40044 +#define IDC_CUST_BTN_RECORDCHANGES 40069 +#define IDC_CUST_LBL_CUSTNAME 40070 +#define IDC_CUST_LBL_CUSTADDR 40071 +#define IDC_CUST_LBL_ZIP 40072 +#define IDC_CUST_LBL_LASTORDER 40073 +#define IDC_CUST_STC_LASTORDERDETAILS 40077 +#define IDC_CUST_EDT_CUSTADDR 40078 +#define IDC_CUST_EDT_DISCOUNT 40079 +#define IDC_CUST_EDT_CUSTZIP 40080 +#define IDC_CUST_STC_ERRORMSG 40081 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerView.rc new file mode 100644 index 0000000..cab2d63 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerView.rc @@ -0,0 +1,85 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "customerview.h" + + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_CUST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Customer...", IDM_CUST_NEW + MENUITEM "&Update...", IDM_CUST_UPDATE + MENUITEM "Print...", IDM_CUST_PRINT + MENUITEM "Last Order", IDM_CUST_LAST_ORDER + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_CUST_DIALOG DIALOG 0, 0, 275, 239 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "*CustomerName*" +FONT 8, "Microsoft Sans Serif" +{ + LTEXT "Name:", IDC_CUST_LBL_CUSTNAME, 18, 47, 22, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTNO, 85, 20, 65, 15, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Customer Number:", IDC_CUST_LBL_CUSTNO, 18, 22, 59, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTNAME, 85, 45, 165, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Address:", IDC_CUST_LBL_CUSTADDR, 18, 72, 28, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTADDR, 85, 70, 167, 40, ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY + LTEXT "Zip Code:", IDC_CUST_LBL_ZIP, 20, 120, 32, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTZIP, 85, 120, 65, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Last Order:", IDC_CUST_LBL_LASTORDER, 18, 177, 36, 8, SS_LEFT + LTEXT " ", IDC_CUST_STC_LASTORDERDETAILS, 88, 177, 145, 8, SS_LEFT + LTEXT "Discount Code:", IDC_CUST_LBL_DISCOUNT, 18, 149, 50, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_DISCOUNT, 85, 145, 20, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT " ", IDC_CUST_STC_ERRORMSG, 18, 215, 8, 8, SS_LEFT + DEFPUSHBUTTON "Record Changes", IDC_CUST_BTN_RECORDCHANGES, 130, 195, 58, 14, WS_DISABLED + PUSHBUTTON "Show Last Order", IDC_CUST_BTN_SHOWLASTORDER, 195, 195, 58, 14 +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_CUST_DLGICON ICON ".\\customer\\bmp\\Customer.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerView.rex new file mode 100755 index 0000000..0b5c586 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/CustomerView.rex @@ -0,0 +1,339 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: The CustomerView component v02-00 01Apr13 + + Contains: class "CustomerView"; routine "startCustomerView". + Pre-requisites: RcView.rex, CustomerView.rc, CustomerView.h. + + Description: A sample Customer View component - part of the sample + Order Management application. This is a "leaf" component - + it does not invoke other components. + + Changes: + v01-00 01Jun12: First version (Exercise04). + v01-01 07Jun12: Minor changes for Exercise06. + .... + v02-00 09Aug12: Changed to use MVF. + 09Jan13: Removed stand-alone startup (not now needed). + Changes to CustomerView (not at v03-00). + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. +------------------------------------------------------------------------------*/ + + +.Application~addToConstDir("Customer\CustomerView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "support\RcView.rex" + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerView v03-00 01Apr13 + ------------- + The "view" (or "gui") part of the Customer component - part of the sample + Order Management application. + Changes: + v00-02: Prevented close on enter key by providing no-op "ok" method. + Changed tab order on window by changing sequence of controls in .rc file + v00-03: Changed symbolic IDs to conform with naming convention + Added initAutoDetection method because deleted dlgData. from + dlg~new statement in starter.rex. + v00-04: Took out the OK method - include that in Exercise05. + v00-05: Modified to use CustomerData and CustomerModel classes. + Mods after Exercise04: + v02-00: Added "newInstance" class method - removed routine "StartCustomerView". + v02-01 19Sep11: Corrected for stand-alone invocation. + v02-02 04Oct11: Added msgbox for unimplemented menu item. + v02-03 28Jan12: Changed class name HRS to HRSclv to allow for multiple + HRS classes in same file at some future time. + v02-04 11Feb12: moved .application~setDefaults() to app startup file. + changed to .application~addToConstDir() here. + v02-05 19Feb12: Moved .Application~addToConstDir statement from newInstance + method to top of file - just before ::requires statement(s). + v03-00 09Aug12: Changed to use MVF. Stand-alone startup removed. + 09Jan13: Removed stand-alone startup (not now needed). + Commented out most 'say' instructions. + Removed 'getData' method - redundant with MVF. + Modified handling of Cust Address due to change in data + format of Cust Address (now provided as string via MVF + from Customer File). + Deleted a number of "say" instructions. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + ::CLASS CustomerView SUBCLASS RcView PUBLIC -- v03-00 + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC UNGUARDED + use arg idCustomerModel, rootDlg -- Ex07 + -- Create an instance of CustomerView and show it: + dlg = .CustomerView~new("Customer\CustomerView.rc", "IDD_CUST_DIALOG") + dlg~activate(idCustomerModel, rootDlg) -- Ex07 + return dlg -- Ex07 + + + /*---------------------------------------------------------------------------- + Dialog Creation Methods: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Init - creates the dialog instance but does not make it visible. --*/ + ::METHOD init + expose menuBar + + forward class (super) continue + + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Create Menu Bar - Creates the menu bar on the dialog. --*/ + ::METHOD createMenuBar + expose menuBar + menuBar = .ScriptMenuBar~new("Customer\CustomerView.rc", "IDR_CUST_MENU", , , .true) + return .true + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Activate - Shows the Dialog - i.e. makes it visible to the user. --*/ + ::METHOD activate unguarded + expose custData + use arg idCustomerModel, rootDlg -- ADDED FOR EXERCISE06. Params reversed for Ex07. + forward class (super) continue -- Ex07: Required for MV framework. + custData = RESULT -- Ex07: instance data returned by super + -- Ex07: ('forward' returns any result via 'RESULT'.) + self~popUpAsChild(rootDlg,"SHOWTOP",,"IDI_CUST_DLGICON") -- Ex07: deleted "standalone" startup. + return + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + InitDialog - Called by ooDialog -- */ + ::METHOD initDialog + expose menuBar custControls + menuBar~attachTo(self) + -- Create objects that map to the edit controls defined by the "customer.rc" + -- so they can be programmatically used elsewhere in the class: + custControls = .Directory~new + custControls[ecCustNo] = self~newEdit("IDC_CUST_EDT_CUSTNO") + custControls[ecCustName] = self~newEdit("IDC_CUST_EDT_CUSTNAME") + custControls[ecCustAddr] = self~newEdit("IDC_CUST_EDT_CUSTADDR") + custControls[ecCustZip] = self~newEdit("IDC_CUST_EDT_CUSTZIP") + custControls[ecCustDiscount] = self~newEdit("IDC_CUST_EDT_DISCOUNT") + custControls[stLastOrder] = self~newStatic("IDC_CUST_STC_LASTORDERDETAILS") + -- Create an object for the "Record Change" pushbutton in order to be able + -- to change its focus later: + custControls[btnRecordChanges] = self~newPushButton("IDC_CUST_BTN_RECORDCHANGES") + -- Define event handler methods for push-buttons: + self~connectButtonEvent("IDC_CUST_BTN_RECORDCHANGES","CLICKED",recordChanges) + self~connectButtonEvent("IDC_CUST_BTN_SHOWLASTORDER","CLICKED",showLastOrder) + + self~setTitle(.HRScv~dlgTitle) -- set dialog title. + + -- Show app data: + self~showData + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + MenuBar Methods: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + New Customer... Not fully implemented - merely tells user to use the + Customer List object. --*/ + ::METHOD newCustomer unguarded + answer = MessageDialog(.HRScv~useList, self~hwnd,.HRScv~useListCap,"INFORMATION") + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Update - Sets fields to edit mode so that user can change the data. + Business Rule: Customer Number cannot be changed. --*/ + ::METHOD update unguarded + expose custControls + custControls[ecCustName]~setReadOnly(.false) + custControls[ecCustAddr]~setReadOnly(.false) + custControls[ecCustZip]~setReadOnly(.false) + custControls[ecCustDiscount]~setReadOnly(.false) + self~enableControl("IDC_CUST_BTN_RECORDCHANGES") + custControls[btnRecordChanges]~state = "FOCUS" -- Put focus on the button + self~focusControl("IDC_CUST_EDT_CUSTNAME") -- place cursor in the CustName edit control. + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Last Order - Displays info about the last order placed by this customer.--*/ + ::METHOD lastOrder unguarded + expose custControls + use arg button + orderDate="31/12/11"; orderNum = "ZZ999"; orderTotal = "$999.99" + lastOrder = orderDate " " orderNum " " orderTotal + custControls[stLastOrder]~setText(lastOrder) + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Print - Not implemented yet --*/ + ::METHOD print unguarded + msg = "The 'Print...' menu item is not yet implemented." + ret = MessageDialog(.HRScv~noPrint, self~hwnd, .HRScv~noPrintCap, 'WARNING') + + + /*---------------------------------------------------------------------------- + PushButton Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Record Changes - Collects new data, checks if there has indeed been a + change, and if not, issues a warning msg and disables + the button. --*/ + ::METHOD recordChanges unguarded + expose custControls custData newCustData + + newCustData = .directory~new + newCustData[custName] = custControls[ecCustName]~getLine(1) + newCustData[custAddr] = .array~new + do i=1 to custControls[ecCustAddr]~lines + newCustData[custAddr][i] = custControls[ecCustAddr]~getLine(i) + end + newCustData[custZip] = custControls[ecCustZip]~getLine(1) + newCustData[custDiscount] = custControls[ecCustDiscount]~getLine(1) + + -- Check if anything's changed: + result = self~checkForChanges + --if result then say "CustomerView-recordChanges-01: There were changes!" + --else say "CustomerView-recordChanges-02: No Changes Found" + + /* Send new data to be checked by CustomerModel (not implemented). */ + + /* Disable controls that were enabled by menu "File-Update" selection: */ + custControls[ecCustName]~setReadOnly(.true) + custControls[ecCustAddr]~setReadOnly(.true) + custControls[ecCustZip]~setReadOnly(.true) + custControls[ecCustDiscount]~setReadOnly(.true) + self~disableControl("IDC_CUST_BTN_RECORDCHANGES") + + + /*---------------------------------------------------------------------------- + Show Last Order - displays mock sales order info in the Last_Order_Details + field; info is hard-coded in this method. --*/ + ::METHOD showLastOrder unguarded + expose CustControls + -- Notionally get last order from "SalesOrder" component. + orderDate="12/2/11"; orderNum = "AB123"; orderTotal = "$524.58" + lastOrder = orderDate " " orderNum " " orderTotal + custControls[stLastOrder]~setText(lastOrder) + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + showData - displays data in the dialog's controls. */ + ::METHOD showData + expose custData custControls + -- Show CustNo and CustName: + custControls[ecCustNo]~setText(custData["CustNo"]) + custControls[ecCustName]~setText(custData["CustName"]) + -- Re-format Cust Address from a comma-separated string into a -- Ex07 + -- line-end-separated string. + strCustAddr = custData["CustAddr"]~changeStr(",",.endOfLine) + custControls[ecCustAddr]~setText(strCustAddr) + -- Finally, show Zip and Discount: + custControls[ecCustZip]~setText(custData["Zip"]) + custControls[ecCustDiscount]~setText(custData["CustDisc"]) + + + /*-------------------------------------------------------------------------- + checkForChanges - after "Record Changes" actioned by the user, check whether + any data has actually changed. If it has: (a) assign new data to old data; + (b) return .true. If it hasn't: return .false. + Note: cannot just compare the two directories since data format in Address + is different. --*/ + ::METHOD checkForChanges + expose custData newCustData + changed = .false + if newCustData[custName] \= custData[custName] then do + custData[custName] = newCustData[custName] + changed = .true + end + if custData[custAddr] \= newCustData[custAddr] then changed = .true + if newCustData[custZip] \= custData[custZip] then do + custdata[custZip] = newCustData[custZip] + changed = .true + end + if newCustData[custDiscount] \= custData[custDiscount] then do + custData[custDiscount] = newCustData[custDiscount] + changed = .true + end + -- If no changes after all, display message box: + if \changed then do + msg = .HRScv~nilChanged + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRScv~nilChangedCap,"OK","WARNING","DEFBUTTON2 APPLMODAL") + end + else do + custData = newCustData + end + return changed + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRScv) v02-04 13Jan12 + -------- + This class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRScv PRIVATE -- Human-Readable Strings + ::CONSTANT nilChanged "Nothing was changed! Update not done." + ::CONSTANT nilChangedCap "Update Customer" + ::CONSTANT noPrint "The 'Print...' menu item is not yet implemented." + ::CONSTANT noPrintCap "*Customer Name*" + ::CONSTANT dlgTitle "*Customer*" + ::CONSTANT useList "Please use the Customer List to create a new Customer (not yet implemented)." + ::CONSTANT useListCap "Create New Customer" +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/bmp/CustList.BMP b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/bmp/CustList.BMP new file mode 100644 index 0000000000000000000000000000000000000000..962bee3d71bbf3cfc2d2c720d9aaf2a0cab826b5 GIT binary patch literal 2166 zcmeH`&25A*5QPURhe)|#r2|eWAO)a^YuZ`mxb;v47108DZ{8T3UBJ;^a>;1@gFnBS zXS{rTUY^b4g8mJykJi`|W(e@t7qu3TY>Z`DY|#uOX8dshUElY1b#}#w8Gl@O|FUVC zEd6!B$`(6jHi+2{?}iRBs86ZYmT}Z*sltEY!S3`mURK9ETU_hccwwGf@ASXmadygw zJ$;22cvoNH!b#`sQqmp8`T6>t9C86%7TrT038ZH($&WdOl<}f{qyrmA_FAv-6tZ=s zj`bx+Vx?WjTTZNMS>gZLP-!^kHk((nG|zL^XuCgExIrZuXJMeBQeT2rN1SKlZKA>C zyB^_<^j-k^_0-vkCk_KUJU&qw4DLBXpY!RpDE}>2ZJg5eq-ce{#`%J_{L*KuxDPC# z`7-ODa26#-~|{Wk=os literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/bmp/CustList.ico b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/bmp/CustList.ico new file mode 100644 index 0000000000000000000000000000000000000000..c9d256654be2bff669c25ee04cbaa94be30d3c56 GIT binary patch literal 2686 zcmeH`F?NG65JWfc#Z9Wvq4**p4(enIE_QJWoJ%s#$s<~3{PNK;w)>sEvKxDh7f-PEB?x|ecR ziN4opCE-8tWH8-(zBN2`x2{))D<5L7UQK>IMvpv?c@^fLp;&0ug;2T}u{zU)) literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/bmp/Customer.ico b/modules/windows/oodialog/userGuide/exercises/Exercise07/Customer/bmp/Customer.ico new file mode 100644 index 0000000000000000000000000000000000000000..e6bc7cc2927a80f725f2d30d0696b7e7cd8937d3 GIT binary patch literal 2686 zcmeHHK~4iP3`|8%oVF6;1spgc^#exoV|Ye?UdDEuwUf{l5}d&8W@C?MY-hVI<%AE> zhP9TD$5Nh4DX+K)*A?dJiYT z_k>AbRGN~g1ze+`SG3RtM%<{jX1;jN3<5UZlcLhR&d~4PK!ZE4Zp0G!TMFfpm(MjEL|+&mdh zFiSw7YO#TixC^*E@+LEp{y0aROeA-mx&}u9NMqJ*|Xj4NOpC=x16QlmJt#Le|R@Lv$YhkL6`$qjv zJHi_q4{_$>^dx8}+!d9f-oxb$I9)E%+cAz@H;j$#z^{(_PtFQMS&)8Ek_9B6$1mVg zG}u(X22dLc0qHNe)^H3A1Bjaj8vG@WzjFUfIH^FwV|o8eQeIoWh3mkPo!i$ZnBg=Y j+lhpXR2}fp;RNS|1so-?Uz;{i*VtFl(DeWI51zm$4RLx4 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonFile.txt b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonFile.txt new file mode 100644 index 0000000..ca0078f --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonFile.txt @@ -0,0 +1,6 @@ +number | familyName | firstName | dob | jobDescr | baseSalary +PA100 | Bloggs | Joseph | 721224 | Director | 250400 +PA150 | James | Alfred | 751513 | Packer | 38000 +PB100 | Smithson | John | 951704 | Programmer | 40170 +PB104 | Patterson | Patricia | 790331 | Office Manager | 76430 +PC200 | Cardaj | Jacob | 740615 | Plant Manager | 148250 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonModelData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonModelData.rex new file mode 100755 index 0000000..910bad7 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonModelData.rex @@ -0,0 +1,195 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + + Samples: Person Model and Data Classes v01-00 26May13 + + Contains: classes "PersonModel" and "PersonData". + + Pre-requisites: Model-View Framework. + + Outstanding Problems: + None. + + Changes: + v01-00 01Oct12: First version. + 09Jan13: Removed or commented-out 'say' instructions. + 05Feb13: Removed 'query' method since it's available in the superclass. + 14Feb13: Removed (commented-out) 'return self' from the init method. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. Also, 'Samples' folder + changed name to 'Extras'. + 26May13: Corrected file path after re-factoring Extras folder. + + +------------------------------------------------------------------------------*/ + + +::REQUIRES "..\Exercise07\Support\GenericFile.rex" +::REQUIRES "..\Exercise07\Support\Model.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + PersonModel v01-00 09Jan13 + ------------ + + The "model" part of the Person component - a simple "Model" class that + illustrates use of the Model-View framework. + See comments that include the string 'MFV'. + + Changes: + v01-00 01Oct12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS 'PersonModel' SUBCLASS Model PUBLIC + + ::METHOD newInstance CLASS PUBLIC + use strict arg instanceName -- Instance name of required instance is + -- provided by MVF as result of sending + -- a 'showModel' message to the Object Manager. + forward class (super) continue -- As part of MVF, super does the ~new + -- and provide's the model's instance + -- data as a param on the init. + modelId = RESULT -- MVF requires the model instance + return modelId -- ('modelId') to be returned. + + + + /*---------------------------------------------------------------------------- + init + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose dirPerson + use strict arg dirPerson -- Super gets data from PersonData and passes + -- that data when it creates this instance with + -- '~new'. + -- The data is in a directory: + + self~myData = dirPerson -- Store the data in my superclass. + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + test - a method to demonstrate Message Sender method store. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD test + return 25 + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + PersonData- The data resource for Persons. v01-00 23Sep12 + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/ + +::CLASS 'PersonData' SUBCLASS GenericFile PUBLIC + + ::ATTRIBUTE created CLASS + + ::METHOD newInstance CLASS PUBLIC -- Invoked by ObjectMgr + --use strict arg instanceName + if self~created = "CREATED" then do -- If this is first time + --say ".PersonData-newInstance-01." + personDataId = self~new() -- the object id of the PersonData component. + self~created = .true + return personDataId + end + else do + say ".PersonData-newInstance-02 - Error - Singleton component, so can't have more than one instance." + return .false + end + + + ::METHOD init PRIVATE + fileName = "Extras\Person\PersonFile.txt" + columns = 6 -- colums in the Persons "table" + records = self~init:super(fileName, columns) + --say "PersonData-init-01: records:" records + + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + PersonDT - A business data type for Person data. v00-01 05May12 + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/ + +::CLASS PersonDT PUBLIC + + -- dtName XML Name Description + -- --------- ---------- ------------------------------- + -- ProductDT product + ::ATTRIBUTE number -- number Person Number + ::ATTRIBUTE familyName -- familyName Person Family Name + ::ATTRIBUTE firstName -- firstName Person First Name + ::ATTRIBUTE dob -- dob Date of Birth (format: yymmdd) + ::ATTRIBUTE jobDescr -- jobDescrip Job Description + ::ATTRIBUTE baseSalary -- baseSalary Basic Salary + + ::METHOD makeDir + dir = .Directory~new + dir["number"] = self~number + dir["familyName"] = self~familyName + dir["firstName"] = self~firstName + dir["dob"] = self~dob + dir["jobDescr"] = self~jobDescr + dir["baseSalary"] = self~baseSalary + + return dir + + ::METHOD list PUBLIC + expose number name price uom description size + say "---------------" + say "PersonDT-List:" + say "Number: " number " Family Name:" familyName + say "DOB:" dob " First Name:" firstName + say "Base Salary:" baseSalary + say "Job:" jobDescr + say "---------------" + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonView.h b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonView.h new file mode 100644 index 0000000..bd1631f --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonView.h @@ -0,0 +1,48 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_DIALOG1 100 +#define IDC_PERS_NO 1000 +#define IDC_PERS_DOB 1001 +#define IDC_PERS_FIRSTNAME 1009 +#define IDC_PERS_FAMILYNAME 1010 +#define IDC_PERS_POSITION 1013 +#define IDC_PERS_SALARY 1014 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonView.rc new file mode 100644 index 0000000..d2d5e4b --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonView.rc @@ -0,0 +1,73 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +// Generated by ResEdit 1.5.11 +// Copyright (C) 2006-2012 +// http://www.resedit.net + +#include +#include +#include +#include "PersonView.h" + + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_DIALOG1 DIALOG 0, 0, 179, 166 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | WS_VISIBLE | DS_SHELLFONT | WS_CAPTION | WS_GROUP | WS_POPUP | WS_SYSMENU +CAPTION "Person Record" +FONT 8, "Ms Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 66, 142, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 121, 142, 50, 14 + LTEXT "Personnel No:", IDC_STATIC, 75, 19, 46, 8, SS_LEFT + EDITTEXT IDC_PERS_NO, 125, 15, 40, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Family Name:", IDC_STATIC, 11, 36, 43, 8, SS_LEFT + EDITTEXT IDC_PERS_FAMILYNAME, 10, 45, 85, 14, ES_AUTOHSCROLL + EDITTEXT IDC_PERS_FIRSTNAME, 106, 45, 60, 14, ES_AUTOHSCROLL + LTEXT "First Name:", IDC_STATIC, 107, 37, 36, 8, SS_LEFT + LTEXT "DOB:", IDC_STATIC, 12, 71, 18, 8, SS_LEFT + EDITTEXT IDC_PERS_DOB, 45, 70, 50, 15, ES_AUTOHSCROLL + LTEXT "Position:", IDC_STATIC, 12, 95, 28, 8, SS_LEFT + LTEXT "Salary:", IDC_STATIC, 12, 119, 22, 8, SS_LEFT + EDITTEXT IDC_PERS_POSITION, 45, 93, 120, 14, ES_AUTOHSCROLL + EDITTEXT IDC_PERS_SALARY, 45, 117, 40, 14, ES_AUTOHSCROLL +} diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonView.rex new file mode 100755 index 0000000..178523d --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Person/PersonView.rex @@ -0,0 +1,143 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Samples: Person View Class v01-00 26May13 + + Contains: classes "PersonView". + + Pre-requisites: Model-View Framework. + + Outstanding Problems: + None. + + Changes: + v01-00 01Oct12: First version. + 01Apr13: After ooDialog 4.2.2, Samples folder renamed to 'Extras' + and Support moved to within execise foldes. + so changes to ::Requires and ~addToConstDir needed. + 26May13: Corrected h path after re-factoring Extras folder. + + +------------------------------------------------------------------------------*/ + + +.Application~addToConstDir("Extras\Person\PersonView.h") + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + PersonView v01-00 01Oct12 + ---------- + A simple class that shows how to exploit the Model-View framework. + See comments that include the string 'MFV'. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +::REQUIRES "ooDialog.cls" +::REQUIRES "Support\RcView.rex" + +::CLASS 'PersonView' SUBCLASS 'RcView' PUBLIC + + /*---------------------------------------------------------------------------- + newInstance - creates an instance of the View: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS + use strict arg modelId, rootDlg -- MVF provides id of this view's Model; + -- not used in this sample. + dlg = .PersonView~new("Extras\Person\PersonView.rc", "IDD_DIALOG1") + dlg~activate(modelId, rootDlg) + return dlg -- required by MVF. + + + /*---------------------------------------------------------------------------- + init - initialises the dialog + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + forward class (super) continue + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + activate - Model's data is provided by the superclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose personData + use strict arg modelId, rootDlg + forward class (super) continue -- Required by MVF to get this View's + -- data from its Model component. + personData = RESULT -- personData returned by superclass + self~popupAsChild(rootDlg, "SHOWTOP") + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + initDialog - invoked automatically after the dialog has been created. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose personData ecPersNo ecPersFamilyName ecPersFirstName ecPersDOB ecPersPosition ecPersSalary + --say "PersonView-initDialog-01." + ecPersNo = self~newEdit("IDC_PERS_NO") + ecPersFamilyName = self~NewEdit("IDC_PERS_FAMILYNAME") + ecPersFirstName = self~newEdit("IDC_PERS_FIRSTNAME") + ecPersDob = self~newEdit("IDC_PERS_DOB") + ecPersPosition = self~newEdit("IDC_PERS_POSITION") + ecPersSalary = self~newEdit("IDC_PERS_SALARY") + self~setMyData(personData) -- Note: cannor use 'setData' as this + -- would conflict with ooDialog's + -- setData method. + --self~offset:super -- offsetting logic is in the superclass. + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + setData - sets (or "populates") controls with data provided in the + method's argument. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD setMyData + expose ecPersNo ecPersFamilyName ecPersFirstName ecPersDOB ecPersPosition ecPersSalary + use arg personData + ecPersNo~setText( personData["number"]) + ecPersFamilyName~setText(personData["familyName"]) + ecPersFirstName~setText( personData["firstName"]) + ecPersDOB~setText( personData["dob"]) + ecPersPosition~setText( personData["jobDescr"]) + ecPersSalary~setText( personData["baseSalary"]) + return + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/ReadMe.txt b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/ReadMe.txt new file mode 100644 index 0000000..f95760c --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/ReadMe.txt @@ -0,0 +1,49 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + ReadMe + + 1. ooDialog - Additional Examples to Accompany the ooDialog User Guide + ----------------------------------------------------------------------- + + This subdirectory tree contains the example programs referred to in the + appendix of the ooDialog User Guide. The programs are intended to give + context to the discussions in the User Guide, and may, or may not, be of + use to ooRexx programmers by themselves. + + The structure of the subdirectory tree and the programs themselves are + explained in the ooDialog User Guide. diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowData.rex new file mode 100755 index 0000000..e99f1b1 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowData.rex @@ -0,0 +1,151 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise07 The WowData component. v02-00 01Apr13 + + Contains: Classes: WowData. + + Pre-requisites: None. + + Description: The data component of the "Words of Wisdom" app. + + Changes: + v01-00 31May12: First version. + v02-00 06Sep12: Second version - modified to use the Model-View Framework (MVF) + 21Jan13: Updated comments. No change in funtion. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + +------------------------------------------------------------------------------*/ + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + WowData v02-00 13Feb13 + ------- + Has access to WOW data, and returns a set to requester. + + Potential enhancement: Define the size of a set through configuration. + + Changes: + v01-01 31May12: First version. + v02-00 06Sep12: Second version - modified to use the Model-View Framework (MVF) + 13Feb13: Changes to comments only. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::REQUIRES "..\Exercise07\Support\GenericFile.rex" -- MVF + +--::CLASS WowData PUBLIC + ::CLASS WowData SUBCLASS GenericFile PUBLIC -- v01-00-->MVF + + ::ATTRIBUTE created CLASS -- MVF + + /*---------------------------------------------------------------------------- + newInstance - creates an instance of WowData. Since all data + components are singletons, MVF applies the instance + name "The". + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC -- MVF + use strict arg instanceName -- the instanceName is "The". + if self~created = "CREATED" then do -- if not yet created + WowDataId = self~new() + return WowDataId + end + else do -- if already created, then error. + say ".WowData-newInstance-01 - Error: singleton component, so can't have more than one instance." + return .false + end + + /*---------------------------------------------------------------------------- + init - asks super to read the file from disk. + Returns the number of records (exclusing the colums headers line) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init -- MVF + expose filename records + filename = "Extras\Wow4\WowFile.txt"; columns = 1 + records = self~init:super(fileName, columns) + return self + + + /*---------------------------------------------------------------------------- + getRecord - asks super to read the file from disk. + Normally for a 'named' component, MVF invokes 'getRecord' + to ask the Data component for a single record (handled by the + 'GenericFile' superclass). For a ListModel, MVF invokes 'getFile' + to get the whole file to display in a list. + Here, although WowModel is a Model, not a ListModel, we want the + whole file. And GenericFile holds the file in its 'fileAsDirectory' + attribute. So we intercept the 'getRecord' message, and return + the file. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getRecord PUBLIC -- MVF + return self~fileAsDirectory + + + /*---------------------------------------------------------------------------- + activate - Not used for a Data component in MVF v01-00 + reads initial Wow Set from disk (but not in this version) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +/* ::METHOD activate + expose arrWow + arrWow = .array~new + arrWow[1] = "Agnes Allen's Law:" - + "Almost anything is easier to get into than out of." + arrWow[2] = "Airplane Law:" - + "When the plane you are on is late," - + "the plane you want to transfer to is on time." + arrWow[3] = "Fourteenth Corollary of Atwood's General Law of Dynamic Negatives:" - + "No books are lost by loaning" - + "except those you particularly wanted to keep." + arrWow[4] = "Baker's Byroad: When you're over the hill, you pick up speed." + arrWow[5] = "First Law of Bicycling:" - + "No matter which way you ride, it's uphill and against the wind." + arrWow[6] = "Brooks's Law:" - + "Adding manpower to a late software project makes it later." + arrWow[7] = "Grossman's Misquote of H. L. Mencken:" - + "Complex problems have simple, easy-to-understand wrong answers." + return */ + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + readWowSet - returns the Wow set as an array. v01-00 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --::METHOD readWowSet + --expose arrWow + --return arrWow + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowFile.txt b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowFile.txt new file mode 100644 index 0000000..f9699a8 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowFile.txt @@ -0,0 +1,27 @@ +Words of Wisdom +Agnes Allen's Law: Almost anything is easier to get into than out of. +Airplane Law: When the plane you are on is late, the plane you want to transfer to is on time. +Fourteenth Corollary of Atwood's General Law of Dynamic Negatives: No books are lost by loaning except those you particularly wanted to keep. +Baker's Byroad: When you're over the hill, you pick up speed. +First Law of Bicycling: No matter which way you ride, it's uphill and against the wind. +Brooks's Law: Adding manpower to a late software project makes it later. +Grossman's Misquote of H. L. Mencken: Complex problems have simple, easy-to-understand wrong answers. +Rule of Accuracy: When working toward the solution of a problem, it always helps if you know the answer. Corollary: Provided, of course, that you know there is a problem. +Acheson's Rule of the Bureaucracy: A memorandum is written not to inform the reader but to protect the writer. +Ade's Law: Anybody can win -- unless there happens to be a second entry. +Bradley's Bromide: If computers get too powerful, we can organize them into a committee - that will do them in. +Civilization: Civilization advances by extending the number of important operations which we can do without thinking of them. +Fred Allen's Law: I'd rather have a free bottle in front of me than a prefrontal lobotomy. +Beardsley's Warning to Lawyers: Beware of and eschew pompous prolixity. +Boling's Postulate: If you're feeling good, don't worry. You'll get over it. +Laws of Programming: Definition: A working program is one that has only unobserved bugs. +Rules of Pratt: #1 If a severe problem manifests itself, no solution is acceptable unless it is involved, expensive, and time consuming. +Computers vs People: One good reason why computers can do more work than people is that they never have to stop and answer the phone. +First law of programming: Problems that go away by themselves come back by themselves. +It is useless for the sheep to pass resolutions in favor of vegetarianism while the wolf remains of a different opinion. +Many are called, Few are chosen. Even fewer get to do the choosing. +Tell them 30 billion stars and they believe you. Say "Wet paint" and they check for themselves. +Entropy isn't what it used to be. (Al Vesper.) +Never try to teach a pig to whistle. It wastes your time, and annoys the pig. +No one can attain perfection but, if you chase perfection, you can catch excellence! (Vince Lombardi) +Murphy's 11th Law: It is impossible to make anything foolproof because fools are very ingenious. diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowModel.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowModel.rex new file mode 100755 index 0000000..23826d2 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowModel.rex @@ -0,0 +1,128 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise07 Part 2: The WowModel component. v02-00 20Jly13 + + Contains: Classes: WowModel. + + Pre-requisites: The Model-View Framework (MVF) + + Description: The model component of the "Words of Wisdom" app. + + Changes: + v01-00 31May12: First version. + v02-00 06Sep12: Second version - uses the MVF. Class name changed from + WowPicker to WowModel. + 09Jan13: Comment-out 'say's. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + 20Jly13: Added another "wise saying" to the data file so had to add + 1 to upped bound for random selection in 'pickWow' method. + +------------------------------------------------------------------------------*/ + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + WowModel v01-00 13Feb13 + --------- + A class that returns a Words of Wisdom string, selected randomly from a set + of such Words of Wisdom. + (Potential enhancements: Request a different set from the WowData class; + Have the size of the set configurable.) + Changes: + v01-00 31may12: First version. + v02-00 06Sep12: Second version - uses the MVF. + 13Feb13: Mods to comments only. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::REQUIRES "..\Exercise07\Support\Model.rex" -- MVF + +::CLASS WowModel SUBCLASS Model PUBLIC --v01-00-->MVF + + /*---------------------------------------------------------------------------- + newInstance - class method required for MVF. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC --MVF + use strict arg instanceName + forward class (super) continue -- Super does the ~new, gets the data + -- and passes it as a param on the init. + modelId = RESULT -- MVF (or just 'return RESULT') + return modelId + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + init - Since there's not no divided setup as in Views, + 'activate' is same as 'init' so with MVF we just use 'init'. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init -- MVF + expose arrWowSet + use strict arg dirWowSet -- MVF: data for model provided by super + arrWowSet = dirWowSet[Records] -- MVF: pre-defines format of data. + return self -- MVF. + + + /*---------------------------------------------------------------------------- + activate - Not used by Model components when using MVF. --v01-00 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + /*::METHOD activate + expose arrWowSet + dataSource = .local~my.idWowData + arrWowSet = dataSource~readWowSet + return */ + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + pickWow - picks a Word of Wisdom from the current wowSet and returns it. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD pickWow -- v01-00 & MVF + expose arrWowSet + i = random(1,26) + return arrWowSet[i,1] + + /*---------------------------------------------------------------------------- + query - MVF sends 'query' when the View is created. However, this function + is not used by WowView since it does not display data when the + dialog is opened for first time. Thus, since the superclass's + method is not required either, this method merely returns a string. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD query PUBLIC -- MVF + return "WowModel-query: this method not supported." + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowView.rex new file mode 100755 index 0000000..303052c --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Extras/Wow4/WowView.rex @@ -0,0 +1,139 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise03 Part 2: The WowView component. v02-00 01Apr13 + + Contains: Classes: WowView. + + Pre-requisites: + .local~my.idWowPicker - an object that provides a 'pickWow' method. + + Description: The view component for the "Words of Wisdom" app. + + Changes: + v01-00 31May12: First version. + v02-00 06Sep12: Changed to use MVF. + 09Jan13: 'say's commented out. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + +------------------------------------------------------------------------------*/ + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + WowView v02-00 06Sep12 + ------- + A class that defines the User Interface for the Wow application. + + Changes: + v01-00 31May12: First version. + v02-00 06Sep12: Second version - uses the Model-View Framework. + 09Jan13: 'say's commented-out. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::REQUIRES "ooDialog.cls" +::REQUIRES "..\Exercise07\Support\UdView.rex" + +::CLASS 'WowView' SUBCLASS UdView PUBLIC -- MVF + + /*---------------------------------------------------------------------------- + newInstance - invoked to create the View instance -- MVF + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS + use strict arg idModel, rootDlg -- MVF: idModel is the object ref of the Model instance. + dlg = self~new() + dlg~activate(idModel,rootDlg) -- MVF: idModel required by MVF + return dlg -- MVF: must return view id. + + /*---------------------------------------------------------------------------- + init - initialises the dialog + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + forward class (super) continue + self~create(30, 30, 257, 123, "Words of Wisdom", "CENTER") + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + defineDialog - defines the "Words of Wisdom" controls + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD defineDialog -- Invoked automatically by ooDialog. + self~createPushButton(901, 142, 99, 50, 14, "DEFAULT", "More wisdom", OkClicked) + self~createPushButton(IDCANCEL, 197, 99, 50, 14, ,"Cancel") + self~createStaticText(101, 40, 40, 200, 40, , "Click 'More wisdom'") + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + initDialog - invoked automatically after the dialog has been created. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + -- expose newText -- v01-00 + expose modelData newText -- MVF + newText = self~newStatic(101) + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + activate - gets id for wowPicker, shows the dialog. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + --expose wowPicker -- v01-00 + expose rootDlg modelData idModel -- MVF + --wowPicker = .local~my.idWowPicker -- v01-00 + use strict arg idModel, rootDlg -- MVF + say "WowView-activate-01: idModel, rootDlg" idModel||"," rootDlg + forward class (super) continue -- MVF: gets Model's data + modelData = RESULT -- MVF: Model's data returned by super + --self~execute("SHOWTOP", IDI_DLG_OOREXX) + self~popupAsChild(rootDlg,"SHOWTOP", IDI_DLG_OOREXX) + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + okClicked - Actions the "More wisdom" control + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD okClicked + -- expose wowPicker newText -- v01-00 + expose idModel newText -- MVF + --wow = wowPicker~pickWow -- v01-00 + wow = idModel~pickWow + --newText~setText(wow) -- v01-00 + --say "WowView-okClicked-01: newText, modelData =" newText wow + newText~setText(wow) -- MVF + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderFormView.h b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderFormView.h new file mode 100644 index 0000000..07943a1 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderFormView.h @@ -0,0 +1,65 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDR_ORDFORM_MENU 102 +#define IDI_ORDFORM_DLGICON 107 +#define IDD_ORDFORM_DIALOG 113 +#define IDD_ORDFORM_CUST_DIALOG 114 +#define IDD_ORDFORM_ORDLINES_DIALOG 115 +#define IDC_CUSTDTLS_NUM 1000 +#define IDC_CANCEL 1001 +#define IDC_CUSTDTLS_DISC 1001 +#define IDM_ORDFORM_PLACE 40000 +#define IDM_ORDFORM_ABOUT 40001 +#define IDC_ORDFORM_DATE 40002 +#define IDM_ORDFORM_SAVE 40003 +#define IDM_ORDFORM_CANCEL 40004 +#define IDC_ORDFORM_ORDNO 40005 +#define IDC_ORDFORM_TABS 40009 +#define IDC_ORDFORM_PLACEORDER 40010 +#define IDC_ORDLINES_LIST 40026 +#define IDC_ORDLINES_PRODNO 40027 +#define IDC_ORDLINES_QTY 40028 +#define IDC_ORDLINES_ADD 40029 +#define IDC_ORDLINES_DELETE 40030 +#define IDC_CUSTDTLS_FIND 40031 +#define IDC_CUSTDTLS_ADDR 40037 +#define IDC_CUSTDTLS_NAME 40038 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderFormView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderFormView.rc new file mode 100644 index 0000000..b0cc704 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderFormView.rc @@ -0,0 +1,99 @@ +// Generated by ResEdit 1.5.11 +// Copyright (C) 2006-2012 +// http://www.resedit.net + +#include +#include +#include +#include "OrderFormView.h" + + + + +// +// Menu resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_ORDFORM_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "Place Order...", IDM_ORDFORM_PLACE + MENUITEM "Save Order...", IDM_ORDFORM_SAVE + MENUITEM "Cancel Order", IDM_ORDFORM_CANCEL + } + POPUP "Help" + { + MENUITEM "About", IDM_ORDFORM_ABOUT + } +} + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDFORM_CUST_DIALOG DIALOG 6, 15, 206, 127 +STYLE DS_3DLOOK | DS_CONTROL | DS_SHELLFONT | WS_CHILDWINDOW +FONT 8, "Ms Shell Dlg" +{ + LTEXT "Customer Name:", IDC_STATIC, 16, 37, 53, 8, SS_LEFT + EDITTEXT IDC_CUSTDTLS_NAME, 79, 32, 100, 14, WS_DISABLED | ES_AUTOHSCROLL + EDITTEXT IDC_CUSTDTLS_NUM, 79, 11, 50, 14, ES_AUTOHSCROLL + LTEXT "Customer Number:", IDC_STATIC, 16, 16, 59, 8, SS_LEFT + PUSHBUTTON "Find Customer", IDC_CUSTDTLS_FIND, 145, 11, 50, 14 + EDITTEXT IDC_CUSTDTLS_ADDR, 80, 55, 100, 35, WS_DISABLED | ES_AUTOHSCROLL + LTEXT "Customer Address:", IDC_STATIC, 16, 57, 60, 8, SS_LEFT + LTEXT "Customer Discount:", IDC_STATIC, 16, 99, 62, 8, SS_LEFT + EDITTEXT IDC_CUSTDTLS_DISC, 80, 96, 40, 14, WS_DISABLED | ES_AUTOHSCROLL +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDFORM_DIALOG DIALOG 0, 0, 272, 278 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_SYSMENU +CAPTION "Order Form" +FONT 8, "Ms Shell Dlg" +{ + CONTROL "", IDC_ORDFORM_DATE, DATETIMEPICK_CLASS, WS_TABSTOP | DTS_APPCANPARSE | DTS_RIGHTALIGN, 185, 9, 70, 15 + EDITTEXT IDC_ORDFORM_ORDNO, 50, 9, 40, 14, ES_AUTOHSCROLL + LTEXT "Order No.", IDC_STATIC, 10, 12, 32, 8, SS_LEFT + LTEXT "Date", IDC_STATIC, 158, 12, 16, 8, SS_LEFT + LTEXT "Total Cost:", IDC_STATIC, 116, 194, 35, 8, SS_LEFT + LTEXT "Discount", IDC_STATIC, 116, 208, 29, 8, SS_LEFT + PUSHBUTTON "Place Order", IDC_ORDFORM_PLACEORDER, 200, 244, 50, 14 + LTEXT "Tax", IDC_STATIC, 116, 222, 13, 8, SS_LEFT + RTEXT "0.00", IDC_STATIC, 164, 208, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_STATIC, 164, 222, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_STATIC, 215, 222, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_STATIC, 215, 194, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_STATIC, 215, 208, 40, 8, SS_RIGHT + CONTROL "", IDC_ORDFORM_TABS, WC_TABCONTROL, 0, 15, 35, 245, 150 + PUSHBUTTON "Cancel Order", IDC_CANCEL, 132, 244, 46, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDFORM_ORDLINES_DIALOG DIALOG 6, 15, 240, 132 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_POPUP | WS_SYSMENU +FONT 8, "Ms Shell Dlg" +{ + CONTROL "", IDC_ORDLINES_LIST, WC_LISTVIEW, WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT, 5, 5, 230, 90 + EDITTEXT IDC_ORDLINES_PRODNO, 7, 103, 40, 14, ES_AUTOHSCROLL + LTEXT "Product No.", IDC_STATIC, 9, 119, 39, 8, SS_LEFT + EDITTEXT IDC_ORDLINES_QTY, 62, 103, 38, 14, ES_AUTOHSCROLL + LTEXT "Quantity", IDC_STATIC, 65, 119, 27, 8, SS_LEFT + PUSHBUTTON "Add OrderLine", IDC_ORDLINES_ADD, 122, 105, 50, 14 + PUSHBUTTON "Delete OrderLine", IDC_ORDLINES_DELETE, 177, 105, 58, 14 +} + + + +// +// Icon resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_ORDFORM_DLGICON ICON ".\\Order\\bmp\\OrderForm.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderFormView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderFormView.rex new file mode 100755 index 0000000..cd2de6d --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderFormView.rex @@ -0,0 +1,421 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: The OrderFormView class v02-00 01Apr13 + OrderFormView.rex + + Contains: class "OrderFormView", class "HRSofv". + Pre-requisite files: OrderFormView.rc, OrderFormView.h. + + Changes: + v01-00 07Jun12: First version. + v02-00 08Jan13: OrderFormView Modified to use the Model-View Framework (MVF). + Removed stand-alone startup (not now needed). + 25Feb13: Added control dialogs in tab sheet. + 27Feb13: Made Order Date functional. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + +------------------------------------------------------------------------------*/ + + +.Application~addToConstDir("Order\OrderFormView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "support\RcView.rex" + +/*============================================================================== + OrderFormView v02-00 27Feb13 + ------------- + The "view" (or "gui") Data Entry part of the Sales Order component. + + Changes: + v01-00 07Jun12: First Version + v02-00 05Oct12: Modified to use the Model-View Framework (MVF) including + removal of stand-alone startup. + 27Feb13: Changed to show tabs (control dialogs). + Corrected the Order Date control and limited order date to + one year ahead. + Commented-out say's. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderFormView SUBCLASS RcView PUBLIC + + ::ATTRIBUTE tabContent + + ::METHOD newInstance CLASS PUBLIC + use strict arg idModel, rootDlg + --say; say ".OrderFormView-newInstance: rootDlg =" rootDlg + dlg = self~new("Order\OrderFormView.rc", "IDD_ORDFORM_DIALOG") + dlg~activate(idModel, rootDlg) + return dlg + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + -- creates the dialog instance but does not make it visible. + expose menuBar + --say "OrderFormView-init-01" + + forward class (super) continue + + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + --say "OrderFormView-createMenuBar-01" + menuBar = .ScriptMenuBar~new("Order\OrderFormView.rc", IDR_ORDFORM_MENU, , , .true) + + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate unguarded + expose rootDlg idModelInstance orderData cd1 cd2 + use strict arg idModelInstance, rootDlg + forward class (super) continue + orderData = RESULT + + -- set up tabs for Customer Details and Order Lines: + cd1 = .CustDetailsDlg~new("Order\OrderFormView.rc", IDD_ORDFORM_CUST_DIALOG) + cd2 = .OrderLinesDlg~new("Order\OrderFormView.rc", IDD_ORDFORM_ORDLINES_DIALOG) + tabContent = .array~of(cd1, cd2) + --say "OrderFormView-activate-01: tabContent =" tabContent[1]||"," tabContent[2] + cd1~ownerDialog = self + self~prep(tabContent) + + --say "OrderFormView-activate-02: modelData, orderNum =" orderData||"," orderData[formNumber] + self~popUpAsChild(rootDlg,"SHOWTOP",,"IDI_ORDFORM_DLGICON") + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD prep + expose tabContent lastSelected havePositioned + use strict arg tabContent + --say "OrderFormView-prep-01." + -- The havePositioned array is used to determine if the page dialogs have been + -- positioned or not. Mark all 5 dialogs as not having been positioned yet. + havePositioned = .array~of(.false, .false) + -- No tab has been selected yet + lastSelected = 0 + + -- Connect the event handling methods to the events we are interested in. + --self~connectButtonEvent(IDC_PB_PREVIOUS, CLICKED, onPrevious) + --self~connectButtonEvent(IDC_PB_NEXT, CLICKED, onNext) + self~connectTabEvent(IDC_ORDFORM_TABS, SELCHANGE, onNewTab) + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + -- Called by ooDialog after SHOWTOP. + expose menuBar ecOrderNo orderData tabContent tabControl orderDate + --say "OrderFormView-initDialog-01" + + menuBar~attachTo(self) + + -- Tab stuff starts: + cd1 = tabContent[1] + cd1~execute + + -- Add the tabs to the tab control. + tabControl = self~newTab(IDC_ORDFORM_TABS) + tabControl~addSequence("Customer Details", "Order Lines") + -- tab stuff ends + + ecOrderNo = self~newEdit("IDC_ORDFORM_ORDNO") + --say "OrderFormView-initDialog-02: ecOrderNo =" ecOrderNo + btnCancelOrder = self~newPushButton("IDC_CANCEL") + btnPlaceOrder = self~newPushButton("IDC_ORDFORM_PLACEORDER") + self~connectButtonEvent("IDC_CANCEL","CLICKED",cancel) + self~connectButtonEvent("IDC_ORDFORM_PLACEORDER","CLICKED",placeOrderBtn) + + -- Get proxy for Order date and set its format. By default, it shows today. + --Also, set allowable date range selected to between today and 1 year's time. + orderDate = self~newDateTimePicker(IDC_ORDFORM_DATE); + orderDate~setFormat("MMM dd',' yyyy") + today = .DateTime~today + maxOrderDate = today~addYears(1) + orderDate~setRange(.array~of(today,maxOrderDate)) + + -- Tab stuff starts: + -- Determine the position and size of the display area of the tab control. + self~calculateDisplayArea + -- Position and show the control dialog used for the first page of the tab. + self~positionAndShow(1) + -- tab stuff ends + + self~setMyData(orderData) + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD calculateDisplayArea PRIVATE + expose tabControl displayRect + + -- Given a rectangle describing the tab control's size and position, the tab + -- control itself will calculate the display area's size and position. + r = tabControl~windowRect + tabControl~calcDisplayRect(r) + + -- Save the size of the display area, we need it later. + s = .Size~new(r~right - r~left, r~bottom - r~top) + + -- Now we need to map the display area's position on the screen, to the client + -- co-ordinates of the main dialog. The control dialog(s) are children windows + -- of the main dialog, which is why we need to use the client-area of the + -- dialog, not the client area of the tab control. + p = .Point~new(r~left, r~top) + self~screen2client(p) + + -- Create our display rectangle. This is used in setWindowPosition(), which + -- takes a point / size rectangle. ooDialog defines a point / size rectangle + -- as using the left and top attributes for the position of the upper left + -- corner of a rectangle, using the right attribute for the width of the + -- rectangle, and using the bottom attribute for the height of the rectangle. + displayRect = .Rect~new(p~x, p~y, s~width, s~height) + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + positionAndShow() + Used to resize and reposition one of the control dialogs so it occupies + the display area of the tab control. + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD positionAndShow private + expose tabControl tabContent displayRect lastSelected havePositioned + use strict arg index + --say "OrderFormView-positionAndShow-01; index =" index + -- We can not position the control dialog until the underlying Windows dialog + -- is created. If the system is heavily loaded for some reason, this may not + -- have happened yet. We need to wait for it. + dlg = tabContent[index] + do i = 1 to 10 + if dlg~hwnd <> 0 then leave + z = SysSleep(.01) + end + --say "OrderFormView-positionAndShow-02." + if dlg~hwnd == 0 then do + say "Error creating dialog for the tab with index:" index", aborting" + return self~cancel + end + + if lastSelected <> 0 then tabContent[lastSelected]~hide + + -- Now resize and reposition the control dialog to the tab control's display + -- area. We need to position the control dialog *above* the tab control in + -- the Z-order so that it shows. + dlg~setWindowPos(tabControl~hwnd, displayRect, "SHOWWINDOW NOOWNERZORDER") + --say "OrderFormView-positionAndShow-03."; say + + lastSelected = index + havePositioned[index] = .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + onNewTab - Invoked when user selects another tab. + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD onNewTab + expose tabControl tabContent havePositioned lastSelected + --say "OrderFormView-onNewTab-01." + index = tabControl~selectedIndex + 1 + --say "OrderFormView-onNewTab-02: index =" index + dlg = tabContent[index] + --say "OrderFormView-onNewTab-03: dlg, havePositioned[index] =" dlg havePositioned[index] + + if havePositioned[index] then do + last = tabContent[lastSelected] + last~hide + dlg~show + lastSelected = index + end + else do + dlg~ownerDialog = self + dlg~execute + self~positionAndShow(index) + end + + + /*---------------------------------------------------------------------------- + setData - sets (or "populates") controls with data provided in the + method's argument. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD setMyData + expose ecOrderNo + use strict arg orderData + ecOrderNo~setText( orderData[formNumber]) + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD placeOrder UNGUARDED + self~noMenuFunction(.HRSofv~PlaceOrder) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD saveOrder UNGUARDED + self~noMenuFunction(.HRSofv~SaveOrder) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD CancelOrder UNGUARDED + self~cancel + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSofv~HelpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSofv~NoMenu, self~hwnd, title, 'WARNING') + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + -- "Cancel" - This method over-rides the default Windows action of + -- 'cancel window' for an Escape key. + -- cancel - 'endExecution' required else dialog hangs when user tried to close. + ::METHOD cancel + expose tabContent + say "OrderFormView-cancel-01." + + response = askDialog(.HRSofv~QExit, "N") + if response = 1 then do /*forward class (super) */ -- '1' means the 'Yes' button pressed + do dlg over tabContent + dlg~endExecution(.false) + end + return self~cancel:super + end + + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Button Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD placeOrderBtn UNGUARDED + ret = MessageDialog(.HRSofv~NoBtn, self~hwnd, "Place Order Button", 'WARNING') + + + /*---------------------------------------------------------------------------- + leaving - invoked by ooDialog when a dialog closes. + *** Find out if it's a bug in RcControlDialog + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD leaving UNGUARDED + expose cd1 cd2 + say "OrderFormView-leaving-01." + forward class (super) continue + +/*============================================================================*/ + + + +/*============================================================================== + CustDetailsDlg - a Page in the OrderFormView + ------------- + + The "view" (or "gui") Customer Ordering part of the OrderFormView component. + ----------------------------------------------------------------------------*/ +::class CustDetailsDlg subclass RcControlDialog + + ::method initDialog + expose tabControl + --say "CustDetailsDlg-initDialog-01." + + +/*============================================================================== + OrderLinesDlg - a Page in the OrderFormView + ---------------- + + The "view" (or "gui") Products Ordering part of the OrderFormView. + ----------------------------------------------------------------------------*/ +::class OrderLinesDlg subclass RcControlDialog + + ::method initDialog + expose tabControl + lvOrderItems = self~newListView("IDC_ORDLINES_LIST") + lvOrderItems~addExtendedStyle(GRIDLINES FULLROWSELECT) + lvOrderItems~insertColumnPX(0,"ProdNo", 60,"LEFT") + lvOrderItems~insertColumnPX(1,"Product Name", 180,"LEFT") + lvOrderItems~insertColumnPX(2,"Qty", 40,"LEFT") + lvOrderItems~insertColumnPX(3,"Amount", 60,"LEFT") + --say "OrderLinesDlg-initDialog-01." + + -- Test an edit field: + ecProdno = self~newEdit("IDC_ORDLINES_PRODNO") + + + /*---------------------------------------------------------------------------- + leaving - invoked by ooDialog when a dialog closes. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --::METHOD leaving UNGUARDED + --expose objectMgr viewClass viewInstance + --objectMgr~removeView(viewClass, viewInstance) + --say "OrderFormView=OrderLinesDlg-leaving-01." + -- Note - we do not remove the Model. Should we? If so, not from here! + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRSofv) v01-00 07Jun12 + -------- + The HRSofv class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSofv PRIVATE -- Human-Readable Strings + ::CONSTANT QExit "Are you sure you want to cancel this Order and throw away all changes?" + ::CONSTANT NoMenu "This menu item is not yet implemented." + ::CONSTANT NoBtn "This button is not yet implemented." + ::CONSTANT PlaceOrder "Place Order" + ::CONSTANT SaveOrder "Save Order" + ::CONSTANT CancelOrder "Cancel Order" + ::CONSTANT HelpAbout "Help - About" + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderHeadersFile.txt b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderHeadersFile.txt new file mode 100644 index 0000000..7f4bfeb --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderHeadersFile.txt @@ -0,0 +1,6 @@ +OrderNo | CustNo | Date | Disc | Cmtd +SO-1234 | AB0784 | 120821 | 2 | N +SO-2345 | BA0314 | 110815 | 1.5 | Y +SO-3456 | BA0314 | 120527 | 0 | Y +SO-4567 | CU0003 | 120630 | 0 | Y +SO-4569 | AC0027 | 120824 | 5 | N diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderLinesFile.txt b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderLinesFile.txt new file mode 100644 index 0000000..38c61df --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderLinesFile.txt @@ -0,0 +1,13 @@ +OrderNo | ProdNo | Qty +SO-1234 | AB100/W | 5 +SO-1234 | CF300/X | 6 +SO-1234 | EF500/W | 15 +SO-2345 | AB100/W | 5 +SO-3456 | XY200 | 7 +SO-3456 | LM400 | 4 +SO-4567 | XY200 | 12 +SO-4567 | CU003 | 1 +SO-4569 | AB100/W | 10 +SO-4569 | LM400 | 8 +SO-4569 | CU003 | 5 +SO-4569 | XY200 | 12 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderListView.h b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderListView.h new file mode 100644 index 0000000..bc886a6 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderListView.h @@ -0,0 +1,48 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_ORDLIST_LISTVIEW 106 +#define IDI_ORDLIST_DLGICON 107 +#define IDR_ORDLIST_MENU 108 +#define IDC_ORDLIST_LIST 1000 +#define IDC_ORDLIST_SHOWORDER 1001 +#define IDM_ORDLIST_NEWORDER 40000 +#define IDM_ORDLIST_ABOUT 40001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderListView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderListView.rc new file mode 100644 index 0000000..317a390 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderListView.rc @@ -0,0 +1,73 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include +#include +#include +#include "OrderListView.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_ORDLIST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Order...", IDM_ORDLIST_NEWORDER + } + POPUP "Help" + { + MENUITEM "About...", IDM_ORDLIST_ABOUT + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDLIST_LISTVIEW DIALOG 0, 0, 255, 273 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Order List" +FONT 8, "Ms Shell Dlg" +{ + PUSHBUTTON "Cancel", IDCANCEL, 150, 235, 50, 14 + CONTROL "", IDC_ORDLIST_LIST, WC_LISTVIEW, WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SORTASCENDING, 15, 10, 225, 215 + DEFPUSHBUTTON "Show Order", IDC_ORDLIST_SHOWORDER, 89, 235, 42, 14, WS_DISABLED +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_ORDLIST_DLGICON ICON ".\\order\\bmp\\OrderList.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderListView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderListView.rex new file mode 100755 index 0000000..3d5fe77 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderListView.rex @@ -0,0 +1,251 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: The Order ListView v02-00 01Apr13 + + Contains: class "OrderListView", "HRSolv" + + Pre-requisite files: OrderListView.rc, OrderListView.h. + + Description: Provides a list of Orders and supports viewing any given + Order via a double-click on that Order's item in the list. + This is an "Intermediate" component - it is invoked by OrderMgmt, + and invokes OrderView. + + Changes: + v01-00 07Jun12: First Version (Ex06). + v02-00 25Aug12: Updated for Ex07 using the MVF. + 08Jan13: Removed stand-alone startup (not now needed). + 11Jan13: Commented-out 'say' instructions. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + + Outstanding Problems: None reported. + +*******************************************************************************/ + + +.Application~addToConstDir("Order\OrderListView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "Order\OrderView.rex" +::REQUIRES "Support\RcView.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderListView v01-01 25Aug12 + ------------- + The view of a list of products. + Changes: + v01-00 07Jun12: First version + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderListView SUBCLASS RcView PUBLIC + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use strict arg idModel, rootDlg --Ex07 + --say ".OrderListView-newInstance-01: root, idModel =" rootDlg idModel + dlg = self~new("Order\OrderListView.rc", "IDD_ORDLIST_LISTVIEW") + --say ".OrderListView-newInstance-02." + dlg~activate(idModel, rootDlg) --Ex07 + return dlg --Ex07 + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + forward class (super) continue + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + --say "OrderListView-createMenuBar-01." + menuBar = .ScriptMenuBar~new("Order\OrderListView.rc", "IDR_ORDLIST_MENU", , , .true) + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose rootDlg modelData --Ex07 + use strict arg idModel, rootDlg --Ex07 + --say "OrderListView-activate-01: idModel, root =" idModel rootDlg + forward class (super) continue --Ex07 + modelData = RESULT --Ex07 + --say "OrderListView-activate-02: modelData =" modelData + self~popupAsChild(rootDlg, "SHOWTOP", ,"IDI_ORDLIST_DLGICON") + --return self --Ex07 + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar lvOrders btnShowOrder modelData --Ex07 + -- Called by ooDialog after SHOWTOP. + + menuBar~attachTo(self) + + --say "OrderListView-initDialog-01"; say + lvOrders = self~newListView("IDC_ORDLIST_LIST"); + lvOrders~addExtendedStyle(GRIDLINES FULLROWSELECT) + lvOrders~insertColumnPX(0,"OrderNo",60,"LEFT") + lvOrders~insertColumnPX(1,"CustNo",80,"LEFT") + lvOrders~insertColumnPX(2,"CustName",130,"LEFT") + lvOrders~insertColumnPX(3,"Date",80,"LEFT") + self~connectListViewEvent("IDC_ORDLIST_LIST","CLICK",itemSelected) + self~connectListViewEvent("IDC_ORDLIST_LIST","ACTIVATE",openItem) -- double-click + self~connectButtonEvent("IDC_ORDLIST_SHOWORDER","CLICKED",showOrder) + + self~loadList + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newOrder UNGUARDED + self~noMenuFunction(.HRSolv~newOrder) + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSolv~helpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSolv~noMenu, self~hwnd, title, 'WARNING') + + + /*---------------------------------------------------------------------------- + Event Handling Methods - List Items + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD itemSelected unguarded + expose lvOrders --btnShowOrder + use arg id, itemIndex, columnIndex, keyState + if itemIndex > -1 then self~enableControl("IDC_ORDLIST_SHOWORDER") + else self~disableControl("IDC_ORDLIST_SHOWORDER") + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD openItem UNGUARDED + --say "OrderListView-openItem-01: item selected =" item + self~showOrder + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showOrder unguarded + expose lvOrders rootDlg + item = lvOrders~selected + --say "OrderListView-showOrder-01: item selected =" item + if item = -1 then do -- if no item selected. + ret = MessageDialog(.HRSolv~nilSelected, self~hwnd, title, 'WARNING') + return + end + info=.Directory~new + if lvOrders~getItemInfo(item, info) then do + --say "OrderListView-showOrder-02: info~text =" info~text + objectMgr = .local~my.ObjectMgr + objectMgr~showModel("OrderModel", info~text, rootDlg) --Ex07 + self~disableControl("IDC_ORDLIST_SHOWORDER") + end + else do + say "OrderListView-showOrder-04: ~getItemInfo returned .false." + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD loadList + expose lvOrders modelData -- Ex07 + --say "OrderListView-loadList-01: dataArray =" modelData -- Ex07 + rows = modelData[count] -- Ex07 - number of rows + arrData = modelData[records] + --say "OrderListView-loadList-02:Dims =" modelData~dimension(1) modelData~dimension(2) + do i = 1 to rows + --say "OrderListView-loadList-04a: modelData[i,2] =" modelData[i,2] + -- Change date to display format - i.e. yymmdd to (US format!) mm-dd-yy): + date = arrData[i,3] + displayDate = date~substr(3,2)||"/"||date~substr(5)||"/"||date~substr(1,2) + lvOrders~addRow( , ,arrData[i,1], arrData[i,2], arrData[i,6], displayDate) + end + lvOrders~setColumnWidth(2) -- set width of 3rd column to longest text entry. + + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + HRSolv (Human-Readable Strings for OrderListView) v01-00 07Jun12 + --- + The HRSolv class provides constant character strings for user-visible messages + issued by the OrderListView class. + + Changes: + v01-00 07Jun12: First Version + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +::CLASS HRSolv PRIVATE -- Human-Readable Strings + ::CONSTANT noMenu "This menu item is not yet implemented." + ::CONSTANT newOrder "New Order" + ::CONSTANT helpAbout "Help - About" + ::CONSTANT nilSelected "Please select an item first." + +/*============================================================================*/ + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderModelsData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderModelsData.rex new file mode 100755 index 0000000..d075fed --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderModelsData.rex @@ -0,0 +1,501 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: The OrderModel and OrderData Classes v02-00 01Apr13 + + Contains: classes "OrderModel", OrderListModel, and "OrderData". --Ex07 + Pre-requisites: None. + + Outstanding Problems: + None. + + Changes: + v01-00 07Jun12: First version. + v02-00 08Jan13: Modified to use the MVF. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + +------------------------------------------------------------------------------*/ + + +::REQUIRES "Support\Model.rex" +::REQUIRES "Support\GenericFile.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderModel v01-00 08Feb13 + ------------ + The "model" part of the Order component. + + Changes: + v01-00 07Jun12: First version. + 24Aug12: Modified to use the MVF. + 11Jan13: Commented-out 'say' instructions. + 08Feb13: Minor changes to comments only. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderModel SUBCLASS Model PUBLIC --Ex07 + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use strict arg instanceName --Ex07 + forward class (super) continue --Ex07 + modelId = RESULT --Ex07 + return modelId --Ex07 + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + init - Superclass 'Model', in its newInstance method, queries the Data + component for this instance's data, then does the self~new(myData) + which invokes this 'init' method. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose orderData + use strict arg orderData -- Ex07: data provided by Superclass. + self~myData = orderData -- Ex07: store in superclass's attribute. + --say "OrderModel-init-01: orderData =" orderData + --say "OrderModel-init-02: self~myData =" self~myData + + -- MVF gives gets the Order's Header data for the OrderModel, and OrderDetails for + -- the OrderListModel. Here we've got the Order Headers; now we need to ask + -- the OrderData component for the Order Details for this Order only: + --objMgr = .local.my~ObjectMgr + --idOrderData = objMgr~getComponentId("ProductData", "The") + --headerData = idOrderData~getHeaders( = + + return self -- Ex07 + + +-- ::METHOD query PUBLIC +-- use arg orderNo +-- if orderNo = "ORDERNO" then -- param not supplied +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderFormModel v01-00 04Oct12 + -------------- + The model component for the OrderForm business component. + + Changes: + v01-00 04Oct12. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderFormModel SUBCLASS Model PUBLIC + + ::ATTRIBUTE nextOrderNumber CLASS + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + newInstance - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD newInstance CLASS PUBLIC + use strict arg instanceName -- invoked by ObjectMgr + --say ".OrderFormModel-newInstanceName-01." + forward class (super) continue --Ex07 + modelId = RESULT --Ex07 + return modelId --Ex07 + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + getInstanceName - over-rides super's method. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD getInstanceName CLASS PUBLIC + --say ".OrderFormModel-getInstanceName-01." + if self~nextOrderNumber = "NEXTORDERNUMBER" then do -- No instance name set + self~nextOrderNumber = "SO-4999" + end + number = self~nextOrderNumber~right(4) + number += 1 + self~nextOrderNumber = "SO-"||number + --say ".OrderFormModel-getInstanceName-02: instanceName =" self~nextOrderNumber + return self~nextOrderNumber + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + init - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD init + expose orderData + use strict arg orderData -- Ex07: data provided by Superclass. + self~myData = orderData -- Ex07: store in superclass's attribute. + --say "OrderModel-init-01: orderData =" orderData + return self + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderListModel v01-00 24Aug12 + -------------- + The "ListModel" for the SalesOrder business component. + + Changes: + v01-00 24Aug12. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderListModel SUBCLASS Model PUBLIC + + ::ATTRIBUTE myData +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + use strict arg instanceName + self~wantList = .true -- MVF - for List models only. + forward class (super) continue -- MVF: super does the ~new and + -- passes data as a param on the init. + modelId = RESULT -- MVF + --say ".OrderListModel-newInstance-01: id =" modelId + return modelId -- MVF - could just say 'return modelId'. + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + init - stores received data in attribute 'arrData' and returns self. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose arrData + use strict arg arrData + self~myData = arrData + --say "OrderListModel-init-01: data = " self~myData + --say "OrderListModel-init-02: type and dimensions:" self~myData self~myData~dimension + return self + + + /*---------------------------------------------------------------------------- + query - returns an array of all OrderHeader data. + In MVF this method is invoked by the RcView (or ResView) superclass. + But the list also needs the name of the Customer. So this model + also gets the Customer Name from the appropriate Customer Model. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD query PUBLIC + --say "OrderListModel-query-01: self~myData =" self~myData + -- myData is an array of records. Now get Customer + return self~myData + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderData v01-00 07Jun12 + ------------ + The "data" part of the Order component. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderData SUBCLASS GenericFile PUBLIC + + ::ATTRIBUTE created CLASS + ::ATTRIBUTE dirOrderHeaders PUBLIC -- a directory containing all records in + -- the SalesOrderHeaders.txt file joined + -- with Customer Name and Address from + -- the Customer file. + ::ATTRIBUTE dirOrderLines PUBLIC -- a directory containing all records in + -- the SalesOrderLines.txt file joined + -- with product Description from the + -- Product File. +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + use strict arg instanceName + if self~created = "CREATED" then do + orderDataId = self~new() + return orderDataId + end + else do + say "... singleton component, so can't have more than one instance." + return .false + end + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + init - Invoked super to read the OrderHeader file, which is stored by super + in super's 'fileAsDirectory' attribute - and also the 'raw' form of + the file is stored in super's 'fileArray' attribute. + The OrderDetail file is read separately by invoking super's 'readFile' + method. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD init --Ex07 + expose filename numRecords + -- Read the OrderHeaders file: + filename = "Order\OrderHeadersFile.txt"; columns = 5 + -- invoke super to read the OrderHeaders file (read into super's + -- fileAsDirectory attribute): + numRecords = self~init:super(fileName, columns) + self~dirOrderHeaders = self~fileAsDirectory + -- List the OrderHeaders + /*say "OrderData-init-01: numRecords:" numRecords + if numRecords > 0 then do + say "OrderData-init-02: Array is:" + say self~fileArray~tostring -- fileArray is super's attribute. + end */ + -- Read the OrderLines file: + self~dirOrderLines = self~readFile:super("Order\OrderLinesFile.txt", 3) + + -- At this point, the OrderHeader file is the dirOrderHeadersattribute, + -- and the OrderLines file is in self~dirOrderLines. + -- Now, for the OrderHeaders, do a 'join' with Customer to add the + -- customer's name and address to the order headers in self~dirOrderHeaders: + self~addCustomerInfo + -- And now add Product info to the order lines in self~dirOrderLines: + self~addProductInfo + --self~listOrders + return self -- MVF + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + addCustomerInfo - Called by init - adds customer info from the CustomerData + component to each of the OrderHeader lines. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD addCustomerInfo PRIVATE + -- (1) Add column headers (field names) from Customer to OrderHeaders: + columnHeaders = self~dirOrderHeaders[headers] + columnHeaders[6] = "CustName"; columnHeaders[7] = "CustDisc" + columnHeaders[8] = "CustAddr"; columnHeaders[9] = "Zip" + self~dirOrderHeaders[headers] = columnHeaders + + -- (2) Add values for custName, Discount, CustAddress and Zip for each order header line: + arrData = self~dirOrderHeaders[records] + --say "OrderData-getFile-02 arrData, dims =" arrData arrData~dimension + -- (2a) First get id for CustomerData: + objMgr = .local~my.ObjectMgr + idCustData = objMgr~getComponentId("CustomerData", "The") + if idCustData = .false then return .false + -- (2b) For each order header, get the cust name & addr from CustomerData + -- and add it to the OrderHeader in-memory file: + do i=1 to self~dirOrderHeaders[count] -- loop over the Order Headers records: + -- get Customer record from CustomerData: + --say "OrderData-getFile-04: arrOrderHeaders[i,2] =" arrOrderHeaders[i,2] + orderCustNo = arrData[i,2] + custDir = idCustdata~getRecord(orderCustNo) + -- add customer's Name and Address to the end of the record: + arrData[i,6] = custDir["CustName"] + arrData[i,7] = custDir["CustDisc"] + arrData[i,8] = custDir["CustAddr"] + arrData[i,9] = custDir["Zip"] + end + self~dirOrderHeaders[records] = arrData + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + addProductInfo - Called by init - adds product name from the ProductData + component to each of the OrderLine records + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD addProductInfo PRIVATE -- Invoked by init. + -- (1) Add column header from Product to the headers (field labels) array: + columnHeaders = self~dirOrderLines[headers] + columnHeaders[4] = "ProdName" + self~dirOrderLines[headers] = columnHeaders + + -- (2) Add values for ProdName to each order header line: + arrData = self~dirOrderLines[records] + -- (2a) First get id for ProductData: + objMgr = .local~my.ObjectMgr + idProductData = objMgr~getComponentId("ProductData", "The") + if idProductData = .false then return .false + -- (2b) For each order line, get the product name from ProductData + -- and add it to the OrderLines in-memory file: + do i=1 to self~dirOrderLines[count] -- loop over the Order Lines records: + -- get Product record from ProductData: + orderProductNo = arrData[i,2] + prodDir = idProductData~getRecord(orderProductNo) + orderProductName = prodDir["ProdName"] + -- add product's Name to the end of the record: + arrData[i,4] = orderProductName + end + self~dirOrderLines[records] = arrData + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + dirData = .Directory~new + do j=1 to columns + header = self~FileHeaders[j] + dirData[header] = self~fileRecords[recordNo,j] + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + getRecord - returns a directory 'dirOrderRecord' containing all the data for + a given Order, including both Order Headers and Order Lines. + The format of the directory is: + Index Item + ------- ------- + OrderNo the order number (from dirOrderHeaders} + CustNo customer number (from dirOrderHeaders} + Date order date (from dirOrderHeaders} + Disc discount (from dirOrderHeaders} + Cmtd committed? (from dirOrderHeaders} + CustDisc customer discount (from dirOrderHeaders) + OrderLineHdrs (from dirOrderLines) + OrderLines (from dirOrderLines) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getRecord PUBLIC + use strict arg orderNo + if orderNo = "" then return .false + + -- (1) Get the data from the two directories that contain data from the two + -- files. Call these the "src" (source) variables: + arrSrcOrderHeaderLabels = self~dirOrderHeaders[headers] -- note naming clash but never mind... + arrSrcOrderHeaders = self~dirOrderHeaders[records] + numSrcOrderHeaders = self~dirOrderHeaders[count] + arrSrcOrderLineLabels = self~dirOrderLines[headers] + arrSrcOrderLines = self~dirOrderLines[records] + numSrcOrderLines = self~dirOrderLines[count] + + -- (2) Find the Order Header record: + found = .false + do recordNo = 1 to numSrcOrderHeaders + if arrSrcOrderHeaders[recordNo,1] = orderNo then do + found = .true; leave + end + end + if \found then return .false + + -- (3) Now build the dirOrderRecord + -- (3a) Put the Order headers(i,e, the field labels) into dirOrderRecord: + dirOrderRecord = .Directory~new + -- Put the OrderHeader info into dirOrderRecord: + columns = arrSrcOrderHeaderLabels~items + do j=1 to columns + itemName = arrSrcOrderHeaderLabels[j] + dirOrderRecord[itemName] = arrSrcOrderHeaders[recordNo,j] + end + -- (3b) Put the Headers (Field Labels) for the order lines into the record: + arrOLH = .Array~new + arrOLH = arrSrcOrderLineLabels + dirOrderRecord[OrderLineHdrs] = arrOLH + -- (3c) Now Put OrderLines for this order into dirOrderRecord's array + arrOrderLines = .Array~new + rows = arrSrcOrderLines~dimension(1) -- number of lines or rows + j = 1 + do i =1 to rows -- iterate over all rows in arrSrcOrderLines + --say "Orderdata-getRecord-02:" orderNo arrSrcOrderLines[i,1] + if arrSrcOrderLines[i,1] = orderNo then do + --say "OrderData-getRecord-02a: j arrSrcOrderLines[i,1] orderNo:" j arrSrcOrderLines[i,1] orderNo + arrOrderLines[j,1] = arrSrcOrderLines[i,1] + arrOrderLines[j,2] = arrSrcOrderLines[i,2] + arrOrderLines[j,3] = arrSrcOrderLines[i,3] + arrOrderLines[j,4] = arrSrcOrderLines[i,4] + j = j+1 + end + end + --say "OrderData-getRecord-03: arrOrderLines dimensions =" arrOrderLines~dimension(1) arrOrderLines~dimension(2) + dirOrderRecord[OrderLines] = arrOrderLines + + return dirOrderRecord + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + getFile - Invoked by Model for an xxxListModel component; + returns all OrderHeaders including customer info. */ + ::METHOD getFile PUBLIC + return self~dirOrderHeaders + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + listOrders - lists the file. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD listOrders PUBLIC + say; say "----List-Orders--------------------------------" + say "Number of Orders:" self~dirOrderHeaders[Count] + arrOHH = self~dirOrderHeaders[Headers] + say "Order Headers: Headers or Field Names ("||arrOHH~items "columns):" + do i=1 to 9 + say "Order Headers FieldNames:" arrOHH[i] + end + say " " arrOHH[1] arrOHH[2] arrOHH[3] arrOHH[4] arrOHH[5] arrOHH[6] arrOHH[7] arrOHH[8] arrOHH[9] + say "Order Headers - Records" + arrOHR = self~dirOrderHeaders[Records] + do i = 1 to arrOHR~dimension(1) + say i||". " arrOHR[i,1] arrOHR[i,2] arrOHR[i,3] arrOHR[i,4] + say " " arrOHR[i,5] arrOHR[i,6] arrOHR[i,7] + say " " arrOHR[i,8] arrOHR[i,9] + end + say + say "Number of Order Lines:" self~dirOrderLines[Count] + arrOLH = self~dirOrderLines[Headers] + say "Order Lines: Headers or FieldNames ("||arrOLH~items "columns):" + say arrOLH[1] arrOLH[2] arrOLH[3] arrOLH[4] + say "Order Lines - Records" + arrOLR = self~dirOrderLines[Records] + do i = 1 to arrOLR~dimension(1) + say i||". " arrOLR[i,1] arrOLR[i,2] arrOLR[i,3] arrOLR[i,4] + end + say "-----------------------------------------------" + say + return .true + +/*============================================================================*/ + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderView.h b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderView.h new file mode 100644 index 0000000..9b72260 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderView.h @@ -0,0 +1,57 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_ORDER_DIALOG 108 +#define IDI_ORDER_DLGICON 109 +#define IDR_ORDER_MENU 110 +#define IDC_ORDER_NAMEADDR 1000 +#define IDC_ST_DISCOUNT_PC 1005 +#define IDM_ORDER_DOTHIS 40000 +#define IDM_ORDER_ABOUT 40001 +#define IDC_ORDER_ORDNO 40007 +#define IDC_ORDER_CUSTNO 40008 +#define IDC_ORDER_ITEMS 40009 +#define IDC_ST_TAX_PC 40010 +#define IDC_ST_DISCOUNT 40011 +#define IDC_ST_TAX 40012 +#define IDC_ST_NET 40013 +#define IDC_ST_TOTAL 40014 +#define IDC_ORDER_DATE 40017 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderView.rc new file mode 100644 index 0000000..3c77c08 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderView.rc @@ -0,0 +1,101 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "OrderView.h" + + + + +// +// Menu resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_ORDER_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "An Action", IDM_ORDER_DOTHIS + } + POPUP "Help" + { + MENUITEM "About", IDM_ORDER_ABOUT + } +} + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDER_DIALOG DIALOG 0, 0, 272, 270 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_SYSMENU +CAPTION "Sales Order" +FONT 8, "Ms Shell Dlg" +{ + EDITTEXT IDC_ORDER_ORDNO, 217, 30, 40, 14, ES_CENTER | ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_ORDER_CUSTNO, 217, 50, 40, 14, ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY + LTEXT "Order No.", IDC_STATIC, 169, 33, 32, 8, SS_LEFT + LTEXT "Customer No.", IDC_STATIC, 169, 53, 44, 8, SS_LEFT + CONTROL "", IDC_ORDER_ITEMS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT, 17, 70, 240, 115 + LTEXT "Date", IDC_STATIC, 169, 13, 16, 8, SS_LEFT + LTEXT "Net Cost:", IDC_STATIC, 113, 195, 30, 8, SS_LEFT + LTEXT "Discount:", IDC_STATIC, 113, 209, 31, 8, SS_LEFT + DEFPUSHBUTTON "Close", IDCANCEL, 17, 234, 35, 14 + LTEXT "Tax:", IDC_STATIC, 113, 223, 15, 8, SS_LEFT + RTEXT "0.00", IDC_ST_DISCOUNT_PC, 161, 209, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_ST_TAX_PC, 161, 223, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_ST_TAX, 212, 223, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_ST_NET, 212, 195, 40, 8, SS_RIGHT, WS_EX_RIGHT + RTEXT "0.00", IDC_ST_DISCOUNT, 212, 209, 40, 8, SS_RIGHT + EDITTEXT IDC_ORDER_NAMEADDR, 17, 23, 103, 39, ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY + LTEXT "Customer:", IDC_STATIC, 19, 9, 32, 8, SS_LEFT + LTEXT "Total Cost:", IDC_STATIC, 113, 237, 35, 8, SS_LEFT + RTEXT "0.00", IDC_ST_TOTAL, 212, 237, 40, 11, WS_BORDER | SS_RIGHT + EDITTEXT IDC_ORDER_DATE, 217, 10, 40, 14, ES_CENTER | ES_AUTOHSCROLL | ES_READONLY +} + + + +// +// Icon resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_ORDER_DLGICON ICON ".\\Order\\bmp\\OrderForm.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderView.rex new file mode 100755 index 0000000..1a70ac7 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/OrderView.rex @@ -0,0 +1,296 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: The OrderView class v02-00 01Apr13 + + OrderFormView.rex + + Contains: class "OrderView". + Pre-requisite files: OrderView.rc, OrderView.h. + + Description: A sample Order View component - part of the sample + Order Management application. + This is a "leaf" component - invoked by OrderListView. + + Outstanding Problems: None reported. + + Changes: + v01-00 07Jun12: First Version (Exercise06) + v02-00 08Jan13: Ex07 - changed to use the MVF. + 11Jan13: Removed stand-alone operation. + Commented-out 'say' instructions. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + +------------------------------------------------------------------------------*/ + + +.Application~addToConstDir("Order\OrderView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "Order\OrderModelsData.rex" +::REQUIRES "Support\RcView.rex" + + +/*============================================================================== + OrderView v01-01 25Aug12 + ------------- + The "view" (or "gui") part of the Order component - part of the sample + Order Management application. + + Changes: + v01-00 07Jun12: First Version. + v02-00 25Aug12: Ex07 - changed to use the MVF. + 08Jan13: Extraneous comments removed; some 'say' stmts commented out. + 11Jan13: Commented-out 'say' instructions. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderView SUBCLASS RcView PUBLIC -- Ex07 + + ::METHOD newInstance CLASS PUBLIC + use strict arg idModel, rootDlg -- Ex07 + --say ".OrderView-newInstance: rootDlg =" rootDlg + dlg = self~new("Order\OrderView.rc", "IDD_ORDER_DIALOG") + dlg~activate(idModel, rootDlg) -- Ex07 + return dlg -- Ex07 + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + -- creates the dialog instance but does not make it visible. + expose menuBar + --say "OrderView-init-01" + + forward class (super) continue + + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + --say "OrderView-createMenuBar-01" + menuBar = .ScriptMenuBar~new("Order\OrderView.rc", IDR_ORDER_MENU, , , .true) + + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose rootDlg orderData + use strict arg idModelInstance, rootDlg -- Ex07 + forward class (super) continue -- Ex07 - MVF: required to get Model's data + orderData = RESULT -- Ex07 - MVF: model's data returned by super + --say "OrderView-activate-00: orderData = " orderData + + -- Shows the Dialog - i.e. makes it visible to the user. + --say "OrderView-activate-01: OrderNumber = " orderData["OrderNo"] orderData~orderNo + self~popUpAsChild(rootDlg,"SHOWTOP",,"IDI_ORDER_DLGICON") + return self -- Ex07 + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + -- Called by ooDialog after SHOWTOP. + expose menuBar orderControls orderData -- Ex07 + --say "OrderView-initDialog-01" + + menuBar~attachTo(self) + + orderControls = .Directory~new + orderControls[ecOrderNameAddr] = self~newEdit( "IDC_ORDER_NAMEADDR") + orderControls[ecOrderDate] = self~newEdit( "IDC_ORDER_DATE" ) + orderControls[ecOrderNo] = self~newEdit( "IDC_ORDER_ORDNO" ) + orderControls[ecCustNo] = self~newEdit( "IDC_ORDER_CUSTNO" ) + orderControls[lvOrderItems] = self~newListView("IDC_ORDER_ITEMS" ) + orderControls[stNetCost] = self~newStatic( "IDC_ST_NET" ) + orderControls[stDiscountPC] = self~newStatic( "IDC_ST_DISCOUNT_PC") + orderControls[stDiscount] = self~newStatic( "IDC_ST_DISCOUNT" ) + orderControls[stTaxPC] = self~newStatic( "IDC_ST_TAX_PC" ) + orderControls[stTax] = self~newStatic( "IDC_ST_TAX" ) + orderControls[stTotal] = self~newStatic( "IDC_ST_TOTAL" ) + + -- Each Order Item consists of ProdNo, ProdName, Qty: + orderItems = orderControls[lvOrderItems] + orderItems~addExtendedStyle(GRIDLINES FULLROWSELECT) + orderItems~insertColumnPX(0,"Product No.",110,"LEFT") + orderItems~insertColumnPX(1,"Product Name",160,"LEFT") + orderItems~insertColumnPX(2,"Quantity",85,"LEFT") + self~connectListViewEvent("IDC_ORDER_ITEMS","ACTIVATE",showProduct) -- double-click + + --font = self~createFontEx("Ariel", 10) + font = self~createFontEx("Courier", 8) + orderControls[lvOrderItems]~setFont(font) + self~showData + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showProduct + expose orderControls rootDlg + --say "OrderView-showProduct-01: Show Product requested." + productItem = orderControls[lvOrderItems]~selected + --say "OrderView-showProduct-01: item selected =" productItem + if item = -1 then do -- if no item selected. + ret = MessageDialog(.HRSolv~nilSelected, self~hwnd, title, 'WARNING') + return + end + + info=.Directory~new + if orderControls[lvOrderItems]~getItemInfo(productItem, info) then do + --say "OrderView-showOrder-02: info~text =" info~text + objectMgr = .local~my.ObjectMgr + objectMgr~showModel("ProductModel", info~text, self) --Ex07 + self~disableControl("IDC_ORDLIST_SHOWORDER") + end + else do + say "OrderListView-showOrder-04: ~getItemInfo returned .false." + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD anAction UNGUARDED + self~noMenuFunction(.HRSov~anAction) + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSov~HelpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSov~NoMenu, self~hwnd, title, 'WARNING') + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showData + expose orderControls orderData +/* say "--------------------" + say "OrderView-showData-00: contents of orderData:" + do i over orderData + say i orderData[i] + end + say; say "Order Lines:" + xorderLines = orderData[OrderLines] + do i over xorderLines + say i + end + say; say "Order Line Headers:" + xorderLines = orderData[OrderLineHdrs] + do i over xorderLines + say i + end + say "End of Contents of orderData." + say "---------------------"; say +*/ + --say "orderData['CustNo']:" orderData['CustNo'] -- orderData~CustNo, orderData~'CustNo' - neither work. + --say "--------------------" + -- Format & show the address: + custAddr = orderData["CustAddr"] + parse var custAddr street "," city "," state + --say "OrderView-showData-01: address =" street city state orderData["Zip"] + eol = .endOfLine + custNameAddr = orderData["CustName"]||eol||street||eol||city||eol||state orderData["Zip"] + orderControls[ecOrderNameAddr]~setText(custNameAddr) + -- Format & show the order date: + orderDate = orderData["Date"] + yy = orderDate~left(2); dd = orderDate~right(2); mm = orderDate~substr(3,2) + orderDate = mm||"/"||dd||"/"||yy + orderControls[ecOrderDate]~setText(orderDate) + -- Show the Order NUmber: + orderControls[ecOrderNo]~setText(orderData["OrderNo"]) + -- Show the Customer NUmber: + orderControls[ecCustNo]~setText(orderData["CustNo"]) + + -- Show the Order Items (aka Order Lines): + lvOrderLines = orderControls[lvOrderItems] + arr = orderData[OrderLines] + --say "OrderView-showData-02: order lines array dims =" arr~dimension + --do i = 1 to arr~dimension(1) + --say arr[i,1] "-" arr[i,2] arr[i,3] arr[i,4] + --end + do i=1 to arr~dimension(1) + qty = arr[i,3]~right(8," ") + lvOrderLines~addRow( , , arr[i,2], arr[i,4], qty ) + end + --lvOrderLines~setColumnWidth(0) -- set width of 2nd column to longest text entry. + --lvOrderLines~setColumnWidth(1) + --lvOrderLines~setColumnWidth(3) + --say "OrderView-showData-02: arrOrderLines =" arrOrderLines + --orderControls[lvOrderItems] + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + -- "Cancel" - This method over-rides the default Windows action of + -- 'cancel window' for an Escape key. + ::METHOD cancel + response = askDialog(.HRSov~QExit, "N") + if response = 1 then forward class (super) + return + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRSov) v01-00 07Jun12 + -------- + The HRSofv class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSov PRIVATE -- Human-Readable Strings + ::CONSTANT anAction "An Action" + ::CONSTANT NoMenu "This menu item is not implemented." + ::CONSTANT QExit "Are you sure you want to cancel this Order View?" + ::CONSTANT HelpAbout "About Sales Order" + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/bmp/OrderForm.bmp b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/bmp/OrderForm.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2c2ca388d05f61ac583536dae5d3f5fb1542e966 GIT binary patch literal 2166 zcmeHIOAf*y5XHoWi5rPG=*k0l0OH>37?(X-Z&u$MrXx;m0t;3;Da_|}=wm2wyFU&= z7gT4#c9lJw(@)Jp3Ne4^(Xk6E`N+W+8 zrgmdIXq;qO6}D6A=rtHuzE(N;Q%27G*XqxfjoOX%!+W1k01{QAA@PNK2(Ems(#$_H z-}Z3Y$~>3yAB$VsYWMIj&R;%yqLlmx;>y=59sD^oB|dR4e?qLKUfek+Gs*2_<}Ywd nJ962=f82kl;%Rj$qK_pY?39&!e12^q*|XOYzW1Hhzhz(rb0Pbg literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/bmp/OrderList.bmp b/modules/windows/oodialog/userGuide/exercises/Exercise07/Order/bmp/OrderList.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4cc094ed82be0c3180c2b8688e39ecfed14165fc GIT binary patch literal 16438 zcmeI2O-?I841|X@OD@2Y6J#B+=gzrV=p=knWW{5*(|>@2hN8P`Tvc|$dm8cibvSO< z*P(p>DA)1ldfDE~Pvv#owzt>YbzPTl=bhK(c;#!ydXuA-vm2vpn*Ve@209RAS! z=hE}NukuU{f3-*+?|twyf2;%aueRUZr=ho=ZpaSngf`ybt2NFHx}_?bV}0s80dcW+*;ANaBK`R_md>pfR* z{aQcpbN;ao&_C~ddh=@iz>lTR&p-WJ4ZZI(d_OyX>a2pZ@_TiA@nruk9r&&0Z|U_u zCl6@p!HeeSKI(v$Ztrt^fSMlX`_u)|n}zrQ@xeNp)4GrPAiA><9}=w` z(Q~OYD>u5*59????|tZi_?dBgjv!3b|YFdq_ulRRyE zllKL$EARmDl-5dnOAF(x(F0xAq3`8mV>C@u6UkY|$1r*2XW;-fLA{+4tpnA +#include +#include +#include "OrderMgrView.h" + + + + +// +// Menu resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_ORDMGR_MENU MENU +{ + POPUP "Orders" + { + MENUITEM "New Order...", IDM_ORDMGR_NEWORDER + MENUITEM "Order List...", IDM_ORDMGR_ORDERLIST + MENUITEM "Order Search...", IDM_ORDMGR_ORDERSEARCH + } + POPUP "Customers" + { + MENUITEM "Customer List...", IDM_ORDMGR_CUSTLIST + MENUITEM "Customer Search...", IDM_ORDMGR_CUSTSEARCH + } + POPUP "Products" + { + MENUITEM "Product List...", IDM_ORDMGR_PRODLIST + MENUITEM SEPARATOR + MENUITEM "Product Search...", IDM_ORDMGR_PRODSEARCH + } + POPUP "New" + { + MENUITEM "Product...", IDM_ORDMGR_PRODNEW + MENUITEM "Customer...", IDM_ORDMGR_CUSTNEW + MENUITEM "Order...", IDM_ORDMGR_ORDERNEW + } + POPUP "Help" + { + MENUITEM "About", IDM_ORDMGR_ABOUT + MENUITEM "Message Sender", IDM_MESSAGE_SENDER1 + MENUITEM "Person", IDM_PERSON1 + } +} + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDMGR DIALOG 0, 0, 310, 209 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU | WS_MINIMIZEBOX +CAPTION "Dialog" +FONT 8, "Ms Shell Dlg" +{ + PUSHBUTTON "Exit Application", IDC_ORDMGR_EXIT, 245, 186, 60, 15 + PUSHBUTTON "Reset Icons", IDC_ORDMGR_RESET, 5, 186, 50, 15 + CONTROL "", IDC_ORDMGR_ICONS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_ICON, 5, 5, 300, 175 +} diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/OrderMgr/OrderMgrView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/OrderMgr/OrderMgrView.rex new file mode 100755 index 0000000..e29b23f --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/OrderMgr/OrderMgrView.rex @@ -0,0 +1,399 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: OrderMgrView.rex v02-00 27Feb13 + + Contains: class: "OrderMgrView", "HRSomv" + + Description: The Order Manager View class - the container for of the + Order Management application. + + Pre-requisites: MVF. + + Description: A sample Order Manager View class - part of the sample + Order Manager component. + + Outstanding Problems: None reported. + + Changes: + v01-00 07Jun12: First Version + v01-01 18Jan13: Version 1.1 - dialog sizing now uses resizingAdmin. + v02-00 20Feb13: + 1. Added get id of ObjectMgr in init method. + 2. Added menu item "Help - Person" to surface a Person Model in order to + illustrate MVF using Person class early in Chapter 7. + 3. Added menu item "Help - Message Sender" to surface the Message Sender. + 4. Updated 'showModel' method to use the MVF (via ObjectMgr) to surface + List Views that are populated with data read from disk (instead of data + hard-coded in the ListView) also give listview the instance name of "a" + to indicate an anonymous component to ObjectMgr. + 5. Added methods "person" and "messageSender" which launch a PersonModel + and a Message Sender respectively. + 27Feb13: Commented-out several 'say's. + 30Jly14: Corrected .ImageList~create(...) statement in createIconList + method. + +------------------------------------------------------------------------------*/ + +-- Use the global .constDir for symbolic IDs - load them from OrderMgrView.h +.Application~addToConstDir("OrderMgr\OrderMgrView.h") + +call "OrderMgr\RequiresList.rex" + +::REQUIRES "ooDialog.cls" + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderMgrView v02-00 20Feb13 + -------------------- + To the user, this class is the Order Management Application. It provides + access to the various functions required for managing Sales orders. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderMgrView SUBCLASS RcDialog PUBLIC INHERIT ResizingAdmin + + ::ATTRIBUTE lv PRIVATE -- The ListView that contains the icons. + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + --say ".OrderMgrView-newInstance-01." + dlg = .OrderMgrView~new("OrderMgr\OrderMgrView.rc", IDD_ORDMGR) + dlg~activate + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + expose menuBar records idObjectMgr + --say "OrderMgrView-init-01; next stmt is 'forward class (super) continue'." + forward class (super) continue + --say "OrderMgrView-init-02." + menuBar = .ScriptMenuBar~new("OrderMgr\OrderMgrView.rc", IDR_ORDMGR_MENU, , , .true) + self~createIconList + records = self~initRecords + idObjectMgr = .local~my.ObjectMgr + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD defineDialog + --say "OrderMgrView-defineDialog-01." + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + --say "OrderMgrView-activate-01." + self~execute("SHOWTOP", IDI_DLG_OOREXX) + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar records iconList + --say "OrderMgrView-initDialog-01." + menuBar~attachTo(self) + + -- Create a proxy for the List View and store in instance variable 'lv'. + self~lv = self~newListView(IDC_ORDMGR_ICONS) + + -- Add the Image List to the ListView: + self~lv~setImageList(iconList, NORMAL) + -- Add icons (i.e. records) to the ListView: + do i=1 to records~items + self~lv~addRow(, i-1, records[i]~name) + end + + self~connectListViewEvent(IDC_ORDMGR_ICONS, "ACTIVATE", "onDoubleClick") + -- Following line required to allow icons to be dragged around the listview. + self~connectListViewEvent(IDC_ORDMGR_ICONS, "BEGINDRAG", "DefListDragHandler") + self~connectButtonEvent("IDC_ORDMGR_EXIT", "CLICKED",exitApp) + self~connectButtonEvent("IDC_ORDMGR_RESET","CLICKED",resetIcons) + self~setTitle(.HRSomv~WindowTitle) -- set dialog title. + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD defineSizing + --say "OrderMgrView-defineSizing-01." + -- Called automatically by ooDialog. + -- Order of arrays: left, top, right, bottom. + -- Order of array items: pinType, edge-of-other-window, id of other window + self~controlSizing(IDC_ORDMGR_RESET, - + .array~of('STATIONARY', 'LEFT' ), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'BOTTOM' ), - + .array~of('MYTOP', 'TOP' ) - + ) + self~controlSizing(IDC_ORDMGR_EXIT, - + .array~of('STATIONARY', 'RIGHT' ), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'RIGHT' ), - + .array~of('MYTOP', 'TOP' ) - + ) + self~controlSizing(IDC_ORDMGR_ICONS, - + .array~of('STATIONARY', 'LEFT' ), - + .array~of('STATIONARY', 'TOP' ), - + .array~of('STATIONARY', 'RIGHT' ), - + .array~of('STATIONARY', 'BOTTOM') - + ) + return .false + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createIconList PRIVATE + -- This method simulates getting the icon "data" for the OrderMgr view. + -- The icon data is loaded into 'iconList' which is an 'ImageList' as + -- required by the ListView control. + expose iconList + --say "OrderMgrView-createIconList." + imgCustList = .Image~getImage("customer\bmp\CustList.bmp") + imgProdList = .Image~getImage("product\res\ProdList.bmp") + imgOrderList = .Image~getImage("order\bmp\OrderList.bmp") + imgOrderForm = .Image~getImage("order\bmp\OrderForm.bmp") + iconList = .ImageList~create(.Size~new(64, 64), .Image~toId(ILC_COLOR4), 4, 0) + + -- Boldly assume no errors in creating the Image List or in the ~getImage statements. + iconList~add(imgCustList) -- item 0 in iconList (item 1 in records) + iconList~add(imgProdList) -- item 1 in iconList (item 2 in records) + iconList~add(imgOrderList) -- item 2 in iconList (item 3 in records) + iconList~add(imgOrderForm) -- item 3 in iconList (item 4 in records) + imgCustList~release + imgProdList~release + imgOrderList~release + imgOrderForm~release + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initRecords PRIVATE + -- This method simulates getting the "data" for the OrderMgr view. + expose records + records = .array~new() + + rec = .directory~new + rec~ID = "CustomerListModel" -- class name + rec~name = "Customer List" + records[1] = rec + + rec = .directory~new + rec~ID = "ProductListModel" + rec~name = "Product List" + records[2] = rec + + rec = .directory~new + rec~ID = "OrderListModel" + rec~name = "Sales Orders" + records[3] = rec + + rec = .directory~new + rec~ID = "OrderFormModel" + rec~name = "New Order" + records[4] = rec + + return records + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +/* ::METHOD initDialog + expose records iconList + --say "OrderMgrView-initDialog." + self~initDialog:super + -- Add the Image List to the ListView: + self~lv~setImageList(iconList, NORMAL) + -- Add icons (i.e. records) to the ListView: + do i=1 to records~items + self~lv~addRow(, i-1, records[i]~name) + end +*/ + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - Orders - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newOrder UNGUARDED + expose records + self~showModel(records[4]) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD orderList UNGUARDED + expose records + self~showModel(records[3]) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD orderSearch UNGUARDED + self~noMenuFunction(.HRSomv~OrdSrch) + + /*- - Customers - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD customerList UNGUARDED + expose records + self~showModel(records[1]) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD customerSearch UNGUARDED + self~noMenuFunction(.HRSomv~CustSrch) + + /*- - Products - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD productList + expose records + self~showModel(records[2]) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD productSearch UNGUARDED + self~noMenuFunction(.HRSomv~ProdSrch) + + /*- - New - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD product UNGUARDED + self~noMenuFunction(.HRSomv~NewProd) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD customer UNGUARDED + self~noMenuFunction(.HRSomv~NewCust) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD order UNGUARDED + self~newOrder + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSomv~HelpAbout) + + /*- - Message Sender- - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD messageSender UNGUARDED + --say "OrderMgrView-messageSender." + .MessageSender~newInstance(self) + --self~noMenuFunction(.HRSomv~HelpAbout) + + /*- - Message Sender- - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD person UNGUARDED + expose idObjectMgr + --say "OrderMgrView-Person." + objectMgr = .local.my.ObjectMgr + idObjectMgr~showModel("PersonModel","PA150", self) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSomv~NoMenu, self~hwnd, title, 'WARNING') + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Icon Double-Click + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD onDoubleClick UNGUARDED + expose records + --use arg id + --say "OrderMgrView-onDoubleClick-01." + -- Get the index of the item with the focus, use the index to retrieve + -- the item's record: + index = self~lv~focused -- lv is an attribute of the superclass. + record = records[index+1] + --say "OrderMgrView-onDoubleClick-02: Record ID =" record~ID + self~showModel(record) + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - PushButton Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD resetIcons + r = self~lv~arrange + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD exitApp UNGUARDED + --say "OrderMgrView-exitApp-01." + self~cancel + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD cancel + --say "OrderMgrView-cancel-01." + response = askDialog(.HRSomv~QExit, "N") + if response = 1 then forward class (super) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD ok + -- Invoked when enter key pressed - if passed to superclass, cancels dialog. + return -- do not close dialog - appears as a no-op to the user. + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showModel UNGUARDED + /* Surface the view of an icon (i.e. view of the model represented by the icon). + Ideally, if already instantiated, surface it, else makeInstance. + In this version, get as many as you like - but all have the same data!.*/ + expose idObjectMgr + use arg record -- record is a directory object. + className = record~ID + --say "OrderMgrView-showModel-01: className =" className -- Ex07 + r = idObjectMgr~showModel(classname, "a", self) -- Ex07 + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + HRSomv (Human-Readable Strings for OrderMgrView) v01-00 07Jun12 + --- + The HRSomv class provides constant character strings for user-visible messages + issued by the OrderMgrBaseView class. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSomv PRIVATE -- Human-Readable Strings + ::CONSTANT QExit "Are you sure you want to close all windows and exit the application?" + ::CONSTANT NoMenu "This menu item is not yet implemented." + ::CONSTANT OM "Order Manager" + ::CONSTANT OrdSrch "Order Search" + ::CONSTANT CustSrch "Customer Search" + ::CONSTANT ProdSrch "Product Search" + ::CONSTANT NewCust "New Customer" + ::CONSTANT NewProd "New Product" + ::CONSTANT HelpAbout "Help - About" + ::CONSTANT WindowTitle "Sales Order Management" -- Dialog Caption + ::CONSTANT Reset "Reset Icons" -- PushButton + ::CONSTANT ExitApp "Exit Application" -- PushButton + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/OrderMgr/RequiresList.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/OrderMgr/RequiresList.rex new file mode 100755 index 0000000..28f70b3 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/OrderMgr/RequiresList.rex @@ -0,0 +1,62 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: RequiresList.rex v01-00 01Apr13 + + Contains: The list of View components that OrderMgrView requires. + + Pre-requisites: Class "OrderMgrView + + Description: This script is called by OrderMgrView. + + Outstanding Problems: None reported. + + Changes: + v01-00 07Jun12: First Version + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + +------------------------------------------------------------------------------*/ + +--say "RequiresList." + +::REQUIRES "Customer\CustomerListView.rex" +::REQUIRES "Product\ProductListView.rex" +::REQUIRES "Order\OrderListView.rex" +::REQUIRES "Order\OrderFormView.rex" +::REQUIRES "Support\MessageSender.rex" + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductFile.txt b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductFile.txt new file mode 100644 index 0000000..a475007 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductFile.txt @@ -0,0 +1,7 @@ +ProdNo | ProdName | ListPrice | UOM | Size | Description +AB100/W | Baffle | 995 | 20 | S | 3" aluminium baffles - suitable for all bonderers. +CF300/X | Widget Box | 2895 | 6 | M | A 10 litre case with flat sides capable of holding quite a lot of stuff. +CU003 | Widget, 5in | 12499 | 100 | M | Meets all possible Widget needs, except those not possible. +EF500/W | Slodget | 1730 | 10 | S | 5" slodget for use with 3" baffles. +LM400 | Driblet, 10 guage | 34000 | 25 | L | 2' driblet guaranteed to dribletize most clambers. +XY200 | Blad Anchor | 3845 | 1 | M | Fixes all small or medium blads. diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductListView.h b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductListView.h new file mode 100644 index 0000000..67f5489 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductListView.h @@ -0,0 +1,48 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_PRODLIST_DIALOG 102 +#define IDR_PRODLIST_MENU 104 +#define IDI_PRODLIST_DLGICON 105 +#define IDC_PRODLIST_SHOWPRODUCT 1000 +#define IDC_PRODLIST_LISTVIEW 1001 +#define IDM_PRODLIST_NEWPROD 40000 +#define IDM_PRODLIST_ABOUT 40001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductListView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductListView.rc new file mode 100644 index 0000000..539fa1e --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductListView.rc @@ -0,0 +1,76 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include +#include +#include +#include "ProductListView.h" + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_PRODLIST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Product...", IDM_PRODLIST_NEWPROD + } + POPUP "Help" + { + MENUITEM "About...", IDM_PRODLIST_ABOUT + } +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PRODLIST_DIALOG DIALOG 0, 0, 225, 273 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Product List" +FONT 8, "Ms Shell Dlg" +{ + PUSHBUTTON "Cancel", IDCANCEL, 150, 235, 50, 14 + CONTROL "", IDC_PRODLIST_LISTVIEW, WC_LISTVIEW, WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SORTASCENDING, 15, 10, 190, 215 + DEFPUSHBUTTON "Show Product", IDC_PRODLIST_SHOWPRODUCT, 90, 235, 50, 14, WS_DISABLED +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_PRODLIST_DLGICON ICON ".\\product\\res\\ProdList.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductListView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductListView.rex new file mode 100755 index 0000000..3c446e7 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductListView.rex @@ -0,0 +1,249 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide - Exercise07 + + ProductListView v02-00 01Apr13 + ------------- + The view of a list of products. + + Changes: + v01-00 06Jun12: First version + v02-00 21Aug12: Modified for Exercise07 to use the Model-View Framework. + 11Jan13: Commented-out 'say' instructions. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + + Contains: classes "ProductListView, HRSplv (for human-readable strings) + + Pre-requisites: ProductListView.rc, ProductListView.h, ProdList.ico + + Description: An "intermediate" component - called by OrderMgr, + invokes "ProductView". + + Outstanding Problems: None reported. +*******************************************************************************/ + +.Application~addToConstDir("Product\ProductListView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "Product\ProductView.rex" +::REQUIRES "Support\RcView.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductListView v02-00 21Aug12 + ------------- + The view of a list of products. + Changes: + v01-00 06Jun12: First version + v02-00 21Aug12: Modified to use the Model-View Framework. + Comment "Ex07" shows where changes from Ex06 have been made. + 09Jan13: 'Say' instructions commented out or removed. + Standalone operation removed (not now needed). + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductListView SUBCLASS RcView PUBLIC + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use arg idModel, rootDlg -- Ex07 + --say ".ProductListView-newInstance-01: rootDlg =" rootDlg + dlg = self~new("Product\ProductListView.rc", "IDD_PRODLIST_DIALOG") + --say ".ProductListView-newInstance-02." + dlg~activate(idModel,rootDlg) -- Ex07 + return dlg -- Ex07 + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + forward class (super) continue + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + --say "ProductListView-createMenuBar-01." + menuBar = .ScriptMenuBar~new("Product\ProductListView.rc", "IDR_PRODLIST_MENU", , , .true) + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate unguarded + expose rootDlg modelData idModel -- Ex07 + use arg idModelInstance, rootDlg -- Ex07 + forward class (super) continue -- Ex07: required to get Model's data + modelData = RESULT -- Ex07: model's data returned by super + --say "ProductListView-activate-01: root =" root + self~popupAsChild(rootDlg, "SHOWTOP", ,"IDI_PRODLIST_DLGICON") + return self -- Ex07 + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar lvProducts btnShowProduct modelData idModel -- Ex07 + -- Called by ooDialog after SHOWTOP. + + menuBar~attachTo(self) + + --say "ProductListView-initDialog-01"; say + lvProducts = self~newListView("IDC_PRODLIST_LISTVIEW"); + lvProducts~addExtendedStyle(GRIDLINES FULLROWSELECT) + lvProducts~insertColumnPX(0,"Number", 60,"LEFT") + lvProducts~insertColumnPX(1,"Name", 160,"LEFT") + lvProducts~insertColumnPX(2,"Price", 50,"RIGHT") -- Ex07 (Right-adjust) + lvProducts~insertColumnPX(3,"UOM", 40,"RIGHT") -- Ex07 (added) + self~connectListViewEvent("IDC_PRODLIST_LISTVIEW","CLICK",itemSelected) + self~connectListViewEvent("IDC_PRODLIST_LISTVIEW","ACTIVATE",openItem) + self~connectButtonEvent("IDC_PRODLIST_SHOWPRODUCT","CLICKED",showProduct) + + -- Set model instance name into the Titlebar: + --parse var self~objectName + self~loadList + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newProduct UNGUARDED + self~noMenuFunction(.HRSplv~newProd) + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSplv~helpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg caption + ret = MessageDialog(.HRSplv~noMenu, self~hwnd, caption, 'WARNING') + + /*---------------------------------------------------------------------------- + Event Handling Methods - List Items + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD itemSelected unguarded + expose lvProducts + use arg id, itemIndex, columnIndex, keyState + --say "ProductListView-itemSelected: itemIndex, columnIndex, keyState:" itemIndex columnIndex keyState + --say "ProductListView-itemSelected: item selected is:"lvProducts~selected + if itemIndex > -1 then self~enableControl("IDC_PRODLIST_SHOWPRODUCT") + else self~disableControl("IDC_PRODLIST_SHOWPRODUCT") + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD openItem UNGUARDED + --say "ProductListView-openItem-01: item selected =" item + self~showProduct + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD showProduct UNGUARDED + expose lvProducts rootDlg + item = lvProducts~selected + --say "ProductListView-showProduct-01: item selected =" item + if item = -1 then do -- if no item selected. + ret = MessageDialog(.HRSplv~nilSelected, self~hwnd, title, 'WARNING') + return + end + info=.Directory~new + if lvProducts~getItemInfo(item, info) then do + --say "ProductListView-showProduct-02: info~text =" info~text + --say "ProductListView-showProduct-03; root =" root + objectMgr = .local~my.ObjectMgr + objectMgr~showModel("ProductModel", info~text, rootDlg) --Ex07 + --say "ProductListView-showProduct-04: after startProductView" + self~disableControl("IDC_PRODLIST_SHOWPRODUCT") + end + else do + say "ProductListView-showProduct-05: ~getItemInfo returned .false." + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD loadList + expose lvProducts modelData -- Ex07 + --say "ProductListView-loadList-01: dataArray =" modelData -- Ex07 + rows = modelData[count] -- Ex07 - number of rows + arrData = modelData[records] + --say "ProductListView-loadList-02:Dims =" arrData~dimension(1) arrData~dimension(2) + do i = 1 to rows + -- Change file price to display format (i.e. cents to dollars.cents): + displayPrice = (arrData[i,3]/100)~format(,2) + lvProducts~addRow( , ,arrData[i,1], arrData[i,2], displayPrice, arrData[i,4]) + end + lvProducts~setColumnWidth(1) -- set width of 2nd column to longest text entry. + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + HRSplv (Human-Readable Strings for ProductListView) v01-00 06Jun12 + ------ + The HRS class provides constant character strings for user-visible messages + issued by the ProductListView class. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +::CLASS HRSplv PRIVATE -- Human-Readable Strings + ::CONSTANT noMenu "This menu item is not yet implemented." + ::CONSTANT newProd "New Product" + ::CONSTANT helpAbout "Help - About" + ::CONSTANT nilSelected "Please select an item first." + +/*============================================================================*/ + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductModelsData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductModelsData.rex new file mode 100755 index 0000000..d5d33b5 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductModelsData.rex @@ -0,0 +1,265 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: v02-00 01Apr13 + + The ProductModel, ProductListModel, and ProductData Classes + + Contains: classes "ProductModel", "ProductListModel, "ProductData", + and "ProductDT". + Pre-requisites: None. + + Outstanding Problems: + None. + + Changes: + v00-02: 21Jly11 + v00-03: Correct "return" statement not in right place (typo in code!!) + Renamed the ProductDT attributes (initial "prod" deemed extraneous) + - 26Aug11: added some comments - no change to function. + v00-04 21Aug12: ProducListModel added. Modified to fit the MV Framework. + v02-00 13Jan12: Ex07: Some 'say' instructions removed or commented out. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + +------------------------------------------------------------------------------*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductModel v00-02 12Jly11 + ------------ + The "model" part of the Product component. + + interface productModel{ + aProductModel newInstance() -- Class method. + null activate() + aProductDT query() + }; + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::REQUIRES "Support\GenericFile.rex" +::REQUIRES "Support\Model.rex" + +::CLASS ProductModel SUBCLASS Model PUBLIC + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + -- Creates an instance and returns it. + use strict arg instanceName --Ex07 + forward class (super) continue --Ex07 + modelId = RESULT --Ex07 + return modelId --Ex07 + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + -- Gets its data from ProductData. + expose prodData + use strict arg prodData --Ex07 + return self --Ex07 + + + ::METHOD query PUBLIC + -- Returns data requested (no argument = return all) + -- self~myData (super's attribute) is a DT. So ask the data component for its + -- directory version of the data (an attribute of ProductData). + expose prodData + --say "ProductModel-query-01: prodData =" prodData + dir = .directory~new + return prodData +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductListModel v00-01 20Aug12 + ---------------- + The model for a list of Products. + Changes: + v00-01 20Aug12: First version + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductListModel SUBCLASS Model PUBLIC + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use arg instanceName + --self~myInstanceName = instanceName + self~wantList = .true -- set super's attribute + forward class (super) continue + id = RESULT + --say "ProductListModel-newInstance-01: id =" id + return id + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + expose arrData + use strict arg data + --self~myData = data + --say "ProductListModel-init-01: myData =" self~myData + return self + +-- ::METHOD query PUBLIC + /*---------------------------------------------------------------------------- + query - returns an array of all Product data. + In MVF this method is invoked by the RcView (or ResView) superclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --say "ProductListModel-query-01." +-- return self~myData + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductData v01-00 20Jly11 + ------------ + The "data" part of the Product component. + [interface (idl format)] + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductData SUBCLASS GenericFile PUBLIC + + ::ATTRIBUTE created CLASS + ::ATTRIBUTE dirData + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + use strict arg instanceName + if self~created = "CREATED" then do + self~created = .true + productDataId = self~new() + --if r = .true then self~created = .true + return productDataId + end + else do + say "... singleton component, so can't have more than one instance." + return .false + end + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init PUBLIC + expose filename numRecords + filename = "Product\ProductFile.txt"; columns = 6 + numRecords = self~init:super(filename, columns) + --say "ProductData-init-01: numRecords:" numRecords + return self + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getData PUBLIC -- ???? Use the DT??? + expose data + --say "ProductData-getData-01." + return data + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Find - forward to super, then pack data into a ProductDT. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getRecord PUBLIC + use strict arg dataKey + --say "ProductData-getRecord-00: dataKey = <"||dataKey||">" + forward class (super) continue + dirData = RESULT -- Generic File returns a directory. + --say "ProductData-getRecord-01: dirData =" dirData + self~dirData = dirData + if dirData = .false then return .false + -- Now convert dirData to a DT, pack it into dirData then return dirData: + dt = .ProductDT~new + dt~number = dirData["ProdNo"] + dt~name = dirData["ProdName"] + dt~price = dirData["ListPrice"] + dt~uom = dirData["UOM"] + dt~description = dirData["Description"] + dt~size = dirData["Size"] + dirData["DT"] = dt + return dirData + + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductDT - A business data type for Product data. v00-02 07Aug11 + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/ + +::CLASS ProductDT PUBLIC + + -- dtName XML Name Description + -- --------- ---------- ------------------------------- + -- ProductDT product + ::ATTRIBUTE number -- number Product Number + ::ATTRIBUTE name -- name Product Description + ::ATTRIBUTE price -- price Product Price (rightmost two digits are 100ths of currency unit) +--::ATTRIBUTE currency -- currency Three-letter currency code + ::ATTRIBUTE uom -- uom Product Unit of Measure + ::ATTRIBUTE description -- descrip Product Description + ::ATTRIBUTE size -- size Produce Size Category (S/M/L) + + ::METHOD list PUBLIC + expose number name price uom description size + say "---------------" + say "ProductDT-List:" + say "Number: " number "Name:" name + say "Price:" price "UOM:" uom "Size:" size + say "Description:" description + say "---------------" +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductView.h b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductView.h new file mode 100644 index 0000000..b22805a --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductView.h @@ -0,0 +1,69 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_PRODUCT_VIEW 106 +#define IDR_PRODUCT_VIEW_MENU 107 +#define IDD_PRODUCT_VIEW_ABOUT 108 +#define IDB_PROD_ICON 112 +#define IDI_PROD_DLGICON 113 +#define IDC_PRODABT_ICON_PLACE 1000 +#define IDC_PROD_NO 1000 +#define IDC_PROD_UOM 1001 +#define IDC_PROD_DESCRIPTION 1002 +#define IDC_PROD_STATIC2 1003 +#define IDC_PROD_STATIC3 1004 +#define IDC_PROD_STATIC1 1005 +#define IDC_PROD_STATIC4 1007 +#define IDC_PROD_STATIC5 1008 +#define IDM_PROD_UPDATE 40000 +#define IDM_PROD_REFRESH 40001 +#define IDM_PROD_CLOSE 40002 +#define IDM_PROD_PRINT 40003 +#define IDM_PROD_ABOUT 40004 +#define IDC_PROD_NAME 40010 +#define IDC_PROD_LIST_PRICE 40012 +#define IDC_PROD_SIZE_GROUP 40013 +#define IDC_PROD_SAVE_CHANGES 40014 +#define IDC_PROD_RADIO_SMALL 40015 +#define IDC_PROD_RADIO_MEDIUM 40016 +#define IDC_PRODABT_STATIC1 40017 +#define IDC_PROD_RADIO_LARGE 40017 +#define IDC_PRODABT_STATIC2 40018 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductView.rc new file mode 100644 index 0000000..742651b --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductView.rc @@ -0,0 +1,124 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + + +#include +#include +#include +#include "ProductView.h" + + + + +// +// Bitmap resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDB_PROD_ICON BITMAP ".\\res\\producticon.bmp" + + + +// +// Menu resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_PRODUCT_VIEW_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "&Update Product", IDM_PROD_UPDATE + MENUITEM "Refresh Data", IDM_PROD_REFRESH + MENUITEM "Print...", IDM_PROD_PRINT + MENUITEM "Close", IDM_PROD_CLOSE + } + POPUP "Help" + { + MENUITEM "About...", IDM_PROD_ABOUT + } +} + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PRODUCT_VIEW DIALOG 0, 0, 248, 228 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Product" +FONT 8, "Ms Shell Dlg" +{ + LTEXT "Product Number:", IDC_PROD_STATIC1, 25, 28, 54, 8, SS_LEFT + LTEXT "Product Name:", IDC_PROD_STATIC2, 25, 53, 48, 8, SS_LEFT + LTEXT "List Price:", IDC_PROD_STATIC3, 25, 78, 32, 8, SS_LEFT + LTEXT "UOM:", IDC_PROD_STATIC5, 151, 78, 20, 8, SS_LEFT + LTEXT "Description", IDC_PROD_STATIC4, 25, 103, 36, 8, SS_LEFT + EDITTEXT IDC_PROD_NO, 95, 25, 50, 14, NOT WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_PROD_NAME, 95, 51, 130, 13, ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_PROD_LIST_PRICE, 95, 75, 40, 14, ES_AUTOHSCROLL | ES_READONLY, WS_EX_RIGHT + EDITTEXT IDC_PROD_UOM, 175, 75, 40, 14, ES_AUTOHSCROLL | ES_READONLY, WS_EX_RIGHT + GROUPBOX "Size Category", IDC_PROD_SIZE_GROUP, 31, 151, 189, 30, WS_GROUP, WS_EX_CLIENTEDGE + AUTORADIOBUTTON "Small", IDC_PROD_RADIO_SMALL, 46, 165, 33, 8, WS_DISABLED + AUTORADIOBUTTON "Medium", IDC_PROD_RADIO_MEDIUM, 110, 165, 41, 8, WS_DISABLED + AUTORADIOBUTTON "Large", IDC_PROD_RADIO_LARGE, 168, 165, 34, 8, WS_DISABLED + DEFPUSHBUTTON "Save Changes", IDC_PROD_SAVE_CHANGES, 180, 195, 52, 14, WS_DISABLED + EDITTEXT IDC_PROD_DESCRIPTION, 95, 100, 125, 30, ES_MULTILINE +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PRODUCT_VIEW_ABOUT DIALOG 0, 0, 204, 109 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "About Product View" +FONT 8, "Ms Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 143, 88, 50, 14 + CONTROL "", IDC_PRODABT_ICON_PLACE, WC_STATIC, SS_BITMAP | SS_NOTIFY | SS_REALSIZECONTROL, 16, 7, 102, 71 + LTEXT "A view of a Product component.", IDC_PRODABT_STATIC1, 15, 84, 110, 15, SS_LEFT + LTEXT "An example of an About box using .ResDialog.", IDC_PRODABT_STATIC2, 130, 9, 65, 65, SS_LEFT +} + + + +// +// Icon resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_PROD_DLGICON ICON ".\\res\\Product.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductView.rex new file mode 100755 index 0000000..72f09c3 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/ProductView.rex @@ -0,0 +1,492 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: ProductView.rex - The ProductView component v02-00 01Apr13 + + Contains: classes "ProductView", "AboutDialog", and "HRSpv". + + Pre-requisites: ProductView.dll, ProductView.h, Pproduct.ico, ProductIcon.bmp, + Support\NumberOnlyEditEx.cls (copied from ooDialog Samples + into the folder Exercise06\Support) + + Description: A sample Product View component - part of the sample + Order Management application. + + Outstanding Problems: None reported. + + Changes: + v01-00 03Jun12: First version for Exercise05. + v01-01 06Jun12: Minor changes for Exercise06. + v02-00 11Jan12: Removed stand-alone operation, plus some comments. + Method 'getData' removed (now redundant). + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. +------------------------------------------------------------------------------*/ + +.Application~addToConstDir("Product\ProductView.h") + + +::requires "ooDialog.cls" +::requires "Support\NumberOnlyEditEx.cls" +::requires "Product\ProductModelsData.rex" +::REQUIRES "support\ResView.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductView v02-00 09Jan13 + ----------- + The "view" part of the Product component. Now designed to operate from its own + folder. Should be invoked from immediately outside the Product folder. + [interface (idl format)] + + Changes: + v01-00 03Jun12: First version. + v01-01 06Jun12: Minor changes for Exercise06. + v02-00 09Jan13: Removed stand-alone startup (not now needed), plus some + comments. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductView SUBCLASS ResView PUBLIC + + ::ATTRIBUTE dialogState PRIVATE -- States are: 'closable' or 'inUpdate". + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC UNGUARDED + use arg idModel, rootDlg --Ex07 + --say ".ProductView-newInstance-01: model, rootDlg =" idModel rootDlg + .Application~addToConstDir("Product\ProductView.h") + -- Create an instance of ProductView and show it: + dlg = self~new("Product\res\ProductView.dll", IDD_PRODUCT_VIEW) + dlg~activate(idModel, rootDlg) --Ex07 + return dlg --Ex07 + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + forward class (super) continue + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose prodData + use arg idModel, rootDlg, prodData --Ex07- note: prodData is a ProductDT. + forward class (super) continue -- MVF: required to get Model's data + dirdata = RESULT -- MVF: model's data returned by super + prodData = dirData[DT] -- dirData is a directory - 'DT' + -- for 'DataType' is in the directory. + self~dialogState = "closable" + self~popUpAsChild(rootDlg,"SHOWTOP",,"IDI_PROD_DLGICON") + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar prodControls prodData --Ex07 + --say "ProductView-initDialog-01" + + menuBar = .BinaryMenuBar~new(self, IDR_PRODUCT_VIEW_MENU, , self, .true) + + prodControls = .Directory~new + prodControls[ecProdNo] = self~newEdit("IDC_PROD_NO") + prodControls[ecProdName] = self~newEdit("IDC_PROD_NAME") + prodControls[ecProdPrice] = self~newEdit("IDC_PROD_LIST_PRICE") + prodControls[ecUOM] = self~newEdit("IDC_PROD_UOM") + prodControls[ecProdDescr] = self~newEdit("IDC_PROD_DESCRIPTION") + prodControls[gbSizes] = self~newEdit("IDC_PROD_SIZE_GROUP") + prodControls[rbSmall] = self~newRadioButton("IDC_PROD_RADIO_SMALL") + prodControls[rbMedium] = self~newRadioButton("IDC_PROD_RADIO_MEDIUM") + prodControls[rbLarge] = self~newRadioButton("IDC_PROD_RADIO_LARGE") + prodControls[pbSaveChanges] = self~newPushButton("IDC_PROD_SAVE_CHANGES") + self~connectButtonEvent("IDC_PROD_SAVE_CHANGES","CLICKED",saveChanges) + + -- Use NumberOnlyEditEx.cls to enforce numeric only entry for Price and UOM: + prodControls[ecProdPrice]~initDecimalOnly(2,.false) -- 2 decimal places, no sign. + prodControls[ecUOM]~initDecimalOnly(0,.false) -- 0 decimal places, no sign. + prodControls[ecProdPrice]~connectCharEvent(onChar) + prodControls[ecUOM]~connectCharEvent(onChar) + + self~showData -- Show the data + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Event Handler Methods - MenuBar Events: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD updateProduct UNGUARDED + expose prodControls + + -- Enable the controls to allow changes to the data: + prodControls[ecProdName]~setReadOnly(.false) + prodControls[ecProdPrice]~setReadOnly(.false) + prodControls[ecUOM]~setReadOnly(.false) + prodControls[ecProdDescr]~setReadOnly(.false) + prodControls[rbSmall]~enable + prodControls[rbMedium]~enable + prodControls[rbLarge]~enable + self~enableControl("IDC_PROD_SAVE_CHANGES") + prodControls[pbSaveChanges]~state = "FOCUS" -- Put input focus on the button + self~tabToNext() -- put text cursor on Product Description + -- (as if the user had pressed tab) + self~dialogState = "inUpdate" + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD refreshData UNGUARDED + self~disableControl("IDC_PROD_SAVE_CHANGES") + self~showData + self~dialogState = "closable" + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD print UNGUARDED + ans = MessageDialog(.HRSpv~printMsg) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD close UNGUARDED + return self~cancel:super + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + dlg = .AboutDialog~new("ProductView.dll", IDD_PRODUCT_VIEW_ABOUT) + dlg~execute("SHOWTOP") + + + /*---------------------------------------------------------------------------- + Event Handler Methods - PushButton Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + "Save Changes" - Collects new data, checks if there has indeed been a + change, and if not, issues a warning msg. Disables the + button when valid changes made. */ + ::METHOD saveChanges UNGUARDED + expose prodControls prodData + + -- Transform data from view format (as in controls) to app format (a directory): + newProdData = self~xformView2App(prodControls) + + -- Check if anything's changed; if not, show msgbox and exit with controls enabled. + -- If changed, go on to validate data. + result = self~checkForChanges(newProdData) + if result = .false then do + msg = .HRSpv~nilSaved + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRSpv~updateProd,"OK","WARNING","DEFBUTTON2 APPLMODAL") + return + end + + -- Now validate data: + result = self~validate(newProdData) -- returns a null string or error messages. + -- Better would be a set of error numbers. + -- If no problems, then show msgbox and go on to disable controls. + if result = "" then do + msg = .HRSpv~saved + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRSpv~updateProd,"OK","INFORMATION","DEFBUTTON1 APPLMODAL") + end + -- If problems, then show msgbox and leave user to try again or refresh or exit. + else do + msg = result||.EndOfLine||.HRSpv~notSaved + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRSpv~updateProd,"OK","ERROR","DEFBUTTON1 APPLMODAL") + return + end + + -- Send new data to be checked by CustomerModel object (not implemented). + + -- Disable controls that were enabled by menu "ActionsFile-->Update" selection: + prodControls[ecProdName]~setReadOnly(.true) + prodControls[ecProdDescr]~setReadOnly(.true) + prodControls[ecProdPrice]~setReadOnly(.true) + prodControls[ecUom]~setReadOnly(.true) + if newProdData~size \= "S" then prodControls[rbSmall]~disable + if newProdData~size \= "M" then prodControls[rbMedium]~disable + if newProdData~size \= "L" then prodControls[rbLarge]~disable + self~disableControl("IDC_PROD_SAVE_CHANGES") + self~dialogState = "closable" + + prodData = newProdData + say "ProductView-saveChanges: new values are:" + prodData~list + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Event Handler Methods - Keyboard Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD onChar UNGUARDED + -- called for each character entered in the price or UOM fields. + forward to (arg(6)) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + "OK" - This is a no-op method that over-rides the default Windows action + of 'close window' for an Enter key --*/ + ::METHOD ok unguarded + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD cancel + -- If in the process of updating, then ask whether any changes should be + -- thrown away and dialog closed. If yes then close by calling the superclass, + -- else nop. If not in update, then close immediately + if self~dialogState = "inUpdate" then do + ans = MessageDialog(.HRSpv~closeInUpdate, self~dlgHandle, .HRSpv~updateIP, "YESNO", "WARNING", "DEFBUTTON2") + if ans = .PlainBaseDialog~IDYES then return self~cancel:super + else nop + end + else return self~cancel:super + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showData + -- Transfrom data (where necessary) to display format, and then disable controls. + expose prodControls prodData + -- Set data in controls: + prodControls[ecProdNo]~setText( prodData~number ) + prodControls[ecProdName]~setText( prodData~name ) + -- Price in prodData has no decimal point - 2 decimal places are implied - hence /100 for display. + -- Pad with zeros if necessary. + displayPrice = (prodData~price/100)~format(,2) -- corrected in Ex07 + prodControls[ecProdPrice]~setText(displayPrice) + prodControls[ecUOM]~settext( proddata~uom ) + prodControls[ecProdDescr]~setText(prodData~description ) + size = prodData~size + -- Disable controls + prodControls[ecProdName]~setReadOnly(.true) + prodControls[ecProdPrice]~setReadOnly(.true) + prodControls[ecUOM]~setReadOnly(.true) + prodControls[ecProdDescr]~setReadOnly(.true) + prodControls[rbSmall]~disable + prodControls[rbMedium]~disable + prodControls[rbLarge]~disable + -- But check correct button and enable it to highlight it to the user: + select + when size = "S" then do + .RadioButton~checkInGroup(self,"IDC_PROD_RADIO_SMALL","IDC_PROD_RADIO_LARGE","IDC_PROD_RADIO_SMALL") + prodcontrols[rbSmall]~enable + end + when size = "M" then do + .RadioButton~checkInGroup(self,"IDC_PROD_RADIO_SMALL","IDC_PROD_RADIO_LARGE","IDC_PROD_RADIO_MEDIUM") + prodcontrols[rbMedium]~enable + end + otherwise do + .RadioButton~checkInGroup(self,"IDC_PROD_RADIO_SMALL","IDC_PROD_RADIO_LARGE","IDC_PROD_RADIO_LARGE") + prodcontrols[rbLarge]~enable + end + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD checkForChanges + -- Check whether any data has actually changed when "Save Changes" button + -- has been pressed. Return .true if data changed, else returns .false. + expose prodData + use arg newProdData + + changed = .false + select + when newProdData~name \= prodData~name then changed = .true + when newProdData~price \= prodData~price then changed = .true + when newProdData~uom \= prodData~uom then changed = .true + when newProdData~description \= prodData~description then changed = .true + when newProdData~size \= ProdData~size then changed = .true + otherwise nop + end + return changed + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD validate + -- Validation: 1. Check price/UOM not changed > 50% up or down. + -- 2. Cannot change from Large to Small without UOM increasing + -- by at least 100%; nor from Small to Large without + -- decreasing by more than 50%. + -- 3. Product Description <= 100 characters. + -- 4. Product Name <= 30 characters. + -- Returns string of messages - the null string if all OK. + expose prodData + use arg newProdData + msg = "" + + -- Check Price (catches decimal point errors also): + price = prodData~price; newPrice = newProdData~price + oldUom = prodData~uom; newUom = newProdData~uom -- 'oldUom - avoids name conflict with 'uom' in newProddata~uom. + if ((price/oldUom)*1.5 < newPrice/newUom) | (newPrice/newUom < (price/oldUom)/2) then do + msg = msg||.HRSpv~badRatio||" " + end + + -- Check Size vs UOM: + if prodData~size = "L" & newProdData~size = "S" - -- Large to Small + & prodData~uom/2 < newProdData~uom then do + msg = msg||.HRSpv~uomTooBig||" " + end + if prodData~size = "S" & newProdData~size = "L" - -- Small to Large + & prodData~uom*2 > newProdData~uom then do + msg = msg||.HRSpv~uomTooSmall||" " + end + + -- Check Product Description length: + if newProdData.description~length > 80 then do + msg = msg||.HRSpv~descrTooBig||" " + end + + -- Check Product Name length: + if newProdData~name~length > 30 then do + msg = msg||.HRSpv~prodNameTooBig + end + + return msg + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD xformView2App + -- Transforms Product Data from View form (in the GUI controls) to + -- App form (a directory with address as an array). + expose prodControls + prodData = .ProductDT~new + prodData~number = prodControls[ecProdNo]~gettext() + prodData~name = prodControls[ecProdName]~getText() + price = prodControls[ecProdPrice]~getText() + -- Data entered has or assumes a decimal point; but data in "application" + -- is a whole number (e.g. $42.42 is recorded in the database as "4242"). + -- So re-format data from decimal to whole number: + priceTwoDecs = price~format(,2) -- force 2 dec positions + -- Re-display price properly formatted (in case the user did not format correctly - e.g. entered "42" or "38.4"): + prodControls[ecProdPrice]~setText(priceTwoDecs) + -- Now format price to "application" format: + price = (priceTwoDecs*100)~format(,0) -- multiply by 100 and then force whole number. + prodData~price = price + prodData~uom = prodControls[ecUOM]~getText() + prodData~description = prodControls[ecProdDescr]~getText() + select + when prodControls[rbSmall]~checked then prodData~size = "S" + when prodControls[rbMedium]~checked then prodData~size = "M" + otherwise prodData~size = "L" + end + + return prodData + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + AboutDialog v01-00 03Jun12 + ------------- + The "About" class - shows a dialog box that includes a bitmap - part of the + ProductView component. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS AboutDialog SUBCLASS ResDialog + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method initDialog + expose font image + resImage = .ResourceImage~new(self) -- Create an instance of a resource image + image = resImage~getImage(IDB_PROD_ICON) -- Create an image from the Product bitmap + stImage = self~newStatic(IDC_PRODABT_ICON_PLACE)~setImage(image) -- Create a static text control and set the image in it + font = self~createFontEx("Ariel", 12) -- Create up a largish font with which to display text and ... + self~newStatic(IDC_PRODABT_STATIC2)~setFont(font) -- ... set the static text to use that font. + -- Provide for a double-click in Product icon: + self~connectStaticNotify("IDC_PRODABT_ICON_PLACE", "DBLCLK", showMsgBox) + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method showMsgBox + --say "AboutDialog-showMsgBox-01." + ans = MessageDialog(.HRSpv~AboutDblClick) + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method leaving + expose font image + self~deleteFont(font) + image~release() + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRSpv) v01-00 03Jun12 + ------------------------------ + The HRSpv class provides constant character strings for user-visible messages. + + Changes: + v00-03 11Feb12: Changed class name NRS to HRSpv + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSpv PRIVATE -- Human-Readable Strings + ::CONSTANT AboutDblClick "You double-clicked!" + ::CONSTANT badRatio "The new price/UOM ratio cannot be changed more than 50% up or down." + ::CONSTANT closeInUpdate "Any changes made will be lost. Exit anyway?" + ::CONSTANT descrTooBig "The Product Description is too long." + ::CONSTANT nilSaved "Nothing was changed! Data not saved." + ::CONSTANT notSaved "Changes Not Saved!" + ::CONSTANT prodNameTooBig "The Product Name is too long." + ::CONSTANT saved "Changes saved." + ::CONSTANT uomTooBig "The new UOM is too large." + ::CONSTANT uomTooSmall "The new UOM is too small." + ::CONSTANT updateIP "Update in process" + ::CONSTANT updateProd "Update Product" + ::CONSTANT printMsg "The 'Print...' menu item is not yet implemented." + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/ProdList.BMP b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/ProdList.BMP new file mode 100644 index 0000000000000000000000000000000000000000..6e4e8c14117bbb55d59e59ab37c5452bc0ebf503 GIT binary patch literal 2166 zcmd6mO-{rx426xv0*MV3H($6=ixaCD#mPHm@VaAGoZeWbKXY zymIL1Q$AEpZtBbs~FcyPw2{w~hckMz#zq^_LIH2z8MnmEV&Or0>%WWQ z+~@in%neJGZ#7{*78M{8^TLqNw^~c=9mFH8%hcaMo#UYRRuix)>LRDXnGgEg5kGI_Beam(4 G{^1vcAq+$S literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/ProdList.ico b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/ProdList.ico new file mode 100644 index 0000000000000000000000000000000000000000..51333f85647fcd2128fd4443472a5a2a4cd5b2a1 GIT binary patch literal 2686 zcmeH`y>Y`Z426-qRH>3C1E@-$1ypzi?T|6Nx$+)BP$0!4biNcROj{&{50ChfB=Uma zy1rw6m7h0}PZ9aTwc@(tqJ1`Yg_!Ty>^uHunQ8uvZ5XmFi|FQ?Lv+@SnE5h4r`4XH z@U4XQ4B+1AQ+{@6^(pTh`uOOTHOH4OKSXn)erJ8k8;5~DIcxn^**J`2eazZBfom-X1{t2L}6-a9|A<4=}OmuW(CJ-$kv!gEKz$ z4{@eG(>te=x^l6h@h@`M#5Lw0?Y_@A5@+|V|1OH_nCo*eH*8gY)C7CVZx}@})Mp$4 zT+b31ug!YEHK{T&d{sb?LoDeTzaggmB;KTP<3Hq4S#?YrCes(YIlTR z;D&O)hOpFFV1pW)fCLj3?M%5W8dliybz|C%3zvp(@|^cvCMPo=P(Y8x0vb#3#spXa z)DYT&M6&yTt9Gv!p3Y8qy1L-;`S6mwBCq{^czSy9R#oBEGxu`y^w9Uq5A`X(lz5{(2&|Kubz5+Fem%I4G*LetX-lhDizK9JDt zEZ&pw+#JI5^N1`gU?3XBz~UkXmzFTNyo`@4D~QEn__Vr;&sl40_(G!V>-e#;fnS@O z_!^JnTUH{0IOTU;M}p=$r9pJVfI)t4Z6TRVB2Jmu-iE%j17mj=$y5rdy*>Qi-$y!~ zMmm#0h8)&m2mXf+xRm^obC;YetvAc0%F7Iuk|bSvsBpRIBr6vg${9t&Q!Y22vat&c z6*ikqym~kP{F;-u-a6y3UtzF29Mv`TPX3@Nw`=$4eT!hNVz3Ir*(yNEyRQz<^VW2q zeB-nz*ck*-Jb$sy$sgT5QCfQZ2w*mwkDa^EWu^A0sj#>JC^8k6G`^t!al745+V0Tk Ve*BDIcQv=T{!~kI?$`Xw`~Vw((KY}8 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/ProductIcon.bmp b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/ProductIcon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..13ca9acc4179b04c02b504064d5b3f0218fe66f8 GIT binary patch literal 268234 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 NNPq-NNI<+V{0~hZ)gJ%= literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/ProductView.dll b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/ProductView.dll new file mode 100644 index 0000000000000000000000000000000000000000..ce89cc211241c3c6cfedff43f29db24824f35d0a GIT binary patch literal 272896 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 JuXmf~^#4li*_HqR literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/res.mak b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/res.mak new file mode 100644 index 0000000..42aefbc --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Product/res/res.mak @@ -0,0 +1,50 @@ +#/*----------------------------------------------------------------------------*/ +#/* */ +#/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */ +#/* */ +#/* This program and the accompanying materials are made available under */ +#/* the terms of the Common Public License v1.0 which accompanies this */ +#/* distribution. A copy is also available at the following address: */ +#/* https://www.oorexx.org/license.html */ +#/* */ +#/* Redistribution and use in source and binary forms, with or */ +#/* without modification, are permitted provided that the following */ +#/* conditions are met: */ +#/* */ +#/* Redistributions of source code must retain the above copyright */ +#/* notice, this list of conditions and the following disclaimer. */ +#/* Redistributions in binary form must reproduce the above copyright */ +#/* notice, this list of conditions and the following disclaimer in */ +#/* the documentation and/or other materials provided with the distribution. */ +#/* */ +#/* Neither the name of Rexx Language Association nor the names */ +#/* of its contributors may be used to endorse or promote products */ +#/* derived from this software without specific prior written permission. */ +#/* */ +#/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +#/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +#/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +#/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +#/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +#/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +#/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +#/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +#/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +#/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +#/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#/* */ +#/*----------------------------------------------------------------------------*/ + +# nMake-compatible Make file for the ProductView resource-only DLL. + +all: ProductView.dll + +ProductView.dll: ProductView.res + link /NOLOGO $(@B).res /NOENTRY /DLL /MACHINE:$(MACHINE) /OUT:$(@B).dll + +# Create .res from .rc +ProductView.res: ..\ProductView.rc + rc -r -fo$(@B).res ..\$(@B).rc + +clean: + del *.res *.dll 1>nul 2>&1 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/RequiresList.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/RequiresList.rex new file mode 100755 index 0000000..6b6ff8c --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/RequiresList.rex @@ -0,0 +1,84 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: The Order Management Application + Startup.rex v01-02 01Apr13 + + Description: This file is the "application" or "root" or "starter" part + of the sample Order Management application. + + Changes: + v01-00 06Jun12: First version. + v01-01 07Aug12: Support for ObjectMgr and ViewMgr added. MessageSender is + optional. + 11Jan13: Deleted Commented-out startup of MessageSender. + 21Mar13: Added Copyright notice. + v01-02 01Apr13: After ooDialog 4.2.2, "Samples" folder changed name to + "Extras", so change to ::Requires needed. + +------------------------------------------------------------------------------*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + RequiresList v01-00 16Sep12 + ---- + The list of files containing classes invoked by the ObjectMgr + + Changes: + v01-00 16Sep12: First version. + 11Jan13: Commented-out 'say' instruction. + 26May13: Corrected paths for ::REQUIRES afrer re-factoring. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ +--say "RequiresList-01." +::REQUIRES "Customer\CustomerView.rex" +::REQUIRES "Customer\CustomerModelsData.rex" +::REQUIRES "Customer\CustomerListView.rex" +::REQUIRES "Product\ProductModelsData.rex" +::REQUIRES "Product\ProductListView.rex" +::REQUIRES "Order\OrderFormView.rex" +::REQUIRES "Order\OrderListView.rex" +::REQUIRES "Order\OrderModelsData.rex" +::REQUIRES "Order\OrderView.rex" +::REQUIRES "Extras\Wow4\WowView.rex" +::REQUIRES "Extras\Wow4\WowModel.rex" +::REQUIRES "Extras\Wow4\WowData.rex" +::REQUIRES "Extras\Person\PersonView.rex" +::REQUIRES "Extras\Person\PersonModelData.rex" +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Startup.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Startup.rex new file mode 100755 index 0000000..1738c01 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Startup.rex @@ -0,0 +1,74 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: The Order Management Application + Startup.rex v01-02 01Apr13 + + Description: This file is the "application" or "root" or "starter" part + of the sample Order Management application. + + Changes: + v01-00 06Jun12: First version. + v01-01 07Aug12: Support for ObjectMgr and ViewMgr added. MessageSender is + optional. + 11Jan13: Deleted Commented-out startup of MessageSender. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + +------------------------------------------------------------------------------*/ + +parse arg pwOption +if pwOption = "enterPW" then do + pwd = PasswordBox("Please enter your password","Sign In") + if pwd \= "Password" then exit +end + +-- Set application defaults: +.Application~setDefaults("O", , .false) + +-- Create Object Manager and View Manager: +om = .ObjectMgr~new +vm = .ViewMgr~new + +-- Start OrderMgrView: +.OrderMgrView~newInstance + +::REQUIRES "OrderMgr\OrderMgrView.rex" +::REQUIRES "Support\ObjectMgr.rex" +::REQUIRES "Support\ViewMgr.rex" +::REQUIRES "Support\MessageSender.rex" +/******************************************************************************/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/GenericFile.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/GenericFile.rex new file mode 100755 index 0000000..20d9619 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/GenericFile.rex @@ -0,0 +1,271 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise07: GenericFile v01-00 11Jan13 + + Contains: class "GenericFile". + + Pre-requisites: None. + + Desription: A component that opens and reads a text file that has a specific + format. + Outstanding problems: None reported. + + Changes: + v01-00 + 21Jly12: First version. + 25Aug12: Moved file open from init method to a separate method. + 16Dec12: Trivial correction of a couple of comments. + 11Jan13: Commented-out 'say' instructions. + + Constraints: Format of each record must be: + recordId | field2 | field3 | .... | fieldn + Note that the RecordId or Key must be in the first column. + } +------------------------------------------------------------------------------*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + GenericFile v01-01 24Aug12 + ----------- + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS GenericFile PUBLIC + + ::ATTRIBUTE fileHeaders GET PUBLIC -- a 1D array of column labels/headers + ::ATTRIBUTE fileHeaders SET PRIVATE + ::ATTRIBUTE fileRecords GET PUBLIC -- a 2D array of records + ::ATTRIBUTE fileRecords SET PRIVATE + ::ATTRIBUTE fileArray GET PUBLIC -- a 1D array of raw data from the file. + ::ATTRIBUTE fileArray SET PRIVATE + ::ATTRIBUTE fileAsDirectory GET PUBLIC -- a directory containing: + -- * headers: a 1D array + -- * records: a 2D array + -- * count: the number of records + ::ATTRIBUTE fileAsDirectory SET PRIVATE + + /*---------------------------------------------------------------------------- + Class Methods - none. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + init - Given a filename and the number of columns in the file, loads the + fileinto attribute 'fileArray', a 1-dimensional array where each item + is a single "raw" file line or record. + Returns the number of records in the file (or, if unsuccesful at reading + the file, returns 0 (.false) if file doesn't exist, or -1 if no records + in the file. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init PUBLIC + expose columns recordCount fileArray filename + use arg filename, columns + dirFile = self~readFile(fileName, columns) + if dirFile = .false | dirFile = -1 then return .false + self~fileAsDirectory = dirFile -- store whole file in the attribute + self~fileHeaders = dirFile[headers] -- store fileHeaders in the attribute + self~fileRecords = dirFile[records] -- store fileRecords in the attribute + recordCount = dirFile[count] -- store no. records in the attribute + return recordCount + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + readFile - Given a filename and the number of columns, reads a file and + returns it in "fileAsDirectory" format. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD readFile PRIVATE + expose recordCount + use strict arg fileName, columns + recordCount = 0 + --say "GenericFile-readFile-01: fileName =" fileName "columns =" columns + file = .stream~new(filename) + --say "GenericFile-readFile-02: file~query(exists):" file~query("exists") + if file~query("exists") = "" then do + say "GenericFile-readFile-03: file" filename " does not exist." + return .false + end + recordCount = file~lines + if recordCount < 2 then do + recordCount = 0 + return -1 -- Problem - no records, only headers - or nothing!. + end + recordCount = recordCount - 1 -- Exclude columns headers line from the count. + arrRawfile = file~makearray -- read file into an array; each line is an array item + file~close + --say "GenericFile-readFile-04:" filearray~string + self~fileArray = arrRawFile -- (deprecated) store "raw" file array in attribute + + -- Now turn the raw file data into a directory: + -- (1) get a 1D array of column headers or "field labels": + fileHeaders = arrRawFile[1] + arrFileHeaders = self~parseLine(fileHeaders, columns) + self~fileHeaders = arrFileHeaders + -- (2) get a 2D array of field values from data records: + arrFileRecords = .Array~new + do i=1 to recordCount -- get a 2D array of file records + arrRecord = self~parseLine(arrRawFile[i+1], columns) + do j = 1 to columns + arrFileRecords[i,j] = arrRecord[j] + end + end + self~fileRecords = arrFileRecords + -- (3) Build a directory containing headers, records, and lines (or record count). + dirFile = .directory~new + dirFile[headers] = arrFileHeaders + dirFile[count] = recordCount + dirFile[records] = arrFileRecords + return dirFile -- Returns a directory containing the file and file info. + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + parseLine - parse text from file line and place into an array. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD parseLine PRIVATE -- returns a 1D array of fields + use strict arg line, columns + arr = .Array~new + do i=1 to columns + parse var line field "|" line + field = field~strip + arr[i] = field + end + return arr + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + list - Lists a file in raw form on the console. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD list PUBLIC + expose recordCount filename + if recordCount = 0 then do + return .false + end + say; say "GenericFile-list: records in File '"||filename||"'" + say self~fileHeaders + do i=1 to recordCount + say self~fileRecords[i] + end + return .true + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + getRecord - Given a "key", returns a directory containing the record data + associated with that key. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getRecord PUBLIC + -- Returns a directory containing the data for the record with the requested + -- key (dataKey). + expose recordCount columns + use strict arg dataKey + if dataKey = "" then return .false + --say "GenericFile-getRecord-01: dataKey=" dataKey + if recordCount = 0 then do + --say "GenericFile-getRecord: recordCount is zero - no records!" + return .false -- File empty or does not exist + end + + found = .false + do recordNo = 1 to recordCount + --say "GenericFile-getRecord-02: self~fileRecords dims:" self~fileRecords~dimension + recordId = self~fileRecords[recordNo,1] + --say "GenericFile-getRecord-03: recordId, dataKey = <"||recordId||">" "<"||dataKey||">" + if recordId = dataKey then do + found = .true; leave; + end + end + if \found then return .false -- Records exist, but specified record not found. + + dirData = .Directory~new + do j=1 to columns + header = self~FileHeaders[j] + dirData[header] = self~fileRecords[recordNo,j] + end + -- say "GenericFile-getRecord-04: Results:" + -- do i over dirData + -- say "'"||i||"' = '"||dirData[i]||"'" + -- end + --say "GenericFile-getRecord-05: record =" + return dirData + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + getFile - returns file as a directory, with indices 'headers', 'records', 'count'. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getFile PUBLIC + --say "GenericFile-getFile-01: self~fileAsDirectory =" self~fileAsDirectory + --do i over self~fileAsDirectory + --say "GenericFile-getFile-02 index & type =" i i~objectName + --end + --arrData = self~fileAsDirectory[records] + --say "GenericFile-getFile-03 - arrData =" arrData + --say "GenericFile-getFile-04 - arrData[1,1] =" arrData[1,1] + return self~fileAsDirectory + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + ::METHOD update -- INCOMPLETE!!! + -- Given a record as a Directory, replaces the existing record with the + -- new data and writes the whole file to disk. + -- Returns .false (a) if a record with the provided key does not exist, or + -- (b) if values for all fields are not provided. + + expose recordCount columns fileArray fileName + use arg recordKey, dirRecord -- record key + new record + + -- Find the record: + do i=2 to recordCount + record = fileArray[i] + parse var record recordId . -- assume recordId is first column + if recordId = recordKey then do + found = .true; leave; + end + end + if \found then return .false -- Records exist, but specified record not found. + + -- found record is i'th. Now replace that array item with the new data: + currentRecord = fileArray[i] +---- This method is only opartially completed. !!!!!!!!!!!! + newrecord = "" + do j=1 to columns + --fileArray[i]field = + end + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/MessageSender.h b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/MessageSender.h new file mode 100644 index 0000000..8f5c4b5 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/MessageSender.h @@ -0,0 +1,14 @@ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define DLG_MESSAGESENDER 103 +#define IDC_MS_ERRORMSG 1000 +#define IDC_MS_CLEAR 1002 +#define IDC_MS_DATA 1010 +#define IDC_MS_REPLY 1011 +#define IDC_MS_SEND 1012 +#define IDC_MS_COMPONENT 1015 +#define IDC_MS_METHOD 1016 +#define IDC_MS_STORETARGET 1018 +#define IDC_MS_STOREMETHOD 1020 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/MessageSender.rc b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/MessageSender.rc new file mode 100644 index 0000000..8b3ad36 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/MessageSender.rc @@ -0,0 +1,35 @@ +// Generated by ResEdit 1.5.11 +// Copyright (C) 2006-2012 +// http://www.resedit.net + +#include +#include +#include +#include "MessageSender.h" + + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +DLG_MESSAGESENDER DIALOG 0, 0, 262, 156 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_SYSMENU +CAPTION "Message Sender" +FONT 8, "Ms Shell Dlg" +{ + LTEXT "Target:", IDC_STATIC, 8, 17, 24, 8, SS_LEFT + LTEXT "Method:", IDC_STATIC, 8, 38, 27, 8, SS_LEFT + LTEXT "Data:", IDC_STATIC, 9, 60, 18, 8, SS_LEFT + EDITTEXT IDC_MS_DATA, 40, 55, 210, 35, WS_VSCROLL | ES_MULTILINE + LTEXT "Reply:", IDC_STATIC, 10, 101, 21, 8, SS_LEFT + EDITTEXT IDC_MS_REPLY, 40, 101, 210, 35, WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE + DEFPUSHBUTTON "Send", IDC_MS_SEND, 211, 15, 40, 14 + PUSHBUTTON "Clear", IDC_MS_CLEAR, 211, 35, 40, 14, WS_DISABLED + LTEXT "", IDC_MS_ERRORMSG, 13, 142, 225, 10, SS_LEFT + COMBOBOX IDC_MS_COMPONENT, 40, 15, 125, 15, WS_TABSTOP | CBS_DROPDOWN | CBS_HASSTRINGS | CBS_SORT + COMBOBOX IDC_MS_METHOD, 40, 35, 115, 30, WS_TABSTOP | CBS_DROPDOWN | CBS_HASSTRINGS | CBS_SORT + AUTOCHECKBOX "Store", IDC_MS_STORETARGET, 172, 17, 33, 8 + AUTOCHECKBOX "Store", IDC_MS_STOREMETHOD, 163, 36, 33, 9 +} diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/MessageSender.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/MessageSender.rex new file mode 100755 index 0000000..a767fc0 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/MessageSender.rex @@ -0,0 +1,559 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 07: MessageSender.rex v01-00 14Feb13 + + Contains: classes: "MessageSender", "HRSms" + + Message Sender is a test/debug/utility support class that enables a user to + send a message to a component and see what's returned. + + Pre-requisites: the Object Manager (objectMgr.rex). In addition, Message + Sender should be launched from some other dialog, since it + uses popupAsChild. + + Description: A sample Message Sender utility for sending messages to + components. Note that the messages that can be sent are probably + limited, since a full test has not been done. + + Outstanding Problems: None reported. + + Changes: + v01-00 07Jun12: First Version + 07Aug12: Changed self~execute() to popupAsChild. Launched via a menu + item in the Order Management dialog (OrderMgr.rex) + 14Jan13: Commented-out use of ViewMgr (ViewMgr function incomplete) + 05Feb13: Changed edit controls to comboboxes for Target and Method. + Provided for user add of methods and target components + (not saved over a dialog close). + 11Feb13: No change to function - minor tidy-up of a few comments. + 14Feb13: Correct text in the Help dialog. + + Description: + Target: className instanceName + Method: a single method name + Data: Either strings separated by "|" (will be sent as an array), or: + [name]value [name] value ... (will be sent as a directory), or: + space-separated strings (each is interpreted as a separate + attribute, so a parameter such as 'aaa bbb' cannot be sent + at least not in this version). + +------------------------------------------------------------------------------*/ + +.Application~addToConstDir("..\Exercise07\Support\MessageSender.h") + +::REQUIRES "ooDialog.cls" + + +::CLASS 'MessageSender' SUBCLASS rcDialog PUBLIC + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + newInstance - class method to create a msg sender. */ + + ::METHOD newInstance CLASS PUBLIC + use arg rootDlg + --say ".MessageSender-newInstance." + dlg = .MessageSender~new("..\Exercise07\Support\MessageSender.rc", "DLG_MESSAGESENDER") --,,"MessageSender.h") + dlg~activate(rootDlg) + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + init + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose objectMgr + --say "MessageSender-init-01." + forward class (super) continue + .local~my.MsgSender = self + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Activate - Shows the Dialog - i.e. makes it visible to the user. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate unguarded + expose rootDlg + use arg rootDlg + --say "MessageSender-activate-01." + self~popupAsChild(rootDlg, "SHOWTOP") --, ,"IDI_CUSTLIST_DLGICON") + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + initDialog - initialises the MessageSender + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose cbTarget cbMethod ecData ecReply btnSend btnClear stErrorMsg objectMgr - + chkStoreTarget chkStoreMethod arrTargets arrMethods + --say "MessageSender-initDialog-01." + cbTarget = self~newComboBox("IDC_MS_COMPONENT") + cbMethod = self~newComboBox("IDC_MS_METHOD") + ecData = self~newEdit("IDC_MS_DATA") + ecReply = self~newEdit("IDC_MS_REPLY") + stErrorMsg = self~newStatic("IDC_MS_ERRORMSG") + btnSend = self~newPushButton("IDC_MS_SEND") + btnClear = self~newPushButton("IDC_MS_CLEAR") + chkStoreTarget = self~newCheckBox("IDC_MS_STORETARGET") + chkStoreMethod = self~newCheckBox("IDC_MS_STOREMETHOD") + self~connectButtonEvent("IDC_MS_SEND","CLICKED",sendMessage) + self~connectButtonEvent("IDC_MS_CLEAR","CLICKED",clearEntries) + self~connectHelp(onHelp) + + errorFont = self~createFontEx("Arial Italic") + stErrorMsg~setFont(errorFont) + stErrorMsg~settext(.HRSms~helpMsg) + + -- Get id of ObjectMgr: + objectMgr = .local~my.objectMgr + --say "MessageSender-initDialog-02 - objectMgr =" objectMgr + if objectMgr = .nil then do -- Check if ObjectMgr is present - .nil if not. + stErrorMsg~setText(.HRSms~prefix1||.HRSms~noObjectMgr) + btnSend~disable() + end + + arrTargets = .array~of("ObjectMgr The","PersonModel PA150") + arrMethods = .array~of("showModel","query","list") + do i over arrTargets + cbTarget~add(i) + end + do i over arrMethods + cbMethod~add(i) + end + + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Event Handler Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + sendMessage - Sends a message to the specified component. + Returns .false if error found. + Note 1: the return from the target object must be either a bool + or a directory. (Later versions may add array and string). + Note 2: The "parseData" method displays any error messages + resulting from errors in the data provided by the user. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD sendMessage + expose objectMgr ecReply stErrorMsg btnClear chkStoreTarget chkStoreMethod - + cbTarget cbMethod arrTargets arrMethods + --say; say "---------------------------------------------------------" + --say "MessageSender-sendMessage-01." + ecReply~setText("") -- Clear any reply data from previous requests. + --error = .false -- if true, indicates error in data provided. + message = self~parseData -- data is a directory, array, string; .false if error. + + if message = .false then do -- if errors found in the data. + --say "MessageSender-sendMessage-02: message =" message + btnClear~enable() -- allow user to clear entries. + chkStoreTarget~uncheck; chkStoreMethod~uncheck + return .false + end + if message = "special" then do -- message to ObjectMgr has been dealt with. + btnClear~enable + chkStoreTarget~uncheck; chkStoreMethod~uncheck + return .true + end + + -- Get the component ID (object ref) from the Object Manager: + componentRef = objectMgr~getComponentId(message["class"], message["instance"]) + if componentRef = .false then do + chkStoreTarget~uncheck; chkStoreMethod~uncheck + ecReply~setText(.HRSms~rc||" "||componentRef) + stErrorMsg~setText(.HRSms~prefix1||" "||.HRSms~noObject) + btnClear~enable + return .false + end + + -- Send the Message and Display the response: + --say "MessageSender-sendMessage-03: message[data] =" message["data"] + response = sendMsg(componentRef, message["method"],message["data"]) + select + when response = "SendMsg - Syntax Error" then do + chkStoreTarget~uncheck; chkStoreMethod~uncheck + stErrorMsg~setText(.HRSms~noResponse) + btnClear~enable + return + end + when response = "SendMsg - No Method" then do + chkStoreTarget~uncheck; chkStoreMethod~uncheck + stErrorMsg~setText(.HRSms~noTgtMethod) + btnClear~enable + return + end + when response = .false then do + chkStoreTarget~uncheck; chkStoreMethod~uncheck + ecReply~setText(.HRSms~rc||" "||response) + return + end + + when response~isa(.String) then do + ecReply~setText(response) + end + when response~isa(.Directory) then do + replyText = "" + do i over response + replyText = replyText||i||":" response[i]||"; " + end + ecReply~setText(replyText) + end + otherwise do + ecReply~setText(.HRSms~noDir1 response .HRSms~noDir2) + end + end + btnClear~enable + -- say "MessageSender-sendMessage-04: response =" response + + -- Message sent successfully - so now action the checkboxes: + self~storeEntry(cbTarget, chkStoreTarget) + self~storeEntry(cbMethod, chkStoreMethod) + + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + storeEntry - Store a new item in either Target or Method comboboxes if a + checkbox has been checked. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD storeEntry PRIVATE + use strict arg comboBox, checkBox + --say "MessageSender-storeEntry-01." + if checkBox~getCheckState = "CHECKED" then do + newItem = comboBox~getEditControl()~getLine(1) + ix = comboBox~find(newitem) -- case-insensitive find + if ix = 0 then do -- if item not found, then add it. + comboBox~add(newItem) + end + checkBox~uncheck() + end + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + clearEntries - Clear user entries and error messages. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD clearEntries + expose cbTarget cbMethod ecData ecReply stErrorMsg btnClear + cbTarget~setText("") + cbMethod~setText("") + ecData~setText("") + ecReply~setText("") + stErrorMsg~setText("") + btnClear~disable + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + onHelp - Display help. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD onHelp + cr = .endOfLine + msg = .HRSms~help2||cr||.HRSms~help3||cr - + ||.HRSms~help4||cr||.HRSms~help5||cr - + ||.HRSms~help6||cr||.HRSms~help7||cr - + ||.HRSms~help8 + title = .HRSms~help1 + buttons = "OK" + --ans = MessageDialog(msg, 0, title, "OK", "INFORMATION") + ans = MessageDialog(msg, self~dlgHandle, title, "OK", "INFORMATION") + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + parseData - Check the message info provided by the user. + + Required data formats are: + Target component: "class instance". Allowed are: multiple spaces between + "class" and "instance"; leading spaces before "class". (Later version may + provide for class messages). + Method: a method name - a single string, e.d. "doThat". Any leading or + trailing spaces are removed. + Message Parameters: A string, and array, or a directory, as follows: + String, e.g.: "AB123, Joe Bloggs Inc., 124.50" The first non-white-space + character must not be "[" or "|", as these characters are used to decide + whether the data format is string, array or directory. + Array, e.g.: "| AB123 | Joe Bloggs Inc. | 124.50 " + The separator between elements is "|". Leading and trailingspaces are + removed from each array item. Thus the result of the above example would + be: "AB123|Joe Bloggs Inc.|124.50". + Directory, e.g.: "[CustNo] AB123 [Name] Joe Bloggs Inc. [Debt] 124.50". + The indices are in square brackets. Leading and trailing spaces of both + indices and items are removed. + Returns: + If no errors found, this method returns the message data in the directory + "message". This has four indexes: "class", "instance", "method", "data". + If format errors are found, a message is displayed, and .false is returned. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD parseData + expose cbTarget cbMethod ecData stErrorMsg objectMgr rootDlg + stErrorMsg~setText("") -- remove any previous error message. + --say; say "MessageSender-parseData-01." + message = .Directory~new + + -- get target component name: + --target = cbTarget~getText(1) + target = cbTarget~getEditControl()~getLine(1) + --say "MessageSender-parseData-02 target =" target + parse var target class instance + targetError = .false + if class = "" | instance = "" then targetError = .true + else do + message["class"] = class~strip; + message["instance"] = instance~strip + end + + -- get Method/Message Name: + targetMethodError = .false + targetMethod = cbMethod~getEditControl()~getLine(1) + --say "MessageSender-parseData-03 targetMethod =" targetMethod + if targetMethod~words \= 1 then targetMethodError = .true + else message["method"] = targetMethod~strip + + -- Special Treatments: + if message["class"] = "ObjectMgr" & message["instance"] = "The" then do + -- Only List and ShowModel allowed (at present). + --say "MessageSender-parseData-04: msg to ObjectMgr." + method = message["method"] + method = method~upper + select + when method = "LIST" then do + objectMgr~list + return "special" + end + when method = "SHOWMODEL" then do -- assume data is a string + modelName = ecData~getLine(1) + parse var modelName modelClass " " modelInstance + modelClass = modelClass~strip; modelInstance = modelInstance~strip + --say "MessageSender-parseData-05: ViewMgr~parentOffsetDialog = self." + -- Setup self as "Parent" dialog for offsetting the view to be shown + --(do it here because other components may have done it previously): + .local~my.ViewMgr~parentOffsetDlg = self + -- Now show the model: + --say "MessageSender-parseData-06: objectMgr~showModel." + r = objectMgr~showModel(modelClass, modelInstance, rootDlg) + --say "MessageSender-parseData-07: return =" r + return "special" + end + otherwise do + --say "MessageSender-parseData-08:" method "is invalid." + targetMethodError = .true + --return .false + end + end + end +-- Following Code does not work - left here in case needed in any following exercises. +/* else do + --say "MessageSender-parseData-01d." + if message["class"] = "ViewMgr" & message["instance"] = "The" then do + method = message["method"] + method = method~upper + if method = "SHOWMODEL" then do + modelName = ecData~getLine(1) + parse var modelName modelClass " " modelInstance + modelClass = modelClass~strip; modelInstance = modelInstance~strip + .local~my.ViewMgr~parentOffsetDlg = self + -- Now show the model: + r = .local~my.ViewMgr~showModel(modelClass, modelInstance, rootDlg) + --say "MessageSender-parseData-01e: return =" r + return "special" + end + end + end +*/ + + -- Normal treatments: + + -- get Message Data, and put in an array, directory or string: + -- Note: ecData~lines returns 1 if control is empty(!). + msgData = "" + do i=1 to ecData~lines() + msgData = msgData||ecData~getLine(i) + --say "MessageSender-parseData-02: Data = '"||msgData||"'" + end + -- Everything now in a single text string. So now check the data type: + --say "chars = '"||msgData||"'" + msgData = strip(msgData) -- remove leading & trailing blanks. + if left(msgData,1) = "" then msgDataType = .false -- i.e. no data + else if left(msgData,1) = "[" then msgDataType = "dir" + else if left(msgData,1) = "|" then msgDataType = "arr" + else msgDataType = "str" + --say "msgDataType =" msgDataType; + + formatError = .false + Select + when msgDataType = .false then msgData = "" + + when msgDataType = "dir" then do + dirMsgData = .Directory~new + separators = msgData~countStr("["); closers = msgData~countStr("]") + if separators \= closers then formatError = .true + if \formatError then do + do i = 1 to separators + parse var msgData "[" index "]" msgData + parse var msgData item "[" + dirMsgData[index] = item~strip + end + message["data"] = dirMsgData + end + end + + when msgDataType = "arr" then do + arrMsgData = .Array~new + separators = msgData~countStr("|") + --say "No. Separators =" separators + msgData = msgData~substr(2) -- strip leading "|" + do i=1 to separators + parse var msgData item "|" msgData + item = item~strip + arrMsgData[i] = item + --say "item =" "'"||item||"'" + end + message["data"] = arrMsgData + end + + otherwise do -- msgDataType = "str" + message["data"] = msgData + end + end -- Select + + -- Check for errors: + errors = 0 + if targetError then errors += 1; if targetMethodError then errors += 1 + if formatError then errors += 1 + if errors = 1 then errortext = .HRSms~prefix1 + if errors > 1 then errortext = .HRSms~prefix2 + if errors > 0 then do + if targetError then errorText = errorText||.HRSms~badTarget + if targetMethodError then errorText = errorText||" "||.HRSms~badMethod + if formatError then errorText = errorText||" "||.HRSms~badData + stErrorMsg~setText(errorText) + return .false + end + + return message + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getObjectRef + expose objectMgr + use arg target + parse var target class "-" instance + ref = objectMgr~getComponentRef(class, instance) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + sendMsg - a 'Send Message' Routine. v00-01 08May12 + -------- + This routine sends the message to the specified component instance. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::ROUTINE sendMsg + use arg targetObject, targetMethod, data + --say "MessageSender-sendMsg-01: targetObject targetMethod data =" targetObject targetMethod data + SIGNAL ON SYNTAX NAME catchIt1 + SIGNAL ON NOMETHOD NAME catchIt2 + msg = .Message~new(targetObject, targetMethod, i, data) + response = msg~send + --say "MessageSender-sendMsg-02: response =" response + return response + catchIt1: say "MessageSender-sendMsg-03: CatchIt1 - Syntax." + SIGNAL OFF SYNTAX + return "SendMsg - Syntax Error" + catchIt2: say "MessageSender-sendMsg-04: CatchIt2 - NoMethod." + SIGNAL OFF NOMETHOD + return "SendMsg - No Method" +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRSms) v01-00 05May12 + -------- + This class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSms PRIVATE + ::CONSTANT prefix1 "*** Error: " + ::CONSTANT prefix2 "*** Errors: " + ::CONSTANT badTarget "Invalid class or Instance name." + ::CONSTANT badMethod "Invalid method." + ::CONSTANT badData "Invalid data format." + ::CONSTANT noObject "Target component not found." + ::CONSTANT noTgtMethod "No such method in target component." + ::CONSTANT noResponse "Note: No response received from target object." + ::CONSTANT rc "Return Code:" + ::CONSTANT noObjectMgr "The Object Manager was not found. Cannot work without it." + ::CONSTANT noDir1 "Reply is a" + ::CONSTANT noDir2 "- cannot display with this version." + ::CONSTANT help1 "Formats for data parameters:" + ::CONSTANT help2 "Target: Class Instance - e.g. 'CustomerModel CU0003'" + ::CONSTANT help3 "Method: method name - e.g. 'query'" + ::CONSTANT help4 "Data: Formats for message data are:" + ::CONSTANT help5 " Directory: '[aaa] [bbb] [c cc]'" + ::CONSTANT help6 " Array: '|aaa|bbb|c cc'" + ::CONSTANT help7 " String: 'aaa bbb'" + ::CONSTANT help8 "Note: a 'saved' target or method is not saved over a close." + ::CONSTANT helpMsg "Press F1 for help on allowable data formats." +/*============================================================================*/ + + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/Model.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/Model.rex new file mode 100755 index 0000000..65653f3 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/Model.rex @@ -0,0 +1,186 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + + Support - Model v01-00 27Feb13 + ---------------- + A superclass for the Model-View framework. + + v01-00 09Aug12: First version. + 11Jan13: Commented-out "say"s. + 31Jan13: Store model's data in 'myData'. + 27Feb13: Commented-out some "say" instructions. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +--::REQUIRES "ooDialog.cls" +--::REQUIRES "ObjectMgr.rex" + +/*============================================================================*/ + +::CLASS 'Model' PUBLIC + + ::ATTRIBUTE wantList CLASS PUBLIC -- for List subclasses + ::ATTRIBUTE myData + + /*---------------------------------------------------------------------------- + newInstance - must be invoked by subclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + expose noDataError -- .true if data not found. + use strict arg instanceName + --say ".Model-newInstance-01: instanceName =" instanceName + -- Check that the model's Data object is up and running. If not, then return .false: + if noDataError = .true then return .false + -- Now get the name of the Data component (FredModel or FredListModel --> FredData): + -- Get my root name (i.e. the root name of the subclass): + className = self~objectName -- objectName for a class Foo is "The Foo class" + className = className~upper() -- When class name is in quotes, then it's mixed case. + -- Upper here to make everthing upper case for parse var. + -- Handling Forms: + -- If this is a "Form" then there's no data to get (the user will provide + -- the data). So just create the Form Model (e.g. Order Form) and return. + -- Assume that the instance name is the Form Number (e.g. for an OrderForm, + -- the Form Number will be the new Order Number). + p = className~pos("FORM") + if p > 0 then do -- if this is a "Form" component. + instData = .Directory~new + instData[formNumber] = instanceName + formObject = self~new(instData) + formObject~myData = instData -- store instance data for subclasses to access. + --say ".Model-newInstance-011: formObj, instanceName =" formObject||"," instanceName + return formObject + end + -- End of Handling Forms. + + -- If there's "LIST" in the name, then set "get all" for the file access + -- (as opposed to the default of "get 1 record") + getAllRecords = .false + p = className~pos("LIST") + if p > 0 then getAllRecords = .true + -- if there's a "LIST" in the name, strip it out 'cos an xListModel gets data from xData + parse var className . root1 "MODEL" . + parse var root1 root "LIST" + dataClassName = root||"Data" + --say ".Model-newInstance-02, dataClassName =" dataClassName + -- Get the id of Data component: + objMgr = .local~my.ObjectMgr + --say ".Model-newInstance-03: objMgr =" objMgr + myDataId = objMgr~getComponentId(dataClassName, "The") + if myDataId = .false then do -- if instantiation failed + say ".Model-newInstance-04: getting ID of Data Class failed." + noDataError = .true + return .false + end + -- Got my data id, now get data for this model instance. + -- But distinguish between Entity Models and List Models - the former needs + -- a single record, the latter a group of records. + -- say ".Model-newInstance-05a: getAllRecords =" getAllRecords + if getAllRecords then instData = myDataId~getFile() -- returns a 2D array + else instData = myDataId~getRecord(instanceName) -- a directory + -- say ".Model-newInstance-05b: array dimensions: =" instData~dimension + if instData = .false then return .false -- if ID (key) not found + -- All is well, then make new instance: + --say ".Model-newInstance-06: instData =" instData + id = self~new(instData) + id~myData = instData + --say ".Model-newInstance-07: instData =" id + return id + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + getInstanceName - For an "anonymous" instance only (e.g. CustomerList) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getInstanceName CLASS PUBLIC + expose anonInstanceName + if anonInstanceName = "ANONINSTANCENAME" then anonInstanceName = 1 + else anonInstanceName = anonInstanceName + 1 + return anonInstanceName + + + /*---------------------------------------------------------------------------- + query - returns a Model's data. + Standard protocol: + Accept a .nil, directory, array, or string of names (case-sensitive). + if .nil then return all fields; else return values for the names in + the directory, array, or string. String is assumed to be data + names separated by one or more spaces. + All returns are a Directory containing names and values. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD query PUBLIC + use arg dataNames + --say "Model-query-01: dataNames:" dataNames + dirReturn = .Directory~new + select + when dataNames = .nil | dataNames = "" then return self~myData + + when dataNames = "DATANAMES" then return self~myData + + -- Caller is requesting specific data items: + when dataNames~isa(.Directory) then do + --say "Model-query-02; dataNames =" dataNames + do i over dataNames + dirReturn[i] = self~myData[i] + end + end + + when dataNames~isa(.Array) then do + do i over dataNames + dirReturn[i] = self~myData[i] + end + end + + when dataNames~isa(.String) then do + dataNames = dataNames~strip + n = dataNames~countStr(" ")+1 + do i = 1 to n + parse var dataNames name " " dataNames + if name = " " then iterate -- ignore extraneous leading spaces. + dirReturn[name] = self~myData[name] + end + end + + otherwise return .false + end + + return dirReturn + +/*============================================================================*/ + + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/NumberOnlyEditEx.cls b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/NumberOnlyEditEx.cls new file mode 100644 index 0000000..9613851 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/NumberOnlyEditEx.cls @@ -0,0 +1,526 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * The NumberOnlyEditEx class extends the .Edit class to provide an edit + * control which restricts entry to decimal only, or signed decimal only, + * numbers. + * + * The NumberOnlyEditEx.cls file is meant to be included in any ooDialog + * program where this extension to the edit control is desired. The programmer + * needs to take 4 steps to gain the functionality of a signed decimal number + * only edit control: + * + * 1.) Require the NumberOnlyEditEx.cls file (this file.) + * + * ::requires 'NumberOnlyEditEx.cls' + * + * 2.) Invoke the initDecimalOnly() method on each edit control object that is + * to be a decimal number only edit control. If initDecimalOnly() is not + * invoked, the behaviour of the edit control is unchanged. + * + * editObject = self~newEdit(IDC_EDIT) + * editObject~initDecimalOnly(decimalPlaces, allowSign) + * + * arguments: + * + * decimalPlaces [optional] The number of decimal places allowed in the + * number. The default is 2. Specifying 0 + * decimal places is acceptable. + * + * allowSign [optional] If a sign character (+ or -) is allowed as the + * leading character of the number. The default + * is .false. Specify .true to allow a sign + * character. + * + * 3.) For each decimal only edit control, the character event must be + * connected to a method in the Rexx dialog object. + * + * editObject = self~newEdit(IDC_EDIT) + * editObject~connectCharEvent(onChar) + * + * 4.) In the connected character event handler, the message and its arguments + * must be forwarded on to the onChar() method of the edit control. The + * 6th argument to the event handler is the dialog control object where the + * character event occurred. That is the object the event must be forwared + * to. + * + * When the programmer connects the character event to a method named + * onChar, the event handler is simple: + * + * ::method onChar unguarded + * forward to (arg(6)) + * + * If the programmer chooses a different method name for the event handler, + * then he must be sure to forward to the onChar() method of the edit + * control: + * + * ::method myOwnMethodName unguarded + * forward message 'onChar' to (arg(6)) + * + * And of course there is no reason why the event handler can not be coded + * using the explicit arguments: + * + * ::method myOwnMethodName unguarded + * use arg char, isShift, isCtrl, isAlt, misc, control + * forward message 'onChar' to (control) + */ + + -- Extend the .Edit control by inheriting the .NumberOnlyEditEx mixin class. + + .Edit~inherit(.NumberOnlyEditEx, .EditControl) + +::requires 'ooDialog.cls' +::requires 'winsystm.cls' + +::class 'NumberOnlyEditEx' public mixinclass object + +-- Users of the signed decimal number only edit control must invoke +-- initDecimalOnly() first to assign decimal places and specify if the sign +-- character is allowed. Until this is done, there is no change to the +-- behaviour of the Edit control object. +::method initDecimalOnly + expose decimalPlaces signOk initialized clipBoard + use strict arg decimalPlaces = 2, plusMinus = .false + + if plusMinus~isA(.String), plusMinus~datatype('O') then signOk = plusMinus + else signOk = .false + + initialized = .true + clipBoard = .WindowsClipboard~new + +-- The onChar() method should be inovked at every character event. Returning +-- true allows the character, returning false disallows the character. When a +-- character is not allowed, an edit ballon is set with a message explaining to +-- the user why the character is not appearing when they type. +::method onChar unguarded + expose decimalPlaces initialized signOk + use arg char, isShift, isCtrl, isAlt, misc, control + + if \ var('initialized') then return .true + + if misc~pos("extended") <> 0, self~isExtendedKey(char) then return .true + + if char == 8 then return .true + if signOk, (char == 43 | char == 45) then return self~checkSign + if char == 46 then return self~checkDecimal + if char >= 48, char <= 57 then return self~checkDigit + + if isCtrl, \isAlt, \isShift then return self~checkControlKey(char) + + reply .false + self~charBalloon + + +/** checkDigit() + * + * Checks that the digit being typed, at the cursor position, is allowed. + */ +::method checkDigit private unguarded + expose decimalPlaces signOk + + text = self~getText + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + if signOk, cursorPos == 1 then do + c = text~left(1) + + if c == '-' | c == '+' then do + reply .false + self~showBalloon(.MT~NUM_TITLE, .MT~HAS_SIGN, "ERROR") + return + end + return .true + end + + if decimalPos == 0 then return .true + + if cursorPos <= decimalPos then return .true + + if text~length < (decimalPos + decimalPlaces) then return .true + + reply .false + + msg = self~decimalPlacesUsedMsg + self~showBalloon(.MT~NUM_TITLE, msg, "ERROR") + + +/** checkSign() + * + * Checks that the sign character being typed is allowed at the current cursor + * position. Note that this method is only invoked when the sign character is + * allowed. + */ +::method checkSign private unguarded + expose decimalPlaces + + text = self~getText + cursorPos = self~getCaretPos + + if cursorPos == 1 then do + if self~hasSign(text) then do + reply .false + self~showBalloon(.MT~SIGN_TITLE, .MT~HAS_SIGN, "ERROR") + return + end + + return .true + end + + reply .false + + decimalPos = text~pos('.') + if decimalPos <> 0 | decimalPlaces == 0 then msg = .MT~ONLY_NUMBER + else msg = .MT~ONLY_DECIMAL_NUMBER + + self~showBalloon(.MT~SIGN_TITLE, msg, "ERROR") + + +/** checkDecimal() + * + * Checks that the decimal point being typed is allowed at the current cursor + * position. + */ +::method checkDecimal private unguarded + expose decimalPlaces signOk + + text = self~getText + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + if decimalPlaces == 0 then do + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + return + end + + if decimalPos <> 0 then do + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + return + end + + if cursorPos == 1, signOk, self~hasSign(text) then do + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + return + end + + if text~length < cursorPos + decimalPlaces then return .true + + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + + +/** checkControlKey() + * + * Invoked for a control key combination (Ctrl-?). Anything other than Ctrl-V + * is automatically allowed. Ctrl-V is of course the paste operation. For + * Ctrl-V, we check that the result after pasting the text would be a valid + * signed decimal number, under the constraints for this object. If not, it + * is disallowed and a ballon set. + */ +::method checkControlKey private unguarded + expose clipBoard decimalPlaces + use strict arg char + + if char \== 22 then return .true -- Not Ctrl-V + + -- If there is no text data available we don't care, pasting it will not do + -- any harm. + if \ clipBoard~isDataAvailable then return .true + + pastedText = clipBoard~paste + + -- We have text to paste, need to check is the text acceptable, + -- and is it acceptable for where it will be placed. + text = self~getText + len = text~length + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + -- isValidDecimal() checks that the resulting text after inserting the pasted + -- text is valid. + if \ self~isValidDecimal(pastedText, text, cursorPos) then do + reply .false + self~pasteBalloon(pastedText, text, cursorPos) + return + end + + return .true + + +/** decimalPointBalloon() + * + * This method produces the proper balloon message text when a decimal point has + * been typed, but is not allowed at the current position. + */ +::method decimalPointBalloon private unguarded + expose decimalPlaces signOk + use strict arg decimalPos, cursorPos, text + + select + when cursorPos == 1 then do + if self~hasSign(text) then msg = .MT~HAS_SIGN + else if decimalPlaces == 0, signOk then msg = .MT~ONLY_WHOLE_SIGNED_NUMBER + else if signOk then msg = .MT~ONLY_SIGNED_NUMBER + else msg = .MT~ONLY_NUMBER + end + when decimalPlaces == 0 then do + msg = .MT~ONLY_WHOLE_NUMBER + end + when cursorPos <= decimalPos then do + msg = .MT~ONLY_NUMBER + end + when (decimalPos + decimalPlaces) > text~length then do + msg = .MT~ONLY_NUMBER + end + otherwise do + msg = self~decimalPlacesUsedMsg + end + end + -- End select + + self~showBalloon(.MT~DEC_TITLE, msg, "ERROR") + + +/** charBalloon() + * + * This method produces the proper balloon message when a character is typed. + */ +::method charBalloon private unguarded + expose decimalPlaces signOk + + text = self~getText + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + msg = .MT~ONLY_NUMBER + + select + when cursorPos == 1 then do + if self~hasSign(text) then msg = .MT~HAS_SIGN + else if decimalPlaces == 0, signOk then msg = .MT~ONLY_WHOLE_SIGNED_NUMBER + else if decimalPlaces == 0, \signOk then msg = .MT~ONLY_WHOLE_NUMBER + else if decimalPos == 0, signOk then msg = .MT~ONLY_SIGNED_DECIMAL_NUMBER + else if decimalPos == 0, \signOk then msg = .MT~ONLY_DECIMAL_NUMBER + else if signOk then msg = .MT~ONLY_SIGNED_NUMBER + else msg = .MT~ONLY_NUMBER + end + when decimalPlaces == 0 then do + msg = .MT~ONLY_WHOLE_NUMBER + end + when decimalPos == 0 then do + msg = .MT~ONLY_DECIMAL_NUMBER + end + when cursorPos <= decimalPos then do + msg = .MT~ONLY_NUMBER + end + when (decimalPos + decimalPlaces) > text~length then do + msg = .MT~ONLY_NUMBER + end + otherwise do + msg = self~decimalPlacesUsedMsg + end + end + -- End select + + self~showBalloon(.MT~CHAR_TITLE, msg, "ERROR") + + +/** pasteBalloon() + * + * This method produces the proper balloon message when text is pasted into the + * edit control that is not allowed. + */ +::method pasteBalloon private unguarded + expose decimalPlaces signOk + use strict arg pastedText, text, cursorPos + + if signOk then do + if decimalPlaces == 0 then msg = .MT~ONLY_PASTE_WHOLE_SIGNED + else msg = .MT~ONLY_PASTE_A_SIGNED decimalPlaces .MT~ONLY_PASTE_B + end + else do + if decimalPlaces == 0 then msg = .MT~ONLY_PASTE_WHOLE + else msg = .MT~ONLY_PASTE_A decimalPlaces .MT~ONLY_PASTE_B + end + + resultText = text~substr(1, cursorPos - 1) || pastedText || text~substr(cursorPos) + + -- Balloon text has to be less than 1023 characters. If we don't exceed that + -- length, we will show the incorrect text to the user. Otherwise we just + -- show the short message. Note that new line characters can be used to + -- format the balloon text. + len = msg~length + resultText~length + .MT~PASTED_A~length + .MT~PASTED_B~length + 8 + + if len < 1023 then do + msg ||= .endOfLine~copies(2) || .MT~PASTED_A || - + .endOfLine~copies(2) || '"'resultText'"' || - + .endOfLine~copies(2) || .MT~PASTED_B + end + + self~showBalloon(.MT~PASTE_TITLE, msg, "ERROR") + + +/** decimalPlacesUsedMsg() + * + * Convenience method to return the proper message for the situation where the + * allowable number of decimal places have been filled. + */ +::method decimalPlacesUsedMsg private unguarded + expose decimalPlaces + + if decimalPlaces == 1 then return .MT~ONLY_1_DECIMAL + else return .MT~ONLY_DECIMALS_A decimalPlaces .MT~ONLY_DECIMALS_B + + +/** isValidDecimal() + * + * Checks that the resulting text after the pasted text is inserted into text at + * the current position, results in a valid number using the current + * restrictions. Decimal places and sign allowed or not. + */ +::method isValidDecimal private unguarded + expose decimalPlaces signOk + use strict arg pasteText, text, cursorPos + + resultText = text~substr(1, cursorPos - 1) || pasteText || text~substr(cursorPos) + + -- Can't have any type of space character, tab, new line, etc.. + if resultText \== resultText~space(0) then return .false + + -- Eliminate obvious problems with decimals. + countDots = resultText~countStr(".") + if countDots > 1 then return .false + if decimalPlaces == 0, countDots > 0 then return .false + + -- Eliminate any problems with the sign character. + if signOk then do + if resultText~pos('-') > 1 | resultText~pos('+') > 1 then return .false + end + else do + if resultText~pos('-') <> 0 | resultText~pos('+') <> 0 then return .false + end + + + decimalPos = resultText~pos('.') + if decimalPos > 0 then do + if resultText~length - decimalPos > decimalPlaces then return .false + + -- Remove the decimal char so we can test for all digits. + resultText = resultText~changeStr('.', '') + end + + -- Remove the sign character if it exists. + if self~hasSign(resultText) then resultText = resultText~substr(2) + + -- Exponential notation can not be allowed. + if resultText~caselessPos('E') <> 0 then return .false + + if \ resultText~datatype('W') then return .false + + return .true + + +/** isExtendedKey + * + * Convenience method to test if the character, char, is an extended key we want + * to pass on to the edit control + */ +::method isExtendedKey private + use strict arg char + + if char >= 33, char <= 40 then return .true + if char == 45 | char == 46 | char == 8 then return .true + return .false + + +/** hasSign + * + * Convenience method to test if a text string starts with a sign (+ or -) + * character. + */ +::method hasSign private + use strict arg text + + c = text~left(1) + if c == '-' | c == '+' then return .true + return .false + + +/** getCaretPos() + * + * Returns the current caret (cursor) position of this edit control. + */ +::method getCaretPos private + return self~selection~startChar + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Class: MT + + This class is used to provide constant character strings. The strings are + used for the balloon messages put up by the NumberOnlyEditEx mixin class. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'MT' private +::constant CHAR_TITLE "Unacceptable Character" +::constant DEC_TITLE "Unacceptable Decimal Point" +::constant NUM_TITLE "Unacceptable Number" +::constant SIGN_TITLE "Unacceptable Sign Character" +::constant PASTE_TITLE "Unacceptable Pasted Text" + +::constant ONLY_NUMBER "You can only type a number here." +::constant ONLY_SIGNED_NUMBER "You can only type a number or the sign here." +::constant ONLY_DECIMAL_NUMBER "You can only type a number or the decimal point here." +::constant ONLY_SIGNED_DECIMAL_NUMBER "You can only type a number, the sign, or the decimal point here." +::constant ONLY_WHOLE_NUMBER "You can only type a number here. Only whole numbers are allowed." +::constant ONLY_WHOLE_SIGNED_NUMBER "You can only type a number or the sign here. Only whole numbers are allowed." + +::constant HAS_SIGN "You can not type here. The sign character is already in place." +::constant ONLY_1_DECIMAL "You can not type here. Only 1 decimal place is allowed." +::constant ONLY_DECIMALS_A "You can not type here. Only" +::constant ONLY_DECIMALS_B "decimal places are allowed." + +::constant ONLY_PASTE_WHOLE "You can only paste text here that produces a whole number." +::constant ONLY_PASTE_WHOLE_SIGNED "You can only paste text here that produces a signed whole number." +::constant ONLY_PASTE_A_SIGNED "You can only paste text here that produces a signed decimal number with" +::constant ONLY_PASTE_A "You can only paste text here that produces a decimal number with" +::constant ONLY_PASTE_B "or less decimal places." +::constant PASTED_A "Resulting text of:" +::constant PASTED_B "is not valid." diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/ObjectMgr.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/ObjectMgr.rex new file mode 100755 index 0000000..91a3910 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/ObjectMgr.rex @@ -0,0 +1,302 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + + Support - ObjectMgr v01-00 21Jan13 + ------------------- + A singleton component that manages model objects. + + Should ensure that only one instance is created. This version doesn't. + + Provides an object reference given a class and an instance name. Stores these + in an "object bag", which is a table of classes, where each table item is a + table of instance names, the item being the object reference. + + Interface ObjectMgr { + bool init + cmptId getComponentId( in string className, in string instanceName ) + bool addCmptRef( in string className, in string instanceName, in objref cmptRef ) + void list( ) + bool showModel( in string modelClass, in string modelInstance ) + } + + Changes: + v01-00 23Apr12: First version. + 11Jan13: Commented-out 'say' instructions. + 21Jan13: Make 'addView' private and 'removeView' explicitly public. + Minor typos in comments corrected. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +call "RequiresList.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================*/ +::CLASS 'ObjectMgr' PUBLIC + + ::ATTRIBUTE objectBag PRIVATE-- a bag of objects - i.e. instances of Distributed + -- Components or DCs. + + /*---------------------------------------------------------------------------- + init - initialises the ObjectManager + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose objectBag viewBag + --say "ObjectMgr-init. Classes:" .CustomerModel .CustomerData .CustomerView + .local~my.ObjectMgr = self + objectBag = .directory~new -- holds "class-inst" "id-ViewName" + viewBag = .directory~new -- holds view class and latest view instance. + return .true + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + getComponentId - Returns a Component Id if it's in the ObjectBag, + else calls doNewInstance to get id, else returns .false. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getComponentId PUBLIC + expose objectBag + use strict arg className, instanceName + className = className~upper; instanceName = instanceName~upper + --say "ObjectMgr-getComponentId-00: className =" className "instanceName =" instanceName + ObjectName = className||"-"||instanceName + if objectBag~hasIndex(objectName) then do -- if class-instance already registered: + --say "ObjectMgr-getComponentId-01: Class Found:" objectName + arr = objectBag[objectName] -- Get info array for this class-instance. + componentId = arr[1] + return componentId -- return component id + end + -- If we've got to here, then there's no id stored. So go get one: + componentId = self~doNewInstance(className,instanceName) + --say "ObjectMgr-getComponentId-03: componentId =" componentId + if componentId = .false then return .false -- Bad object name + self~addComponentId(className,instanceName,componentId) + return componentId + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + + + /*---------------------------------------------------------------------------- + doNewInstance - Instantiates the requested object and returns the object id + (aka component id). If class not found, or class returns + .false to ~newInstance, then returns .false. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD doNewInstance PRIVATE + use strict arg className, instanceName + SIGNAL ON NOMETHOD NAME catchIt + interpret "componentId = ."||className||"~newInstance("||"'"||instanceName||"'"||")" + --say "ObjectMgr-doNewInstance-01: componentId =" componentId + -- add to object bag: + return componentId + catchIt: + say "ObjectMgr-doNewInstance-02: component" className instanceName "not found." + return .false + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + + + /*---------------------------------------------------------------------------- + addComponentId - Adds an Instance of a Class to the Object Bag. + If instance already exists, return .false + Format of ObjectBag (note - directory indices are case-sensitive, i.e. + if entry is created with index "AbC" then 'say dir["ABC")' may return nil. + + +---------------------------------+ + | Index | Item (an Array) | + +---------------------------------+ + | | | View | + | Class-Inst | objId | Class-Inst | + |---------------------------------| + | PersM-AB12 | x'12' | PersV-1 | + |- - - - - - |- - - -|- - - - - - | + | PersM-CD34 | x'5A' | .nil | + |- - - - - - |- - - -|- - - - - - | + | PersV-1 | x'7B' | .nil | + |- - - - - - |- - - -|- - - - - - | + | | | | + +---------------------------------+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method addComponentId PRIVATE + expose objectBag + use strict arg className, instanceName, componentId + --say "ObjectMgr-addComponentId-01:" classname instancename componentId + objectName = className||"-"||instanceName + arr = .Array~new + arr[1] = componentId + arr[2] = .nil -- Space for a View Name ('class-inst') + objectBag[objectName] = arr + --self~list + return + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + + + /*---------------------------------------------------------------------------- + showModel - Shows a view of a model. Lacking a config file that links + model class to one or more View classes, we heroically assume + that all models are called "xxxModel" and its View is called + xxxView. Assume only one View per Model. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showModel PUBLIC + expose objectBag + use arg modelClass, modelInstance, parentDlg + --say "ObjectMgr-showModel-01a - modelNames:" modelClass modelInstance + --say "ObjectMgr-showModel-01b - parentDlg: " parentDlg + --say "ObjectMgr-showModel-02 - modelClass: '"||modelClass||"'; modelInstance: '"||modelInstance||"'" + -- If this is an "anonymous" component (instance name "A"|"a"), ask its + -- class object for an instance name: + if modelInstance = "A" | modelInstance = "a" then do + anonModelClass = "."||modelClass + interpret "modelInstance = "||anonModelClass||"~getInstanceName" + --say "ObjectMgr-showModel-02 - modelInstance: " modelInstance + end + modelId = self~getComponentId(modelClass, modelInstance) + --say "ObjectMgr-showModel-03 - modelId:" modelId + if modelId = .false then do + say "ObjectMgr-showModel-03b: Model" modelClass modelInstance "could not be found." + return .false + end + + -- Check if View exists - if so, surface it: + modelName = modelClass||"-"||modelInstance + modelName = modelName~upper + arr = objectBag[modelName] + viewName = arr[2] + --say "ObjectMgr-showModel-03c: ViewName =" viewName + if viewName \= .nil then do -- if view exists + arr = objectBag[viewName] + viewId = arr[1] + viewId~show("SHOWTOP") -- if minimized, doesn't work. + viewId~show("NORMAL") -- if hidden, doesn't work + return .true + end + + -- View does not exist - so construct the view name and send the class a + -- newInstance(modelId, parentDlg). + parse var modelClass root "Model" + viewClass = root||"View" + viewClassId = "."||viewClass + --say "ObjectMgr-showModel-04: viewClassId =" viewClassId + interpret "targetObject =" viewClassId + --say "ObjectMgr-showModel-05: parentDlg =" parentDlg + msg = .Message~new(targetObject, "newInstance", "I", modelId, parentDlg) + --say "ObjectMgr-showModel-06: Class is:" .CustomerView .ObjectMgr + viewId = msg~send + --say "ObjectMgr-showModel-07 - viewId:" viewId + + self~addView(modelClass, modelInstance, viewClass, viewId) + --self~addView(modelClass, modelInstance, "CustomerView", viewId) + return .true + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + addView - Adds a View to the ObjectBag. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD addView PRIVATE + expose objectBag --viewBag + use strict arg modelClass, modelInstance, viewClass, viewId + --say "ObjectMgr-addView-01." + -- Get view's instanceName + viewInstance = viewId~identityHash + + -- First, add View name to arr[2] of Model's entry in ObjectBag: + modelName = modelClass||"-"||modelInstance + modelName = modelName~upper() + viewClass = viewClass~upper() + viewName = viewClass||"-"||viewInstance + arr = objectBag[modelName] + arr[2] = viewName + -- Now add the View to the ObjectBag: + self~addComponentId(viewClass, viewInstance, viewId) + --say "ObjectMgr-addView-02: list with new View class:" + --self~list + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + removeView - Removes a view from the ObjectBag. (Used by RcView & ResView.) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD removeView PUBLIC + expose objectBag + use arg viewClass, viewInstance + viewClass = viewClass~upper() -- View class was uppered in addView method. + viewClassInst = viewClass||"-"||viewInstance + --say "ObjectMgr-removeView-01: viewClassInst:" "'"||viewClass||"'" "'"||viewClassInst||"'" + r = objectBag~remove(viewClassInst) + --say "ObjectMgr-removeView-02: r =" r + do i over objectBag + arr = objectBag[i] + if arr[2] = viewClassInst then arr[2] = .nil + end + --say "ObjectMgr-removeView-03: ObjectBag List:" + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*----------------------------------------------------------------------- + list - Produces a list on stdout of the classes and their Instances + that are in the Object Bag. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + ::METHOD list PUBLIC + expose objectBag viewBag + say; say "Object Bag List:" + say " ----------------------------------------------------------------------------" + say " Class-Instance Model Id ViewClass-Inst" + say " ------------------------ ------------------------ ------------------------" + do name over objectBag + arrItems = objectBag[name] + viewClass = arrItems[2] + if viewClass = .nil then viewClass = ".nil" + modelId = arrItems[1] + --say "ObjectBag-list-01: ModelID =" modelId ";" modelId~objectName + say " " name~left(25) modelId~objectName~left(25) viewClass~left(25) + end + say " ----------------------------------------------------------------------------" + say + /*say; say "Latest View Instances:" + say " View Class Instance" + say " ------------------------- ---" + do viewClass over viewBag + viewNo = viewBag[viewClass] + say viewClass~left(25) viewNo~right(7) + end + say + */ + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/RcView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/RcView.rex new file mode 100755 index 0000000..0b9163b --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/RcView.rex @@ -0,0 +1,143 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide - Support + + Support - RcView v01-00 01Feb13 + ---------------- + A simple superclass class for the Model-View framework. + Code is idential to that in ResView. + + Changes: + v01-00 09Aug12: First version. + 11Jan13: Commented-out the 'say' instructions. + 01Feb13: Add comment; remove some commented-out 'say's. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + --say "RcView." +::REQUIRES "ooDialog.cls" +--::REQUIRES "ObjectMgr.rex" + +/*============================================================================*/ + +::CLASS 'RcView' SUBCLASS RcDialog PUBLIC + + --::ATTRIBUTE offsetParentDlg + ::ATTRIBUTE viewMgr + + + /*---------------------------------------------------------------------------- + init - initialises the dialog + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose objectMgr + --say "RcView-init-01." + forward class (super) continue + objectMgr = .local~my.ObjectMgr -- Needed to clear up when dialog closed. + self~viewMgr = .local~myViewMgr + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + activate - must be invoked by subclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose viewClass viewInstance -- needed for tidy-up on close. + use arg modelId + -- Get View Instance name and View Class for tidy-up when dialog is closed. + viewInstance = self~identityHash + dlgName = self~objectName + parse var dlgName . viewClass + modelData = modelId~query + return modelData + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + loadList - must be invoked by subclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --::METHOD loadList Wait till check out how do ShowModel for List. + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + leaving - invoked by ooDialog when a dialog closes. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD leaving UNGUARDED + expose objectMgr viewClass viewInstance + objectMgr~removeView(viewClass, viewInstance) + -- Note - we do not remove the Model. Should we? If so, not from here! + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Popup Offsets + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + setOffsetParent - set the parent dialog id for later offsetting of a child + dialog. + **** Note: This method not used in Exercise07. **** */ + ::METHOD setOffsetParent + use strict arg parentDlg + viewMgr = .local~my.ViewMgr + viewMgr~parentOffsetDlg = self + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + offset - offsets a "child" dialog from its "parent" dialog (i.e. the dialog + from which the child is "popped up"). + **** Note: This method not used in Exercise07. **** */ + ::METHOD offset + --say "RcView-offset-1." + offset = .local~my.ViewMgr~dlgOffset + parentDlg = .local~my.ViewMgr~parentOffsetDlg + popupPos = parentDlg~getRealPos + popupPos~incr(offset,offset) + self~moveTo(popupPos, "SHOWWINDOW") + self~ensureVisible() + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + initDialog - invokes offset. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + self~offset + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/ResView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/ResView.rex new file mode 100755 index 0000000..466ba01 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/ResView.rex @@ -0,0 +1,145 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide - Exercise07 + + Support - ResView v01-00 11Jan13 + ---------------- + A simple superclass class for the Model-View framework. + Code is idential to that in RcView. + + Versions: + v01-00 21Aug12: First version. + 11Jan13: Comment-out say instructions. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + --say "ResView." +::REQUIRES "ooDialog.cls" +--::REQUIRES "ObjectMgr.rex" + +/*============================================================================*/ + +::CLASS 'ResView' SUBCLASS ResDialog PUBLIC + + --::ATTRIBUTE offsetParentDlg + ::ATTRIBUTE viewMgr + + + /*---------------------------------------------------------------------------- + init - initialises the dialog + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose objectMgr + --say "ResView-init-01." + forward class (super) continue + objectMgr = .local~my.ObjectMgr -- Needed to clear up when dialog closed. + self~viewMgr = .local~myViewMgr + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + activate - must be invoked by subclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose viewClass viewInstance + use arg modelId + -- Get View Instance name and View Class for tidy-up when dialog is closed. + --say ".ResView~activate-01: class = " viewClass + viewInstance = self~identityHash + dlgName = self~objectName + --say ".ResView~activate-02: dlgName = " dlgName + parse var dlgName "a " viewClass + --say ".ResView~activate-03: class name = '"||viewClass||"'" + --say ".ResView-activate-04: viewInstance =" viewInstance + --say ".ResView-activate-05: modelId =" modelId + modelData = modelId~query + return modelData + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + loadList - must be invoked by subclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --::METHOD loadList Wait till check out how do ShowModel for List. + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + leaving - invoked by ooDialog when a dialog closes. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD leaving UNGUARDED + expose objectMgr viewClass viewInstance + --say "RcView-leaving-01. viewClass =" viewClass "viewInstance =" viewInstance + objectMgr~removeView(viewClass, viewInstance) + -- Note - we do not remove the Model. Should we? If so, not from here! + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Popup Offsets + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + setOffsetParent - set the paprent dialog id for later offsetting of a child + dialog. */ + ::METHOD setOffsetParent + use strict arg parentDlg + viewMgr = .local~my.ViewMgr + viewMgr~parentOffsetDlg = self + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + offset - offsets a "child" dialog from it "parent" dialog (i.e. the dialog + from which the child is "popped up"). */ + ::METHOD offset + offset = .local~my.ViewMgr~dlgOffset + parentDlg = .local~my.ViewMgr~parentOffsetDlg + popupPos = parentDlg~getRealPos + popupPos~incr(offset,offset) + self~moveTo(popupPos, "SHOWWINDOW") + self~ensureVisible() + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + initDialog - invokes offset. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + self~offset + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/UdView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/UdView.rex new file mode 100755 index 0000000..d24f4b9 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/UdView.rex @@ -0,0 +1,140 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide - Exercise07 + + Support - UdView v00-01 06Sep12 + ---------------- + A simple superclass class for the Model-View framework. + Code is idential to that in RcView. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::REQUIRES "ooDialog.cls" + + +/*============================================================================*/ + +::CLASS 'UdView' SUBCLASS UserDialog PUBLIC + + --::ATTRIBUTE offsetParentDlg + ::ATTRIBUTE viewMgr + + + /*---------------------------------------------------------------------------- + init - initialises the dialog + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose objectMgr + say "UdView-init-01." + forward class (super) continue + objectMgr = .local~my.ObjectMgr -- Needed to clear up when dialog closed. + self~viewMgr = .local~myViewMgr + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + activate - must be invoked by subclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose viewClass viewInstance + use arg modelId + -- Get View Instance name and View Class for tidy-up when dialog is closed. + say ".UdView~activate-01: class = " viewClass + viewInstance = self~identityHash + dlgName = self~objectName + say ".UdView~activate-02: dlgName = " dlgName + parse var dlgName "a " viewClass + say ".UdView~activate-03: class name = '"||viewClass||"'" + say ".UdView-activate-04: viewInstance =" viewInstance + say ".UdView-activate-05: modelId =" modelId + modelData = modelId~query + return modelData + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + loadList - must be invoked by subclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --::METHOD loadList Wait till check out how do ShowModel for List. + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + leaving - invoked by ooDialog when a dialog closes. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD leaving UNGUARDED + expose objectMgr viewClass viewInstance + say "UdView-leaving-01. viewClass =" viewClass "viewInstance =" viewInstance + objectMgr~removeView(viewClass, viewInstance) + -- Note - we do not remove the Model. Should we? If so, not from here! + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Popup Offsets + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + setOffsetParent - set the paprent dialog id for later offsetting of a child + dialog. */ + ::METHOD setOffsetParent + use strict arg parentDlg + viewMgr = .local~my.ViewMgr + viewMgr~parentOffsetDlg = self + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + offset - offsets a "child" dialog from it "parent" dialog (i.e. the dialog + from which the child is "popped up"). */ + ::METHOD offset + offset = .local~my.ViewMgr~dlgOffset + parentDlg = .local~my.ViewMgr~parentOffsetDlg + popupPos = parentDlg~getRealPos + popupPos~incr(offset,offset) + self~moveTo(popupPos, "SHOWWINDOW") + self~ensureVisible() + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + initDialog - invokes offset. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + self~offset + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/ViewMgr.rex b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/ViewMgr.rex new file mode 100755 index 0000000..ccec9db --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise07/Support/ViewMgr.rex @@ -0,0 +1,122 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ViewMgr v01-00 13Feb13 + ---------- + A singleton component that manages Views and view-related function + such as Popup Offsetting. + + Changes: + v01-00 23Apr12: First version + 11Jan13: Comment-out 'say' instructions. + 13Feb13: Remove code not used. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +--::REQUIRES "ObjectMgr.rex" + +::CLASS 'ViewMgr' PUBLIC + + :: ATTRIBUTE dlgOffset -- A single number of dialog units by which a + -- child dialog is offset (vertically and + -- horizontally) from a parent. + :: ATTRIBUTE parentOffsetDlg -- The dialog from which a "child" dialog is + -- "popped up". + + /*---------------------------------------------------------------------------- + init - initialises the ViewMgr + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + --expose dlgOffset + --say "ViewMgr-init." + .local~my.ViewMgr = self + self~dlgOffset = 200 + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + setPopupParent - Remembers the id of a parent dlg that is "popping up" + a child dialog. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD setPopupParent PUBLIC + use strict arg parentDlg -- the dialog id of the Parent View + self~parentDlg = parentDlg + say "ViewMgr-setPopupParent-01. Parent View =" parentDlg + + /*---------------------------------------------------------------------------- + offsetDlg - Calculates the desired position of a "child" dialog given + the dlg id of the "parent" dialog and offsets it from the + parent dialog by the "dlgOffset". + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +/* ::METHOD offsetDlg PUBLIC + use strict arg childDlg + say "ViewMgr-popupChild-01. Parent View, Child View:" parentDlg childDlg + parentPos = parentView~getRealPos + childPos = incr(dlgOffset, dlgOffset) + return +*/ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + + + /*---------------------------------------------------------------------------- + showModel - Surface a View. Uses the ObjectMgr to see if the view already + exists, and if so, to surface it; else the ObjectMgr causes the + required view to be created. + *** Note - Not supported by MessageSender in Exercise07. *** + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showModel PUBLIC + use strict arg modelClass, modelInstance + say "ViewMgr-showModel-01: class / instance:" modelClass "/" modelInstance + -- Get the ObjectMgr to do the work: + dlg = .local~my.ObjectMgr~showModel(modelClass, modelInstance) + if dlg = .false then do + say "ViewMgr-showModel-02: bad response from ObjectMgr." + return .false + end + else do + --say "ViewMgr-showModel-03: good response from ObjectMgr." + return .true + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerFile.txt b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerFile.txt new file mode 100644 index 0000000..651d7bc --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerFile.txt @@ -0,0 +1,6 @@ +CustNo | CustName | CustDisc | CustAddr | Zip +AB0784 | ABC Enterprises Inc. | B1 | 2145 Engle Blvd,Hardtown,FL | 37043 +AC0027 | Frith Motors Inc. | B1 | 124 Freeview St.,Mackfield,TX | 78254 +BA0314 | LMN & Partners | C2 | 116 High St.,Ensleigh,NV | 84394 +BA0526 | EJ Smith United Inc. | C1 | 3 Ventry Rd,Ventry,MS | 38216 +CU0003 | Red-On & Locus Inc. | A1 | 43 Main St,Plingford,AR | 48231 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerListView.h b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerListView.h new file mode 100644 index 0000000..62b5eb4 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerListView.h @@ -0,0 +1,48 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDI_CUSTLIST_DLGICON 103 +#define IDD_CUSTLIST_DIALOG 104 +#define IDR_CUSTLIST_MENU 105 +#define IDC_CUSTLIST_LIST 1001 +#define IDM_CUSTLIST_NEWCUST 40000 +#define IDC_CUSTLIST_SHOWCUST 40001 +#define IDM_CUSTLIST_ABOUT 40002 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerListView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerListView.rc new file mode 100644 index 0000000..073d8f2 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerListView.rc @@ -0,0 +1,73 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include +#include +#include +#include "CustomerListView.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_CUSTLIST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Customer...", IDM_CUSTLIST_NEWCUST + } + POPUP "Help" + { + MENUITEM "About...", IDM_CUSTLIST_ABOUT + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_CUSTLIST_DIALOG DIALOG 0, 0, 225, 273 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Customer List" +FONT 8, "Ms Shell Dlg" +{ + PUSHBUTTON "Cancel", IDCANCEL, 150, 235, 50, 14 + CONTROL "", IDC_CUSTLIST_LIST, WC_LISTVIEW, WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SORTASCENDING | LVS_NOSORTHEADER , 15, 10, 190, 215 + DEFPUSHBUTTON "Show Customer", IDC_CUSTLIST_SHOWCUST, 89, 235, 54, 14, WS_DISABLED +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_CUSTLIST_DLGICON ICON ".\\customer\\bmp\\CustList.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerListView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerListView.rex new file mode 100755 index 0000000..bbdf746 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerListView.rex @@ -0,0 +1,260 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: The Customer ListView v03-00 24May13 + + Contains: classes "CustomerListView" and "HRSclv". + + Pre-requisite: CustomerListView.rc, CustomerListView.h, CustList.ico + + Description: Provides a list of Customers and supports viewing any given + Customer via a double-click on that Customer's item in the list. + This is an "Intermediate" component - it is invoked by OrderMgmt, + and invokes CustomerView. + + v01-00 06Jun12: First Version. + v02-00 08Jan13: Removed stand-alone startup code (not needed after Ex06) + Commented out say's. + v03-00 24May13: Updated to use View and Component mixins. + + Outstanding Problems: None reported. +*******************************************************************************/ + + +.Application~addToConstDir("Customer\CustomerListView.h") + +::REQUIRES "ooDialog.cls" +::REQUIRES "customer\customerview.rex" +::REQUIRES "Support\View.rex" +::REQUIRES "Support\Component.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerListView v03-00 24May13 + ---------------- + The view of a list of Customers. + Changes: + v01-01: First version + v01-02: Corrected for standalone invocation. + v01-03 28Jan12: Changed name of HRS class to HRSplv. + v01-04 11Feb12: moved .application~setDefaults() to app startup file. + changed to .application~addToConstDir() here. + v01-05 19Feb12: Moved .Application~addToConstDir statement from newInstance + method to top of file - just before ::requires statement(s). + v01-06 29Mar12: Very minor mods - all just minor clean-ups. All comments removed + v02-00 17Aug12: Exercise07 - modified to use the MVF. + 08Jan13: Removed stand-alone startup (not now needed). + v03-00 24May13: Inherits directly from RcDialog plus the View & Component mixins + + + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +--::CLASS CustomerListView SUBCLASS RcView PUBLIC +::CLASS CustomerListView SUBCLASS RcDialog PUBLIC INHERIT View Component + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use arg idCustomerListModel, rootDlg + --say "CustomerListView-newInstance-01: instName, rootDlg =" idCustomerListModel rootDlg + dlg = self~new("Customer\CustomerListView.rc", "IDD_CUSTLIST_DIALOG") + --say "CustomerListView-newInstance-02: dlg =" dlg + dlg~activate(idCustomerListModel, rootDlg) -- Must be the last statement. + return dlg + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + forward class (super) continue + self~initView + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + menuBar = .ScriptMenuBar~new("Customer\CustomerListView.rc", "IDR_CUSTLIST_MENU", , , .true) + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose rootDlg modelData + use arg idCustomerListModel, rootDlg + --say "CustomerListView-activate-01." + forward class (super) continue -- required for MVF + modelData = RESULT -- super gets my data! + --say "CustomerListView-activate-02: rootDlg =" rootDlg + self~popupAsChild(rootDlg, "SHOWTOP", ,"IDI_CUSTLIST_DLGICON") + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar lvCustomers btnShowCustomer modelData + -- Called by ooDialog after SHOWTOP. + + menuBar~attachTo(self) + + lvCustomers = self~newListView("IDC_CUSTLIST_LIST"); + lvCustomers~addExtendedStyle("GRIDLINES FULLROWSELECT") + lvCustomers~insertColumnPX(0,"Number",60,"LEFT") + lvCustomers~insertColumnPX(1,"Name",220,"LEFT") + lvCustomers~insertColumnPX(2,"Zip",80,"LEFT") + self~connectListViewEvent("IDC_CUSTLIST_LIST","CLICK",itemSelected) -- Single click + self~connectButtonEvent("IDC_CUSTLIST_SHOWCUST","CLICKED",showCustomer) + self~connectListViewEvent("IDC_CUSTLIST_LIST","ACTIVATE",openItem) -- Double-click + --self~connectListViewEvent("IDC_CUSTLIST_LIST","BEGINDRAG",beginDM) -- Button 1 down + + self~loadList + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newCustomer UNGUARDED + self~noMenuFunction(.HRSclv~newCust) + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSclv~helpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSclv~noMenu, self~hwnd, title, 'WARNING') + + + /*---------------------------------------------------------------------------- + Event Handling Methods - List Items + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD itemSelected UNGUARDED + use arg id, itemIndex, columnIndex, keyState + /* This method is fired when the user clicks on a row in the ListView. + If the user clicks on an empty row, then itemIndex is set to -1, else + the itemIndex is set to the 0-based row number. + If the user double-clicks on a row, this method is fired in response + to the first click but not to the second. If the row is empty, the second + click of the double-click is ignored, else the double-click method is + fired. + */ + if itemIndex > -1 then self~enableControl("IDC_CUSTLIST_SHOWCUST") + else self~disableControl("IDC_CUSTLIST_SHOWCUST") + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD openItem UNGUARDED + -- User double-clicked on an item in the ListView. + -- Note: does not get fired if double-click was on an empty row. + self~showCustomer + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showCustomer UNGUARDED + expose lvCustomers rootDlg + item = lvCustomers~selected + if item = -1 then do -- if no item selected. + ret = MessageDialog(.HRSclv~nilSelected, self~hwnd, title, 'WARNING') + return + end + info=.Directory~new + if lvCustomers~getItemInfo(item, info) then do + --say "CustomerListView-showCustomer-02: info~text =" info~text + objectMgr = .local~my.ObjectMgr -- Ex07 + objectMgr~showModel("CustomerModel", info~text, rootDlg) -- Ex07 + self~disableControl("IDC_CUSTLIST_SHOWCUST") -- Ex07 + end + else do + say "CustomerListView-showCustomer-04: ~getItemInfo returned .false." + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD loadList + expose lvCustomers modelData -- Ex07 + --say "CustomerListView-LoadList-00: modelData =" modelData + -- modelData is a directory. + --say "CustomerListView-loadList-01: No Records =" modelData[count] + rows = modelData[count] -- Ex07 - number of rows + arrData = modelData[records] + --say "CustomerListView-loadList-02:Dims =" arrData~dimension(1) arrData~dimension(2) + do i = 1 to rows -- Ex07 - omit the header line. + --say "CustomerListView-loadList-02: arr[i,1 =" arrData[i,1] + lvCustomers~addRow( , ,arrData[i,1],arrData[i,2],arrData[i,5]) + end + lvCustomers~setColumnWidth(1) -- set width of 2nd column to longest text entry. + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + HRSclv (Human-Readable Strings for CustomerListView) v01-00 06Jun12 + --- + The HRSclv class provides constant character strings for user-visible messages + issued by the CustomerListView class. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSclv PRIVATE -- Human-Readable Strings + ::CONSTANT noMenu "This menu item is not yet implemented." + ::CONSTANT newCust "New Customer" + ::CONSTANT helpAbout "Help - About" + ::CONSTANT nilSelected "Please select an item first." + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerModelsData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerModelsData.rex new file mode 100755 index 0000000..d781345 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerModelsData.rex @@ -0,0 +1,242 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: Customer Models and Data Classes v02-00 24May13 + + Contains: classes "CustomerModel" "CustomerListModel" and "CustomerData". + + Pre-requisites: None. + + Outstanding Problems: + None. + + Changes: + v01-00 07Jun12: First version. + v02-00 11Jan13: Modified to use the Model-View Framework with data read from + file using the GenericFile class. CustomerListModel added. + Commented out 'say' instructions. + 31Jan13: Removed 'query' method (it's in the superclass) from both + Customer and CustomerList - also removed code storing data + in self~myData. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + 24May13: Updated comments only to say Ex08. + +------------------------------------------------------------------------------*/ + +::REQUIRES "Support\GenericFile.rex" +::REQUIRES "Support\Model.rex" + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerModel v01-01 09Aug12 + ------------ + The "model" part of the Customer component. + + Changes: + v01-00 07Jun12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerModel SUBCLASS Model PUBLIC + + ::ATTRIBUTE myData + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + expose noDataError + use strict arg instanceName + --say ".CustomerModel-newInstance-01; class name =" self~objectName + -- Get my data via my superclass: + forward class (super) continue + customerId = RESULT + return customerId + + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + use strict arg dirData + return self + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerListModel v02-00 13Jan08 + ---------------- + The model for a list of Customers. + Changes: + v00-01 15Aug12: First version + v02-00 13Jan08: Runs under MVF (Ex07). Commented out 'say's. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerListModel SUBCLASS Model PUBLIC + + ::ATTRIBUTE myData + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use arg instanceName + self~wantList = .true -- set super's attribute + forward class (super) continue + return RESULT + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + use arg dirData + --self~myData = arrdata + --say "CustomerListModel-init-01: myData =" self~myData + return self + +-- ::METHOD query PUBLIC + /*---------------------------------------------------------------------------- + query - returns an array of all Customer data. + In MVF this method is invoked by the RcView (or ResView) superclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --say "CustomerListModel-query-01." +-- return self~myData + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerData v01-01 09Aug12 + ------------ + The "data" part of the Customer component. + Changes: + v01-00 07Jun12: First version. + v02-00 09Aug12: Second version - subclasses GenericFile to read data from + a disk file. + 08Jan13: Commented out some 'say' instructions. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerData SUBCLASS GenericFile PUBLIC + + ::ATTRIBUTE created CLASS + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC -- Invoked by ObjectMgr + --use strict arg instanceName + if self~created = "CREATED" then do -- If this is first time + --say ".CustomerData-newInstance-01." + customerDataId = self~new() + self~created = .true + return customerDataId + end + else do + say ".CustomerData-newInstance-02 - Error - Singleton component, so can't have more than one instance." + return .false + end + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init PUBLIC + expose fileName numRecords + fileName = "Customer\CustomerFile.txt" + columns = 5 -- colums in the Customer "table" + numRecords = self~init:super(fileName, columns) + --say "CustomerData-init-01: numRecords:" numRecords + /* + if numRecords > 0 then do + say "CustomerData-init-02: Array is:" + say self~fileArray~tostring + end + */ + return self + + +/*============================================================================*/ + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerDT - A business data type for Customer data. v00-01 05May12 + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/ + +::CLASS CustomerDT PUBLIC + + -- dtName XML Name Description + -- --------- ---------- ------------------------------- + -- ProductDT product + ::ATTRIBUTE custNo -- custNo Customer Number + ::ATTRIBUTE custName -- custName Customer Name + ::ATTRIBUTE discount -- discount Discount code + ::ATTRIBUTE address -- address Customer's address + ::ATTRIBUTE zipCode -- zip ZipCode + + ::METHOD makeDir + dir = .Directory~new + dir["custNo"] = self~custNo + dir["custName"] = self~custName + dir["discount"] = self~discount + dir["address"] = self~address + dir["zipCode"] = self~zipCode + return dir + + ::METHOD list PUBLIC + expose custNo custName discount address zipCode + say "---------------" + say "CustomerDT-List:" + say "CustNo: " custNo " CustName:" custName + say "Address: " address + say "Zip: " zipCode " Discount:" discount + say "---------------" + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerView.h b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerView.h new file mode 100644 index 0000000..26d87d2 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerView.h @@ -0,0 +1,63 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_CUST_DIALOG 102 +#define IDR_CUST_MENU 103 +#define IDI_CUST_DLGICON 105 +#define IDC_CUST_LBL_CUSTNO 1001 +#define IDC_CUST_LBL_DISCOUNT 1002 +#define IDC_CUST_BTN_SHOWLASTORDER 1003 +#define IDM_CUST_NEW 40000 +#define IDM_CUST_UPDATE 40001 +#define IDM_CUST_PRINT 40002 +#define IDM_CUST_LAST_ORDER 40003 +#define IDC_CUST_EDT_CUSTNO 40043 +#define IDC_CUST_EDT_CUSTNAME 40044 +#define IDC_CUST_BTN_RECORDCHANGES 40069 +#define IDC_CUST_LBL_CUSTNAME 40070 +#define IDC_CUST_LBL_CUSTADDR 40071 +#define IDC_CUST_LBL_ZIP 40072 +#define IDC_CUST_LBL_LASTORDER 40073 +#define IDC_CUST_STC_LASTORDERDETAILS 40077 +#define IDC_CUST_EDT_CUSTADDR 40078 +#define IDC_CUST_EDT_DISCOUNT 40079 +#define IDC_CUST_EDT_CUSTZIP 40080 +#define IDC_CUST_STC_ERRORMSG 40081 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerView.rc new file mode 100644 index 0000000..cab2d63 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerView.rc @@ -0,0 +1,85 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "customerview.h" + + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_CUST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Customer...", IDM_CUST_NEW + MENUITEM "&Update...", IDM_CUST_UPDATE + MENUITEM "Print...", IDM_CUST_PRINT + MENUITEM "Last Order", IDM_CUST_LAST_ORDER + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_CUST_DIALOG DIALOG 0, 0, 275, 239 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "*CustomerName*" +FONT 8, "Microsoft Sans Serif" +{ + LTEXT "Name:", IDC_CUST_LBL_CUSTNAME, 18, 47, 22, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTNO, 85, 20, 65, 15, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Customer Number:", IDC_CUST_LBL_CUSTNO, 18, 22, 59, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTNAME, 85, 45, 165, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Address:", IDC_CUST_LBL_CUSTADDR, 18, 72, 28, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTADDR, 85, 70, 167, 40, ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY + LTEXT "Zip Code:", IDC_CUST_LBL_ZIP, 20, 120, 32, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_CUSTZIP, 85, 120, 65, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Last Order:", IDC_CUST_LBL_LASTORDER, 18, 177, 36, 8, SS_LEFT + LTEXT " ", IDC_CUST_STC_LASTORDERDETAILS, 88, 177, 145, 8, SS_LEFT + LTEXT "Discount Code:", IDC_CUST_LBL_DISCOUNT, 18, 149, 50, 8, SS_LEFT + EDITTEXT IDC_CUST_EDT_DISCOUNT, 85, 145, 20, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT " ", IDC_CUST_STC_ERRORMSG, 18, 215, 8, 8, SS_LEFT + DEFPUSHBUTTON "Record Changes", IDC_CUST_BTN_RECORDCHANGES, 130, 195, 58, 14, WS_DISABLED + PUSHBUTTON "Show Last Order", IDC_CUST_BTN_SHOWLASTORDER, 195, 195, 58, 14 +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_CUST_DLGICON ICON ".\\customer\\bmp\\Customer.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerView.rex new file mode 100755 index 0000000..5a9ffa8 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/CustomerView.rex @@ -0,0 +1,352 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: The CustomerView component v03-00 06Jun13 + + Contains: class "CustomerView"; routine "startCustomerView". + Pre-requisites: RcView.rex, CustomerView.rc, CustomerView.h. + + Description: A sample Customer View component - part of the sample + Order Management application. This is a "leaf" component - + it does not invoke other components. + + Changes: + v01-00 01Jun12: First version (Exercise04). + v01-01 07Jun12: Minor changes for Exercise06. + .... + v02-00 09Aug12: Changed to use MVF. + 09Jan13: Removed stand-alone startup (not now needed). + Changes to CustomerView (not at v03-00). + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + v03-00 24May13: Inherits directly from RcDialog plus the View & Component mixins + 06Jun13: Added set self as drag/drop source in initDialog method. + +------------------------------------------------------------------------------*/ + + +.Application~addToConstDir("Customer\CustomerView.h") + +::REQUIRES "ooDialog.cls" +--::REQUIRES "support\RcView.rex" +::REQUIRES "support\View.rex" +::REQUIRES "support\Component.rex" + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + CustomerView v03-00 24May13 + ------------- + The "view" (or "gui") part of the Customer component - part of the sample + Order Management application. + Changes: + v00-02: Prevented close on enter key by providing no-op "ok" method. + Changed tab order on window by changing sequence of controls in .rc file + v00-03: Changed symbolic IDs to conform with naming convention + Added initAutoDetection method because deleted dlgData. from + dlg~new statement in starter.rex. + v00-04: Took out the OK method - include that in Exercise05. + v00-05: Modified to use CustomerData and CustomerModel classes. + Mods after Exercise04: + v02-00: Added "newInstance" class method - removed routine "StartCustomerView". + v02-01 19Sep11: Corrected for stand-alone invocation. + v02-02 04Oct11: Added msgbox for unimplemented menu item. + v02-03 28Jan12: Changed class name HRS to HRSclv to allow for multiple + HRS classes in same file at some future time. + v02-04 11Feb12: moved .application~setDefaults() to app startup file. + changed to .application~addToConstDir() here. + v02-05 19Feb12: Moved .Application~addToConstDir statement from newInstance + method to top of file - just before ::requires statement(s). + v03-00 09Aug12: Changed to use MVF. Stand-alone startup removed. + 09Jan13: Removed stand-alone startup (not now needed). + Commented out most 'say' instructions. + Removed 'getData' method - redundant with MVF. + Modified handling of Cust Address due to change in data + format of Cust Address (now provided as string via MVF + from Customer File). + Deleted a number of "say" instructions. + 24May13: Changed inheritance to use the View & Component mixins. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS CustomerView SUBCLASS RcDialog PUBLIC INHERIT View Component -- v03-00 + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC UNGUARDED + use arg idCustomerModel, rootDlg -- Ex07 + -- Create an instance of CustomerView and show it: + dlg = .CustomerView~new("Customer\CustomerView.rc", "IDD_CUST_DIALOG") + dlg~activate(idCustomerModel, rootDlg) -- Ex07 + --say ".CustomerView-newInstance-01: dlg =" dlg + return dlg -- Ex07 + + + /*---------------------------------------------------------------------------- + Dialog Creation Methods: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Init - creates the dialog instance but does not make it visible. --*/ + ::METHOD init + expose menuBar + --say "CustomerView-init-01." + + forward class (super) continue + self~initView -- initialize the mixin. + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Create Menu Bar - Creates the menu bar on the dialog. --*/ + ::METHOD createMenuBar + expose menuBar + menuBar = .ScriptMenuBar~new("Customer\CustomerView.rc", "IDR_CUST_MENU", , , .true) + return .true + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Activate - Shows the Dialog - i.e. makes it visible to the user. --*/ + ::METHOD activate unguarded + expose custData + use arg idCustomerModel, rootDlg -- ADDED FOR EXERCISE06. Params reversed for Ex07. + forward class (super) continue -- Ex07: Required for MV framework. + custData = RESULT -- Ex07: instance data returned by super + -- Ex07: ('forward' returns any result via 'RESULT'.) + --say "CustomerView-activate-01." + self~popUpAsChild(rootDlg,"SHOWTOP",,"IDI_CUST_DLGICON") -- Ex07: deleted "standalone" startup. + --say "CustomerView-activate-01." + return + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + InitDialog - Called by ooDialog -- */ + ::METHOD initDialog + expose menuBar custControls + --say "CustomerView-initDialog-01." + menuBar~attachTo(self) + -- Create objects that map to the edit controls defined by the "customer.rc" + -- so they can be programmatically used elsewhere in the class: + custControls = .Directory~new + custControls[ecCustNo] = self~newEdit("IDC_CUST_EDT_CUSTNO") + custControls[ecCustName] = self~newEdit("IDC_CUST_EDT_CUSTNAME") + custControls[ecCustAddr] = self~newEdit("IDC_CUST_EDT_CUSTADDR") + custControls[ecCustZip] = self~newEdit("IDC_CUST_EDT_CUSTZIP") + custControls[ecCustDiscount] = self~newEdit("IDC_CUST_EDT_DISCOUNT") + custControls[stLastOrder] = self~newStatic("IDC_CUST_STC_LASTORDERDETAILS") + -- Create an object for the "Record Change" pushbutton in order to be able + -- to change its focus later: + custControls[btnRecordChanges] = self~newPushButton("IDC_CUST_BTN_RECORDCHANGES") + -- Define event handler methods for push-buttons: + self~connectButtonEvent("IDC_CUST_BTN_RECORDCHANGES","CLICKED",recordChanges) + self~connectButtonEvent("IDC_CUST_BTN_SHOWLASTORDER","CLICKED",showLastOrder) + + self~setTitle(.HRScv~dlgTitle) -- set dialog title. + + -- set self as drag/drop source. + r = self~dmSetAsSource:super("Customer\bmp\Customer.cur") + + -- Show app data: + self~showData + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + MenuBar Methods: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + New Customer... Not fully implemented - merely tells user to use the + Customer List object. --*/ + ::METHOD newCustomer unguarded + answer = MessageDialog(.HRScv~useList, self~hwnd,.HRScv~useListCap,"INFORMATION") + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Update - Sets fields to edit mode so that user can change the data. + Business Rule: Customer Number cannot be changed. --*/ + ::METHOD update unguarded + expose custControls + custControls[ecCustName]~setReadOnly(.false) + custControls[ecCustAddr]~setReadOnly(.false) + custControls[ecCustZip]~setReadOnly(.false) + custControls[ecCustDiscount]~setReadOnly(.false) + self~enableControl("IDC_CUST_BTN_RECORDCHANGES") + custControls[btnRecordChanges]~state = "FOCUS" -- Put focus on the button + self~focusControl("IDC_CUST_EDT_CUSTNAME") -- place cursor in the CustName edit control. + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Last Order - Displays info about the last order placed by this customer.--*/ + ::METHOD lastOrder unguarded + expose custControls + use arg button + orderDate="31/12/11"; orderNum = "ZZ999"; orderTotal = "$999.99" + lastOrder = orderDate " " orderNum " " orderTotal + custControls[stLastOrder]~setText(lastOrder) + + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Print - Not implemented yet --*/ + ::METHOD print unguarded + msg = "The 'Print...' menu item is not yet implemented." + ret = MessageDialog(.HRScv~noPrint, self~hwnd, .HRScv~noPrintCap, 'WARNING') + + + /*---------------------------------------------------------------------------- + PushButton Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Record Changes - Collects new data, checks if there has indeed been a + change, and if not, issues a warning msg and disables + the button. --*/ + ::METHOD recordChanges unguarded + expose custControls custData newCustData + + newCustData = .directory~new + newCustData[custName] = custControls[ecCustName]~getLine(1) + newCustData[custAddr] = .array~new + do i=1 to custControls[ecCustAddr]~lines + newCustData[custAddr][i] = custControls[ecCustAddr]~getLine(i) + end + newCustData[custZip] = custControls[ecCustZip]~getLine(1) + newCustData[custDiscount] = custControls[ecCustDiscount]~getLine(1) + + -- Check if anything's changed: + result = self~checkForChanges + --if result then say "CustomerView-recordChanges-01: There were changes!" + --else say "CustomerView-recordChanges-02: No Changes Found" + + /* Send new data to be checked by CustomerModel (not implemented). */ + + /* Disable controls that were enabled by menu "File-Update" selection: */ + custControls[ecCustName]~setReadOnly(.true) + custControls[ecCustAddr]~setReadOnly(.true) + custControls[ecCustZip]~setReadOnly(.true) + custControls[ecCustDiscount]~setReadOnly(.true) + self~disableControl("IDC_CUST_BTN_RECORDCHANGES") + + + /*---------------------------------------------------------------------------- + Show Last Order - displays mock sales order info in the Last_Order_Details + field; info is hard-coded in this method. --*/ + ::METHOD showLastOrder unguarded + expose CustControls + -- Notionally get last order from "SalesOrder" component. + orderDate="12/2/11"; orderNum = "AB123"; orderTotal = "$524.58" + lastOrder = orderDate " " orderNum " " orderTotal + custControls[stLastOrder]~setText(lastOrder) + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + showData - displays data in the dialog's controls. */ + ::METHOD showData + expose custData custControls + -- Show CustNo and CustName: + custControls[ecCustNo]~setText(custData["CustNo"]) + custControls[ecCustName]~setText(custData["CustName"]) + -- Re-format Cust Address from a comma-separated string into a -- Ex07 + -- line-end-separated string. + strCustAddr = custData["CustAddr"]~changeStr(",",.endOfLine) + custControls[ecCustAddr]~setText(strCustAddr) + -- Finally, show Zip and Discount: + custControls[ecCustZip]~setText(custData["Zip"]) + custControls[ecCustDiscount]~setText(custData["CustDisc"]) + + + /*-------------------------------------------------------------------------- + checkForChanges - after "Record Changes" actioned by the user, check whether + any data has actually changed. If it has: (a) assign new data to old data; + (b) return .true. If it hasn't: return .false. + Note: cannot just compare the two directories since data format in Address + is different. --*/ + ::METHOD checkForChanges + expose custData newCustData + changed = .false + if newCustData[custName] \= custData[custName] then do + custData[custName] = newCustData[custName] + changed = .true + end + if custData[custAddr] \= newCustData[custAddr] then changed = .true + if newCustData[custZip] \= custData[custZip] then do + custdata[custZip] = newCustData[custZip] + changed = .true + end + if newCustData[custDiscount] \= custData[custDiscount] then do + custData[custDiscount] = newCustData[custDiscount] + changed = .true + end + -- If no changes after all, display message box: + if \changed then do + msg = .HRScv~nilChanged + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRScv~nilChangedCap,"OK","WARNING","DEFBUTTON2 APPLMODAL") + end + else do + custData = newCustData + end + return changed + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRScv) v02-04 13Jan12 + -------- + This class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRScv PRIVATE -- Human-Readable Strings + ::CONSTANT nilChanged "Nothing was changed! Update not done." + ::CONSTANT nilChangedCap "Update Customer" + ::CONSTANT noPrint "The 'Print...' menu item is not yet implemented." + ::CONSTANT noPrintCap "*Customer Name*" + ::CONSTANT dlgTitle "*Customer*" + ::CONSTANT useList "Please use the Customer List to create a new Customer (not yet implemented)." + ::CONSTANT useListCap "Create New Customer" +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/bmp/CustList.BMP b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/bmp/CustList.BMP new file mode 100644 index 0000000000000000000000000000000000000000..962bee3d71bbf3cfc2d2c720d9aaf2a0cab826b5 GIT binary patch literal 2166 zcmeH`&25A*5QPURhe)|#r2|eWAO)a^YuZ`mxb;v47108DZ{8T3UBJ;^a>;1@gFnBS zXS{rTUY^b4g8mJykJi`|W(e@t7qu3TY>Z`DY|#uOX8dshUElY1b#}#w8Gl@O|FUVC zEd6!B$`(6jHi+2{?}iRBs86ZYmT}Z*sltEY!S3`mURK9ETU_hccwwGf@ASXmadygw zJ$;22cvoNH!b#`sQqmp8`T6>t9C86%7TrT038ZH($&WdOl<}f{qyrmA_FAv-6tZ=s zj`bx+Vx?WjTTZNMS>gZLP-!^kHk((nG|zL^XuCgExIrZuXJMeBQeT2rN1SKlZKA>C zyB^_<^j-k^_0-vkCk_KUJU&qw4DLBXpY!RpDE}>2ZJg5eq-ce{#`%J_{L*KuxDPC# z`7-ODa26#-~|{Wk=os literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/bmp/CustList.ico b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/bmp/CustList.ico new file mode 100644 index 0000000000000000000000000000000000000000..c9d256654be2bff669c25ee04cbaa94be30d3c56 GIT binary patch literal 2686 zcmeH`F?NG65JWfc#Z9Wvq4**p4(enIE_QJWoJ%s#$s<~3{PNK;w)>sEvKxDh7f-PEB?x|ecR ziN4opCE-8tWH8-(zBN2`x2{))D<5L7UQK>IMvpv?c@^fLp;&0ug;2T}u{zU)) literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/bmp/Customer.cur b/modules/windows/oodialog/userGuide/exercises/Exercise08/Customer/bmp/Customer.cur new file mode 100644 index 0000000000000000000000000000000000000000..87e06365aa54ce6b2492a19d247f3e8c48f2f471 GIT binary patch literal 2686 zcmeHIOHRZv40RC;#DaDt#Fj0$V2(4#=+WjVoM4nWL3p+k$8jRMVF&5t=jZqAIIV{0 zffhQSH~OSkx;zuT5zz6S>&>mB^81#3}FASKq{5-Yf%wn=#bz6$Q? zDnI}ruw}+Ox@0DpvFohC z>zs;mlrA{4d5O6){9IwHrU$VuY_{U94q#B7MCeU}fJ$0rQcO_|hWoEZQV~IoA!8JX zxPG4P6hlIN0^^Azu2LvsDa{;56-&%IS6(rvTG^_jcB38PMF!VZg~TF!RF92%k*3)2 zm)jTcbh~kG$G8iiuTVv=l_Yo$rmk6QT TRt_*HH>a@b4*kFRa~1doi~n zhP9TD$5Nh4DX+K)*A?dJiYT z_k>AbRGN~g1ze+`SG3RtM%<{jX1;jN3<5UZlcLhR&d~4PK!ZE4Zp0G!TMFfpm(MjEL|+&mdh zFiSw7YO#TixC^*E@+LEp{y0aROeA-mx&}u9NMqJ*|Xj4NOpC=x16QlmJt#Le|R@Lv$YhkL6`$qjv zJHi_q4{_$>^dx8}+!d9f-oxb$I9)E%+cAz@H;j$#z^{(_PtFQMS&)8Ek_9B6$1mVg zG}u(X22dLc0qHNe)^H3A1Bjaj8vG@WzjFUfIH^FwV|o8eQeIoWh3mkPo!i$ZnBg=Y j+lhpXR2}fp;RNS|1so-?Uz;{i*VtFl(DeWI51zm$4RLx4 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonFile.txt b/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonFile.txt new file mode 100644 index 0000000..ca0078f --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonFile.txt @@ -0,0 +1,6 @@ +number | familyName | firstName | dob | jobDescr | baseSalary +PA100 | Bloggs | Joseph | 721224 | Director | 250400 +PA150 | James | Alfred | 751513 | Packer | 38000 +PB100 | Smithson | John | 951704 | Programmer | 40170 +PB104 | Patterson | Patricia | 790331 | Office Manager | 76430 +PC200 | Cardaj | Jacob | 740615 | Plant Manager | 148250 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonModelData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonModelData.rex new file mode 100755 index 0000000..4944d2c --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonModelData.rex @@ -0,0 +1,195 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + + Samples: Person Model and Data Classes v02-00 26May13 + + Contains: classes "PersonModel" and "PersonData". + + Pre-requisites: Model-View Framework. + + Outstanding Problems: + None. + + Changes: + v01-00 01Oct12: First version. + 09Jan13: Removed or commented-out 'say' instructions. + 05Feb13: Removed 'query' method since it's available in the superclass. + 14Feb13: Removed (commented-out) 'return self' from the init method. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. Also, 'Samples' folder + changed name to 'Extras'. + 26May13: Extras folder moved to within Exercises. Mod to file path made. + + +------------------------------------------------------------------------------*/ + + +::REQUIRES "Support\GenericFile.rex" +::REQUIRES "Support\Model.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + PersonModel v01-00 09Jan13 + ------------ + + The "model" part of the Person component - a simple "Model" class that + illustrates use of the Model-View framework. + See comments that include the string 'MFV'. + + Changes: + v01-00 01Oct12: First version. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS 'PersonModel' SUBCLASS Model PUBLIC + + ::METHOD newInstance CLASS PUBLIC + use strict arg instanceName -- Instance name of required instance is + -- provided by MVF as result of sending + -- a 'showModel' message to the Object Manager. + forward class (super) continue -- As part of MVF, super does the ~new + -- and provide's the model's instance + -- data as a param on the init. + modelId = RESULT -- MVF requires the model instance + return modelId -- ('modelId') to be returned. + + + + /*---------------------------------------------------------------------------- + init + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose dirPerson + use strict arg dirPerson -- Super gets data from PersonData and passes + -- that data when it creates this instance with + -- '~new'. + -- The data is in a directory: + + self~myData = dirPerson -- Store the data in my superclass. + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + test - a method to demonstrate Message Sender method store. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD test + return 25 + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + PersonData- The data resource for Persons. v01-00 23Sep12 + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/ + +::CLASS 'PersonData' SUBCLASS GenericFile PUBLIC + + ::ATTRIBUTE created CLASS + + ::METHOD newInstance CLASS PUBLIC -- Invoked by ObjectMgr + --use strict arg instanceName + if self~created = "CREATED" then do -- If this is first time + --say ".PersonData-newInstance-01." + personDataId = self~new() -- the object id of the PersonData component. + self~created = .true + return personDataId + end + else do + say ".PersonData-newInstance-02 - Error - Singleton component, so can't have more than one instance." + return .false + end + + + ::METHOD init PRIVATE + fileName = "Extras\Person\PersonFile.txt" + columns = 6 -- colums in the Persons "table" + records = self~init:super(fileName, columns) + --say "PersonData-init-01: records:" records + + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + PersonDT - A business data type for Person data. v00-01 05May12 + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/ + +::CLASS PersonDT PUBLIC + + -- dtName XML Name Description + -- --------- ---------- ------------------------------- + -- ProductDT product + ::ATTRIBUTE number -- number Person Number + ::ATTRIBUTE familyName -- familyName Person Family Name + ::ATTRIBUTE firstName -- firstName Person First Name + ::ATTRIBUTE dob -- dob Date of Birth (format: yymmdd) + ::ATTRIBUTE jobDescr -- jobDescrip Job Description + ::ATTRIBUTE baseSalary -- baseSalary Basic Salary + + ::METHOD makeDir + dir = .Directory~new + dir["number"] = self~number + dir["familyName"] = self~familyName + dir["firstName"] = self~firstName + dir["dob"] = self~dob + dir["jobDescr"] = self~jobDescr + dir["baseSalary"] = self~baseSalary + + return dir + + ::METHOD list PUBLIC + expose number name price uom description size + say "---------------" + say "PersonDT-List:" + say "Number: " number " Family Name:" familyName + say "DOB:" dob " First Name:" firstName + say "Base Salary:" baseSalary + say "Job:" jobDescr + say "---------------" + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonView.h b/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonView.h new file mode 100644 index 0000000..bd1631f --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonView.h @@ -0,0 +1,48 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_DIALOG1 100 +#define IDC_PERS_NO 1000 +#define IDC_PERS_DOB 1001 +#define IDC_PERS_FIRSTNAME 1009 +#define IDC_PERS_FAMILYNAME 1010 +#define IDC_PERS_POSITION 1013 +#define IDC_PERS_SALARY 1014 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonView.rc new file mode 100644 index 0000000..d2d5e4b --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonView.rc @@ -0,0 +1,73 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2012-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +// Generated by ResEdit 1.5.11 +// Copyright (C) 2006-2012 +// http://www.resedit.net + +#include +#include +#include +#include "PersonView.h" + + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_DIALOG1 DIALOG 0, 0, 179, 166 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | WS_VISIBLE | DS_SHELLFONT | WS_CAPTION | WS_GROUP | WS_POPUP | WS_SYSMENU +CAPTION "Person Record" +FONT 8, "Ms Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 66, 142, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 121, 142, 50, 14 + LTEXT "Personnel No:", IDC_STATIC, 75, 19, 46, 8, SS_LEFT + EDITTEXT IDC_PERS_NO, 125, 15, 40, 14, ES_AUTOHSCROLL | ES_READONLY + LTEXT "Family Name:", IDC_STATIC, 11, 36, 43, 8, SS_LEFT + EDITTEXT IDC_PERS_FAMILYNAME, 10, 45, 85, 14, ES_AUTOHSCROLL + EDITTEXT IDC_PERS_FIRSTNAME, 106, 45, 60, 14, ES_AUTOHSCROLL + LTEXT "First Name:", IDC_STATIC, 107, 37, 36, 8, SS_LEFT + LTEXT "DOB:", IDC_STATIC, 12, 71, 18, 8, SS_LEFT + EDITTEXT IDC_PERS_DOB, 45, 70, 50, 15, ES_AUTOHSCROLL + LTEXT "Position:", IDC_STATIC, 12, 95, 28, 8, SS_LEFT + LTEXT "Salary:", IDC_STATIC, 12, 119, 22, 8, SS_LEFT + EDITTEXT IDC_PERS_POSITION, 45, 93, 120, 14, ES_AUTOHSCROLL + EDITTEXT IDC_PERS_SALARY, 45, 117, 40, 14, ES_AUTOHSCROLL +} diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonView.rex new file mode 100755 index 0000000..14009f6 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/Person/PersonView.rex @@ -0,0 +1,146 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Samples: Person View Class v02-00 26May13 + + Contains: classes "PersonView". + + Pre-requisites: Model-View Framework. + + Outstanding Problems: + None. + + Changes: + v01-00 01Oct12: First version. + 01Apr13: After ooDialog 4.2.2, Samples folder renamed to 'Extras' + and Support moved to within execise foldes. + so changes to ::Requires and ~addToConstDir needed. + v02-00 26May13: For exercise 8, Person updated to use mixins. + + +------------------------------------------------------------------------------*/ + + +.Application~addToConstDir("Extras\Person\PersonView.h") + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + PersonView v01-00 01Oct12 + ---------- + A simple class that shows how to exploit the Model-View framework. + See comments that include the string 'MFV'. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +::REQUIRES "ooDialog.cls" +::REQUIRES "Support\View.rex" +::REQUIRES "Support\Component.rex" + + +::CLASS 'PersonView' SUBCLASS 'RcDialog' PUBLIC INHERIT View Component + + /*---------------------------------------------------------------------------- + newInstance - creates an instance of the View: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS + use strict arg modelId, rootDlg -- MVF provides id of this view's Model; + -- not used in this sample. + dlg = .PersonView~new("Extras\Person\PersonView.rc", "IDD_DIALOG1") + dlg~activate(modelId, rootDlg) + return dlg -- required by MVF. + + + /*---------------------------------------------------------------------------- + init - initialises the dialog + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + forward class (super) continue + self~initView -- init the View mixin. + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + activate - Model's data is provided by the superclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose personData + use strict arg modelId, rootDlg + forward class (super) continue -- Required by MVF to get this View's + -- data from its Model component. + personData = RESULT -- personData returned by superclass + self~popupAsChild(rootDlg, "SHOWTOP") + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + initDialog - invoked automatically after the dialog has been created. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose personData ecPersNo ecPersFamilyName ecPersFirstName ecPersDOB ecPersPosition ecPersSalary + --say "PersonView-initDialog-01." + ecPersNo = self~newEdit("IDC_PERS_NO") + ecPersFamilyName = self~NewEdit("IDC_PERS_FAMILYNAME") + ecPersFirstName = self~newEdit("IDC_PERS_FIRSTNAME") + ecPersDob = self~newEdit("IDC_PERS_DOB") + ecPersPosition = self~newEdit("IDC_PERS_POSITION") + ecPersSalary = self~newEdit("IDC_PERS_SALARY") + self~setMyData(personData) -- Note: cannor use 'setData' as this + -- would conflict with ooDialog's + -- setData method. + --self~offset:super -- offsetting logic is in the superclass. + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + setData - sets (or "populates") controls with data provided in the + method's argument. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD setMyData + expose ecPersNo ecPersFamilyName ecPersFirstName ecPersDOB ecPersPosition ecPersSalary + use arg personData + ecPersNo~setText( personData["number"]) + ecPersFamilyName~setText(personData["familyName"]) + ecPersFirstName~setText( personData["firstName"]) + ecPersDOB~setText( personData["dob"]) + ecPersPosition~setText( personData["jobDescr"]) + ecPersSalary~setText( personData["baseSalary"]) + return + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/ReadMe.txt b/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/ReadMe.txt new file mode 100644 index 0000000..f95760c --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Extras/ReadMe.txt @@ -0,0 +1,49 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + ReadMe + + 1. ooDialog - Additional Examples to Accompany the ooDialog User Guide + ----------------------------------------------------------------------- + + This subdirectory tree contains the example programs referred to in the + appendix of the ooDialog User Guide. The programs are intended to give + context to the discussions in the User Guide, and may, or may not, be of + use to ooRexx programmers by themselves. + + The structure of the subdirectory tree and the programs themselves are + explained in the ooDialog User Guide. diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderFormView.h b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderFormView.h new file mode 100644 index 0000000..8fe196a --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderFormView.h @@ -0,0 +1,33 @@ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDR_ORDFORM_MENU 102 +#define IDI_ORDFORM_DLGICON 107 +#define IDD_ORDFORM_DIALOG 113 +#define IDD_ORDFORM_CUST_DIALOG 114 +#define IDD_ORDFORM_ORDLINES_DIALOG 115 +#define IDC_CUSTDTLS_NUM 1000 +#define IDC_ORDFORM_TOTCOST 1000 +#define IDC_CANCEL 1001 +#define IDC_CUSTDTLS_DISC 1001 +#define IDC_ORDFORM_TOTDISC 1002 +#define IDC_ORDFORM_TOTDISCCOST 1003 +#define IDC_ORDFORM_TOTTAX 1004 +#define IDC_ORDFORM_ORDTOT 1005 +#define IDM_ORDFORM_PLACE 40000 +#define IDM_ORDFORM_ABOUT 40001 +#define IDC_ORDFORM_DATE 40002 +#define IDM_ORDFORM_SAVE 40003 +#define IDM_ORDFORM_CANCEL 40004 +#define IDC_ORDFORM_ORDNO 40005 +#define IDC_ORDFORM_TABS 40009 +#define IDC_ORDFORM_PLACEORDER 40010 +#define IDC_ORDLINES_LIST 40026 +#define IDC_ORDLINES_PRODNO 40027 +#define IDC_ORDLINES_QTY 40028 +#define IDC_ORDLINES_ADD 40029 +#define IDC_ORDLINES_DELETE 40030 +#define IDC_CUSTDTLS_FIND 40031 +#define IDC_CUSTDTLS_ADDR 40037 +#define IDC_CUSTDTLS_NAME 40038 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderFormView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderFormView.rc new file mode 100644 index 0000000..b6c0977 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderFormView.rc @@ -0,0 +1,99 @@ +// Generated by ResEdit 1.5.11 +// Copyright (C) 2006-2012 +// http://www.resedit.net + +#include +#include +#include +#include "OrderFormView.h" + + + + +// +// Menu resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_ORDFORM_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "Place Order...", IDM_ORDFORM_PLACE + MENUITEM "Save Order...", IDM_ORDFORM_SAVE + MENUITEM "Cancel Order", IDM_ORDFORM_CANCEL + } + POPUP "Help" + { + MENUITEM "About", IDM_ORDFORM_ABOUT + } +} + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDFORM_CUST_DIALOG DIALOG 6, 15, 206, 127 +STYLE DS_3DLOOK | DS_CONTROL | DS_SHELLFONT | WS_CHILDWINDOW +FONT 8, "Ms Shell Dlg" +{ + LTEXT "Customer Name:", IDC_STATIC, 16, 37, 53, 8, SS_LEFT + EDITTEXT IDC_CUSTDTLS_NAME, 79, 32, 100, 14, WS_DISABLED | ES_AUTOHSCROLL + EDITTEXT IDC_CUSTDTLS_NUM, 79, 11, 53, 14, ES_AUTOHSCROLL + LTEXT "Customer Number:", IDC_STATIC, 16, 16, 59, 8, SS_LEFT + PUSHBUTTON "Find Customer", IDC_CUSTDTLS_FIND, 145, 11, 50, 14, WS_DISABLED + EDITTEXT IDC_CUSTDTLS_ADDR, 80, 55, 100, 35, WS_DISABLED | ES_AUTOHSCROLL | ES_MULTILINE + LTEXT "Customer Address:", IDC_STATIC, 16, 57, 60, 8, SS_LEFT + LTEXT "Customer Discount:", IDC_STATIC, 16, 99, 62, 8, SS_LEFT + EDITTEXT IDC_CUSTDTLS_DISC, 80, 96, 40, 14, WS_DISABLED | ES_AUTOHSCROLL +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDFORM_DIALOG DIALOG 0, 0, 272, 278 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_SYSMENU +CAPTION "Order Form" +FONT 8, "Ms Shell Dlg" +{ + CONTROL "", IDC_ORDFORM_DATE, DATETIMEPICK_CLASS, WS_TABSTOP | DTS_APPCANPARSE | DTS_RIGHTALIGN, 185, 9, 70, 15 + EDITTEXT IDC_ORDFORM_ORDNO, 50, 9, 40, 14, ES_AUTOHSCROLL + LTEXT "Order No.", IDC_STATIC, 10, 12, 32, 8, SS_LEFT + LTEXT "Date", IDC_STATIC, 158, 12, 16, 8, SS_LEFT + LTEXT "Total Cost:", IDC_STATIC, 116, 194, 35, 8, SS_LEFT + LTEXT "Discount", IDC_STATIC, 116, 208, 29, 8, SS_LEFT + PUSHBUTTON "Place Order", IDC_ORDFORM_PLACEORDER, 200, 244, 50, 14 + LTEXT "Tax", IDC_STATIC, 116, 222, 13, 8, SS_LEFT + RTEXT "0.00", IDC_ORDFORM_TOTDISC, 164, 208, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_ORDFORM_TOTTAX, 164, 222, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_ORDFORM_ORDTOT, 215, 222, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_ORDFORM_TOTCOST, 215, 194, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_ORDFORM_TOTDISCCOST, 215, 208, 40, 8, SS_RIGHT + CONTROL "", IDC_ORDFORM_TABS, WC_TABCONTROL, 0, 15, 35, 245, 150 + PUSHBUTTON "Cancel Order", IDC_CANCEL, 132, 244, 46, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDFORM_ORDLINES_DIALOG DIALOG 6, 15, 240, 132 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_POPUP | WS_SYSMENU +FONT 8, "Ms Shell Dlg" +{ + CONTROL "", IDC_ORDLINES_LIST, WC_LISTVIEW, WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT, 5, 5, 230, 90 + EDITTEXT IDC_ORDLINES_PRODNO, 7, 103, 40, 14, ES_AUTOHSCROLL + LTEXT "Product No.", IDC_STATIC, 9, 119, 39, 8, SS_LEFT + EDITTEXT IDC_ORDLINES_QTY, 62, 103, 38, 14, ES_AUTOHSCROLL + LTEXT "Quantity", IDC_STATIC, 65, 119, 27, 8, SS_LEFT + DEFPUSHBUTTON "Add OrderLine", IDC_ORDLINES_ADD, 122, 105, 50, 14 + PUSHBUTTON "Delete OrderLine", IDC_ORDLINES_DELETE, 177, 105, 58, 14 +} + + + +// +// Icon resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_ORDFORM_DLGICON ICON ".\\Order\\bmp\\OrderForm.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderFormView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderFormView.rex new file mode 100755 index 0000000..03fd27e --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderFormView.rex @@ -0,0 +1,953 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: The OrderFormView class v03-01 06Jun13 + OrderFormView.rex + + Contains: class "OrderFormView", class "HRSofv". + Pre-requisite files: OrderFormView.rc, OrderFormView.h. + + Changes: + v01-00 07Jun12: First version. + v02-00 08Jan13: OrderFormView Modified to use the Model-View Framework (MVF). + Removed stand-alone startup (not now needed). + 25Feb13: Added control dialogs in tab sheet. + 27Feb13: Made Order Date functional. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + v03-00 27Apr13: Add ability to populate Order with Customer Details and + Order Lines. + 25May13: Now inherits directly from RcDialog plus the View & + Component mixins. + v03-01 06Jun13: Added drag/drop code (method 'dmDrop') to make + OrderFormView a target. Also added code to the Customer + Details control dialog so that Customer can be provided by + drag/drop or by entering Cutomer Number. + +------------------------------------------------------------------------------*/ + + +.Application~addToConstDir("Order\OrderFormView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "support\View.rex" -- v03 + +/*============================================================================== + OrderFormView v02-01 06Jun13 + ------------- + The "view" (or "gui") Data Entry part of the Sales Order component. + + Changes: + v01-00 07Jun12: First Version + v02-00 05Oct12: Modified to use the Model-View Framework (MVF) including + removal of stand-alone startup. + 27Feb13: Changed to show tabs (control dialogs). + Corrected the Order Date control and limited order date to + one year ahead. + Commented-out say's. + 20May13: Now inherits directly from RcDialog plus the View & Component mixins + v02-01 06Jun13: Added drag/drop code to make OrderFormView a target. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +--::CLASS OrderFormView SUBCLASS RcView PUBLIC +::CLASS OrderFormView SUBCLASS RcDialog PUBLIC INHERIT View Component -- v03 + + ::ATTRIBUTE tabContent + ::ATTRIBUTE orderTotals + + ::METHOD newInstance CLASS PUBLIC + use strict arg idModel, rootDlg + --say; say ".OrderFormView-newInstance: rootDlg =" rootDlg + dlg = self~new("Order\OrderFormView.rc", "IDD_ORDFORM_DIALOG") + dlg~activate(idModel, rootDlg) + return dlg + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + -- creates the dialog instance but does not make it visible. + expose menuBar + --say "OrderFormView-init-01" + + forward class (super) continue + self~initView + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + --say "OrderFormView-createMenuBar-01" + menuBar = .ScriptMenuBar~new("Order\OrderFormView.rc", IDR_ORDFORM_MENU, , , .true) + + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate unguarded + expose rootDlg idModelInstance orderData cd1 cd2 orderTotal custDiscount - + taxRate eventMgr + use strict arg idModelInstance, rootDlg + forward class (super) continue + orderData = RESULT + + -- set up tabs for Customer Details and Order Lines: + cd1 = .CustomerDetailsDlg~new("Order\OrderFormView.rc", IDD_ORDFORM_CUST_DIALOG) + cd2 = .OrderLinesDlg~new("Order\OrderFormView.rc", IDD_ORDFORM_ORDLINES_DIALOG) + tabContent = .array~of(cd1, cd2) + --say "OrderFormView-activate-01: tabContent =" tabContent[1]||"," tabContent[2] + cd1~ownerDialog = self + cd2~ownerDialog = self + self~prep(tabContent) + + -- Send OrderFormView dlg id to the two Control Dialogs so that they can + -- communicate with OrderFormView. + cd1~setOrderFormDlg(self) + cd2~setOrderFormDlg(self) + cd2~rootDialog(rootDlg) -- Tell cd2 what the root dialog is. + + -- Set up Order Totals and initialise CustDiscount: + orderTotal = 0 + --orderTotals = .OrderTotals~new + custDiscount = 0 -- Default customer discount + taxRate = 0.05 -- 5% tax on discounted order total + + -- Tell EventMgr that we want to know when app closes: + --eventMgr = .local~my.EventMgr + --r = eventMgr~registerInterest("appClosing",self) + self~registerInterest("appClosing",self) + --say "OrderFormView-activate-03: eventMgr response =" r + + self~popUpAsChild(rootDlg,"SHOWTOP",,"IDI_ORDFORM_DLGICON") + --say "OrderFormView-activate-04." + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + -- Called by ooDialog after SHOWTOP. + expose menuBar ecOrderNo orderData tabContent tabControl orderDate - + stCost stDisc stDiscCost stTax stTot orderTotals controlDialogsClosed + --say "OrderFormView-initDialog-01" + + menuBar~attachTo(self) + + -- Tab stuff starts: + cd1 = tabContent[1] + cd2 = tabContent[2] + cd1~execute + cd2~execute + + -- Add the tabs to the tab control. + tabControl = self~newTab(IDC_ORDFORM_TABS) + tabControl~addSequence("Customer Details", "Order Lines") + -- tab stuff ends + + ecOrderNo = self~newEdit("IDC_ORDFORM_ORDNO") + --say "OrderFormView-initDialog-02: ecOrderNo =" ecOrderNo + btnCancelOrder = self~newPushButton("IDC_CANCEL") + btnPlaceOrder = self~newPushButton("IDC_ORDFORM_PLACEORDER") + self~connectButtonEvent("IDC_CANCEL","CLICKED",cancel) + self~connectButtonEvent("IDC_ORDFORM_PLACEORDER","CLICKED",placeOrderBtn) + + -- Get proxy for Order date and set its format. By default, it shows today. + --Also, set allowable date range selected to between today and 1 year's time. + orderDate = self~newDateTimePicker(IDC_ORDFORM_DATE); + orderDate~setFormat("MMM dd',' yyyy") + today = .DateTime~today + maxOrderDate = today~addYears(1) + orderDate~setRange(.array~of(today,maxOrderDate)) + -- Get proxies for Order Total Amounts: + stCost = self~newStatic("IDC_ORDFORM_TOTCOST") + stDisc = self~newStatic("IDC_ORDFORM_TOTDISC") + stDiscCost = self~newStatic("IDC_ORDFORM_TOTDISCCOST") + stTax = self~newStatic("IDC_ORDFORM_TOTTAX") + stTot = self~newStatic("IDC_ORDFORM_ORDTOT") + + ecOrderNo~setText(orderData[formNumber]) + + -- Tab stuff starts: + -- Determine the position and size of the display area of the tab control. + self~calculateDisplayArea + -- Position and show the control dialog used for the first page of the tab. + self~positionAndShow(1) + -- tab stuff ends + controlDialogsClosed = .false +/* + Following did not work - it gave Cust Details on both tabs!! + cd2 = tabContent[2] + say "***** cd2 =" cd2 + cd2~ownerDialog = self -- trial 21:45 + cd2~execute +*/ + -- Set as target for Drag/Drop: + self~dmSetAsTarget:super() + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + -- This method not used - message goes to the class. Left in just for the + -- time being. Delete when all drag/drop OK. + --::METHOD dmQueryDrop + --use strict arg sourceDlg, mousePos -- try also without mousepos. + --say "OrderFormView-dmQueryDrop-01." + --return .true + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD dmDrop PUBLIC + expose cd1 cd2 + use strict arg sourceModel, sourceDlg + --say "OrderFormView-dmDrop-01; sourceModel, sourceDlg =" sourceModel||"," sourceDlg + --say "OrderFormView-dmDrop-02: cd1, cd2 =" cd1||"," cd2 + parse var sourceModel . modelName + select + when modelName = "CUSTOMERMODEL" then do + cd1~getCustomer(sourceModel); return .true + end + when modelName = "PRODUCTMODEL" then do + --say "OrderFormView-dmDrop-03: Product dropped."; + cd2~getProduct(sourceModel); return .true + end + end + return .false + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showTotals PUBLIC + expose custDiscount taxRate stCost stDisc stDiscCost stTax stTot orderTotal + use arg orderLineAmount + --if custDiscount = "CUSTDISCOUNT" then custDiscount = 0 -- If user enters products first. + --say "OrderFormView-showTotals-01: custDiscount, orderLineAmount =" custDiscount orderLineAmount + + orderTotal = orderTotal + orderLineAmount + discount = (orderTotal * custDiscount)~format(,0) + --say "OrderFormView-showTotals-01: discount =" discount + discountedTotal = orderTotal - discount + tax = (discountedTotal * taxRate)~format(,0) + finalTotal = discountedTotal + tax + --say "OrderFormView-showTotals-02: discount / tax =" discount||" / "||tax + + -- Format numbers from nnnnn to nnn.nn for display: + x = myFormat(orderTotal); --say "OrderFormView-showTotals-03:" x + stCost~setText(myFormat(orderTotal)) + --stCost~setText( (orderTotal/100)~format(,2)) + stDisc~setText(myFormat(discount)) + --if discount = 0 then do; stDisc~setText("0.00"); end + --else do; stDisc~setText((discount/100)~format(,2)); end + stDiscCost~setText(myFormat(discountedTotal)) + --stDiscCost~setText( (discountedTotal/100)~format(,2)) + stTax~setText(myFormat(tax)) + --stTax~setText( (tax/100)~format(,2)) + stTot~setText(myFormat(finalTotal)) + --stTot~setText( (finalTotal/100)~format(,2)) + + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD setCustDiscount + expose custDiscount + use arg custDiscount + --say "OrderFormView-setDustDiscount-01: discount =" custDiscount + -- Use only first character - A, B or C: + code = custDiscount~left(1) + select + when code = "A" then custDiscount = 0.15 -- 15% discount + when code = "B" then custDiscount = 0.1 -- 10% discount + when code = "C" then custDiscount = 0.05 -- 5% discount + otherwise custDiscount = 0 + end + --say "OrderFormView-setDustDiscount-01: discount =" custDiscount + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --::METHOD updateTotals + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Button Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD placeOrderBtn UNGUARDED + ret = MessageDialog(.HRSofv~NoBtn, self~hwnd, "Place Order Button", 'WARNING') + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD placeOrder UNGUARDED + self~noMenuFunction(.HRSofv~PlaceOrder) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD saveOrder UNGUARDED + self~noMenuFunction(.HRSofv~SaveOrder) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD CancelOrder UNGUARDED + self~cancel + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSofv~HelpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSofv~NoMenu, self~hwnd, title, 'WARNING') + + /*---------------------------------------------------------------------------- + Methods to tidy up when Order Form is closed. + ---------------------------------------------------------------------------*/ + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Cancel: This method over-rides the default Windows action of 'cancel window' + for an Escape key. 'endExecution' (via the closeControlDialogs method + is required else dialog hangs when user tried to close. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD cancel + expose tabContent controlDialogsClosed + --say "OrderFormView-cancel-01." + if controlDialogsClosed = .true then do + --say "OrderFormView-cancel-02: Control Dialogs closed." + self~deRegisterInterest("appClosing",self) -- de-register interest in any events + return self~cancel~super + end + else do -- Control dialogs not yet cancelled + response = askDialog(.HRSofv~QExit, "N") + --say "OrderFormView-cancel-03: response =" response + if response = 1 then do -- '1' means the 'Yes' button pressed + self~deRegisterInterest("appClosing",self) -- de-register interest in any events + self~closeControlDialogs + return self~cancel:super + end + -- if response = 0 then do nothing - user chnaged his/her mind about closing. + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD ok + -- Invoked when enter key pressed - if passed to superclass, cancels dialog. + say "OrderFormView-ok-01." + return -- do not close dialog - appears as a no-op to the user. + + + /*---------------------------------------------------------------------------- + notify - Invoked by the Event Manager when a registered event occurs. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD notify PUBLIC + expose controlDialogsClosed + use strict arg event + --say "OrderFormView-notify-01: event =" event + if event = "appClosing" then do + self~closeControlDialogs + controlDialogsClosed = .true + end + + + /*---------------------------------------------------------------------------- + closeControlDialogs. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD closeControlDialogs PRIVATE + expose tabContent + do dlg over tabContent + dlg~endExecution(.false) + end + + + /*---------------------------------------------------------------------------- + myFormat - A routine to format numbers into currency - e.g. converts + "123456" into "1.234.56". + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::ROUTINE myFormat + use arg number + number = number~right(9,0) -- left-pad with zeros + parse var number mill 2 thou 5 hun 8 dec + decs = "."||dec + select + when mill > 0 then number = mill||","||thou||","||hun||decs + when thou > 0 then number = thou~strip(,0)||","||hun||decs + when hun > 0 then number = hun~strip(,0)||decs + otherwise number = "0"||decs + end + return number + /*--------------------------------------------------------------------------*/ + + + /*---------------------------------------------------------------------------- + deRegisterInterest - tell Event Manager that any events registered are no + longer of interest. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +/* ::METHOD deRegisterInterest PRIVATE + expose eventMgr + --say "OrderFormView-deRegisterInterest-01." + eventMgr~deRegisterInterest("appClosing",self) +*/ + + /*---------------------------------------------------------------------------- + leaving - invoked by ooDialog when a dialog closes - but not when it's + closed by closing the app - i.e. closing OrderMgrView. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD leaving UNGUARDED + expose tabcontent cd1 cd2 + --say "OrderFormView-leaving-01." +/* do dlg over tabContent + dlg~endExecution(.false) + end +*/ --forward class (super) continue + + + /*---------------------------------------------------------------------------- + Methods to set up Control Dialogs + ---------------------------------------------------------------------------*/ + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + calculateDisplayArea + - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD calculateDisplayArea PRIVATE + expose tabControl displayRect + + -- Given a rectangle describing the tab control's size and position, the tab + -- control itself will calculate the display area's size and position. + r = tabControl~windowRect + tabControl~calcDisplayRect(r) + + -- Save the size of the display area, we need it later. + s = .Size~new(r~right - r~left, r~bottom - r~top) + + -- Now we need to map the display area's position on the screen, to the client + -- co-ordinates of the main dialog. The control dialog(s) are children windows + -- of the main dialog, which is why we need to use the client-area of the + -- dialog, not the client area of the tab control. + p = .Point~new(r~left, r~top) + self~screen2client(p) + + -- Create our display rectangle. This is used in setWindowPosition(), which + -- takes a point / size rectangle. ooDialog defines a point / size rectangle + -- as using the left and top attributes for the position of the upper left + -- corner of a rectangle, using the right attribute for the width of the + -- rectangle, and using the bottom attribute for the height of the rectangle. + displayRect = .Rect~new(p~x, p~y, s~width, s~height) + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + positionAndShow() + Used to resize and reposition one of the control dialogs so it occupies + the display area of the tab control. + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD positionAndShow private + expose tabControl tabContent displayRect lastSelected havePositioned + use strict arg index + --say "OrderFormView-positionAndShow-01; index =" index + -- We can not position the control dialog until the underlying Windows dialog + -- is created. If the system is heavily loaded for some reason, this may not + -- have happened yet. We need to wait for it. + dlg = tabContent[index] + do i = 1 to 10 + if dlg~hwnd <> 0 then leave + z = SysSleep(.01) + end + --say "OrderFormView-positionAndShow-02." + if dlg~hwnd == 0 then do + say "Error creating dialog for the tab with index:" index", aborting" + return self~cancel + end + + if lastSelected <> 0 then tabContent[lastSelected]~hide + + -- Now resize and reposition the control dialog to the tab control's display + -- area. We need to position the control dialog *above* the tab control in + -- the Z-order so that it shows. + dlg~setWindowPos(tabControl~hwnd, displayRect, "SHOWWINDOW NOOWNERZORDER") + --say "OrderFormView-positionAndShow-03."; say + + lastSelected = index + havePositioned[index] = .true + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + onNewTab - Invoked when user selects another tab. + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD onNewTab + expose tabControl tabContent havePositioned lastSelected + --say "OrderFormView-onNewTab-01." + index = tabControl~selectedIndex + 1 + --say "OrderFormView-onNewTab-02: index =" index + dlg = tabContent[index] + --say "OrderFormView-onNewTab-03: dlg, havePositioned[index] =" dlg havePositioned[index] + + if havePositioned[index] then do + last = tabContent[lastSelected] + last~hide + dlg~show + lastSelected = index + end + else do + --dlg~ownerDialog = self + --dlg~execute + self~positionAndShow(index) + end + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD prep + expose tabContent lastSelected havePositioned + use strict arg tabContent + --say "OrderFormView-prep-01." + -- The havePositioned array is used to determine if the page dialogs have been + -- positioned or not. Mark all 5 dialogs as not having been positioned yet. + havePositioned = .array~of(.false, .false) + -- No tab has been selected yet + lastSelected = 0 + + -- Connect the event handling methods to the events we are interested in. + --self~connectButtonEvent(IDC_PB_PREVIOUS, CLICKED, onPrevious) + --self~connectButtonEvent(IDC_PB_NEXT, CLICKED, onNext) + self~connectTabEvent(IDC_ORDFORM_TABS, SELCHANGE, onNewTab) + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + + +/*============================================================================*/ + + + +/*============================================================================== + CustomerDetailsDlg - a Page in the OrderFormView + ------------------ + The "view" (or "gui") Customer Ordering part of the OrderFormView component. + ----------------------------------------------------------------------------*/ + ::CLASS CustomerDetailsDlg SUBCLASS RcControlDialog + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + initDialog + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose pbFindCust ecCustNum ecCustName ecCustAddr ecCustDisc objectMgr + --say "OrderFormView/CustomerDetailsDlg-initDialog-01: tabControl =" tabControl + + -- Get ObjectMgr object id for later use. + objectMgr = .local~my.objectMgr + + ecCustNum = self~newEdit("IDC_CUSTDTLS_NUM") + ecCustName = self~newEdit("IDC_CUSTDTLS_NAME") + ecCustAddr = self~newEdit("IDC_CUSTDTLS_ADDR") + ecCustDisc = self~newEdit("IDC_CUSTDTLS_DISC") + pbFindCust = self~newPushButton("IDC_CUSTDTLS_FIND") + -- pfFindCust is disabled in the .rc file, and is enabled when the focus + -- is placed on the Customer Number field. The button is disabled when pushed. + self~connectEditEvent("IDC_CUSTDTLS_NUM","GOTFOCUS",custNumGotFocus) + self~connectButtonEvent("IDC_CUSTDTLS_FIND","CLICKED",findCustomer) + --say "CustomerDetailsDlg-initDialog-01." + + /*- - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + setOrderFormDlg - Invoked by OrderFormView dialog so that this Control Dialog + can communicate with OrderFormView. + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD setOrderFormDlg + expose dlgOrderForm + use arg dlgOrderForm + /*- - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + CustNumGotFocus - invoked when user puts focus on Customer Number field, + in which case the "Find Customer" pushbutton is enabled. + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD CustNumGotFocus UNGUARDED + expose pbFindCust + --say "CustomerDetailsDlg-CustNumGotFocus-01." + pbFindCust~style = "DEFPUSHBUTTON" + pbFindCust~enable + --self~focusControl("IDC_CUSTDTLS_FIND") + /*- - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + findCustomer - invoke when the "Find Customer" button is pressed. + Gets Customer details for the Cust Number in ecCustNum. + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD findCustomer UNGUARDED + expose ecCustNum ecCustName ecCustAddr ecCustDisc pbFindCust objectMgr dlgOrderForm + --say "CustomerDetailsDlg-findCust-01." + custNo = ecCustNum~getLine(1) + idCust = objectMgr~getComponentId("CustomerModel",custNo) + --say "OrderFormView/CustomerDetailsDlg-findCustomer-01: idCustNo =" idCust + if idCust = .false then do + r = ErrorDialog(.HRSofv~noCust) + pbFindCust~disable + return + end + dirCustData = idCust~query + if dirCustData = .false then do + say "OrderFormView/CustomerDetailsDlg-findCustomer-02: query returned error." + return + end + self~setCustomer(dirCustData) + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + getCustomer - invoked by main OrderFormView dialog when a Customer is + dropped on the Order Form. + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getCustomer UNGUARDED + expose ecCustNum + use strict arg customerId + dirCustData = customerId~query + -- set Customer Number in dialog control - this not done by the setCustomer + -- method because it's keyed in by the user when not using drag/drop. + ecCustNum~setText(dirCustData["CustNo"]) + self~setCustomer(dirCustData) + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + setCustomer - invoke when a Customer is dropped on the Order Form. + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD setCustomer UNGUARDED + expose ecCustNum ecCustName ecCustAddr ecCustDisc pbFindCust objectMgr dlgOrderForm + use strict arg dirCustData + -- Got Cust details - now populate controls (Name, Address, Discount): + ecCustName~setText(dirCustData["CustName"]) + -- Replace commas with eols: + strCustAddr = dirCustData["CustAddr"]~changeStr(",",.endOfLine) + -- Add the zip: + strCustAddr = strCustAddr||" "||dirCustData["Zip"] + ecCustAddr~setText(strCustAddr) + ecCustDisc~setText(dirCustData["CustDisc"]) + -- disble the "Find Customer" button. + pbFindCust~disable + -- Finally, tell the OrderFormView about what the Customer discount code is: + dlgOrderForm~setCustDiscount(dirCustData["CustDisc"]) + -- Re-calc totals to take account of Customer Discount if Cust entered after + -- order lines or a different Customer is selected half-way through the order. + dlgOrderForm~showTotals(0) -- provide ordeLineAmount as zero. + /*- - - - - - - - - - - - - - - - - - - - - - - - - */ + + +/*============================================================================== + OrderLinesDlg - a Page in the OrderFormView + ------------- + + The "view" (or "gui") Products Ordering part of the OrderFormView. + ----------------------------------------------------------------------------*/ +::CLASS OrderLinesDlg SUBCLASS RcControlDialog INHERIT View + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + initDialog + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose objectMgr ecProdNum ecQty lvOrderItems + + -- Get ObjectMgr object id for later use. + objectMgr = .local~my.objectMgr + + lvOrderItems = self~newListView("IDC_ORDLINES_LIST") + lvOrderItems~addExtendedStyle(GRIDLINES FULLROWSELECT) + lvOrderItems~insertColumnPX(0,"ProdNo", 50,"LEFT") + lvOrderItems~insertColumnPX(1,"Product Name", 150,"LEFT") + lvOrderItems~insertColumnPX(2,"UOM", 40,"RIGHT") + lvOrderItems~insertColumnPX(3,"Qty", 40,"RIGHT") + lvOrderItems~insertColumnPX(4,"Amount", 60,"RIGHT") + --say "OrderLinesDlg-initDialog-01." + + -- Test an edit field: + ecProdNum = self~newEdit("IDC_ORDLINES_PRODNO") + --say "OrderLinesDlg-initDialog-02; ecProdNum =" ecProdNum + ecQty = self~newEdit("IDC_ORDLINES_QTY") + pbAddOrderLine = self~newPushButton("IDC_ORDLINES_ADD") + self~connectEditEvent("IDC_ORDLINES_PRODNO","GOTFOCUS",prodNumGotFocus) + self~connectButtonEvent("IDC_ORDLINES_ADD","CLICKED",addOrderLine) + self~connectButtonEvent("IDC_ORDLINES_DELETE","CLICKED",deleteOrderLine) + self~connectListViewEvent("IDC_ORDLINES_LIST","ACTIVATE",showProduct) -- double-click + + --say "OrderLinesDlg-initDialog-03: ecProdNum =" ecProdNum + -- Set focus on the Product Number field: + self~focusControl("IDC_ORDLINES_PRODNO") + --pbAddOrderLine~state = "FOCUS" + self~initView -- required by View mixin. + + /*- - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + setOrderFormDlg - Invoked by OrderFormView dialog so that this Control Dialog + can communicate with OrderFormView. + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD setOrderFormDlg + expose OrderFormDlg + use arg OrderFormDlg + --say "OrderFormView/OrderLinesDlg-setOrderFormDlg-01." + /*- - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + prodNumGotFocus + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD prodNumGotFocus UNGUARDED + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + addOrderLine - invoked when user presses the "Add OrderLine" button. + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD addOrderLine UNGUARDED + expose ecProdNum ecQty lvOrderItems objectMgr OrderFormDlg + --say "OrderFormView/OrderLinesDlg-addOrderLine-01." + -- Get data that user has entered: + prodNum = ecProdNum~getLine(1) + qtyOrdered = ecQty~getLine(1) + --say "OrderFormView/OrderLinesDlg-addOrderLine-02: prodNum =" prodNum + if qtyOrdered < 1 then do + r = ErrorDialog(.HRSofv~noQty) + return + end + -- Get product details from Product Model component: + idProduct = objectMgr~getComponentId("ProductModel",prodNum) + --say "OrderFormView/OrderLinesDlg-addOrderLine-03: idProduct =" idProduct + if idProduct = .false then do + r = ErrorDialog(.HRSofv~noProduct) + --pbFindCust~disable + return + end + dirProductData = idProduct~query + if dirProductData = .false then do + say "OrderFormView//OrderLinesDlg-addOrderLine-04: Product not found." + return + end + + -- State at this point: Product found and qty entered. + + -- Calculate Total Price: + total = qtyOrdered*dirProductData["ListPrice"] + --say "OrderFormView/OrderLinesDlg-addOrderLine-05: total =" total + -- Ensure display total has 2 decimal places: + --displayTotal = total/100~format(,2) + displayTotal = myFormat(total) + lvOrderItems~addRow( , , prodnum, dirProductData["ProdName"], - + dirProductData["UOM"], qtyOrdered, displayTotal) + + -- Send amount of Order to the OrderFormView dialog: + OrderFormDlg~showTotals(total) + + -- Blank out fields ready for next order line: + ecProdNum~settext("") + ecQty~settext("") + self~focusControl("IDC_ORDLINES_PRODNO") + /*- - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + getProduct - invoked by main OrderFormView dialog when a Product is + dropped on the Order Form. + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getProduct UNGUARDED + expose ecProdNum + use strict arg productId + --say "OrderFormView/OrderLinesDlg-getProduct: ecProdNum =" ecProdNum +--trace i + dirProdData = productId~query + -- set Product Number in dialog control: + ecProdNum~setText(dirProdData["ProdNo"]) + self~focusControl("IDC_ORDLINES_QTY") +--trace off + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + deleteOrderLine + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD deleteOrderLine + expose lvOrderItems + item = lvOrderItems~selected + say "OrderFormView/OrderLinesDlg-01: item selected =" item + if item = -1 then do -- if no item selected. + r = ErrorDialog(.HRSofv~noOrdLine) + return + end + lvOrderItems~delete(item) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD rootDialog + expose rootDlg + use strict arg rootDlg + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + showProduct + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showProduct UNGUARDED + expose lvOrderItems rootDlg + item = lvOrderItems~selected + if item = -1 then do + ret = MessageDialog(.HRSofv~nilSelected, self~hwnd, title, 'WARNING') + return + end + info = .Directory~new + if lvOrderItems~getItemInfo(item, info) then do + --say "OrderLinesDlg-showProduct-01: info~text =" info~text "rootDlg =" rootDlg + r = self~showModel:super("ProductModel", info~text, rootDlg) + end + else do + say "OrderLinesDlg-showProduct-04: ~getItemInfo returned .false." + end + + + /*---------------------------------------------------------------------------- + leaving - invoked by ooDialog when a dialog closes. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD leaving UNGUARDED + --expose objectMgr viewClass viewInstance + --objectMgr~removeView(viewClass, viewInstance) + --say "OrderFormView/OrderLinesDlg-leaving-01." + /*- - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderTotals v01-00 03May13 + ----------- + This class is the set of Order Totals. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + ::CLASS OrderTotals PUBLIC + ::ATTRIBUTE amount + ::ATTRIBUTE discount + ::ATTRIBUTE discountedAmount + ::ATTRIBUTE tax + ::ATTRIBUTE taxedAmount + + ::METHOD init + self~amount = 0.00 + self~discount = 0.00 + self~discountedAmount = 0.00 + self~tax = 0.00 + self~taxedAmount = 0.00 + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + PROBABLY REUNDANT!! + Order Grid (OrderGrid) v01-00 03May13 + -------- + This class is a table or grid of Order Line Items. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + ::CLASS OrderGrid PRIVATE + + ::ATTRIBUTE lines -- Array of Order lines + ::ATTRIBUTE totals + ::ATTRIBUTE numLines + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + init - set up Order Grid + - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + self~lines = .array~new + self~totals = .array~new + self~totals[1,1]=0; + self~totals[2,1]=0; self~totals[2,2]=0 + self~totals[3,1]=0; self~totals[3,2]=0 + self~numLines = 0 + + ::METHOD addLine + use strict arg dirLine + + ::METHOD delLine + use strict arg lineNo + /*- - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Order Header v01-00 06May13 + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + ::CLASS OrderHeader + ::attribute orderNumber + ::attribute orderDate + ::attribute custNo + ::attribute custName + ::attribute address + ::attribute discount +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Order Line v01-00 06May13 + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + ::CLASS OrderLine + ::attribute prodNo + ::attribute prodName + ::attribute UOM + ::attribute qty + ::attribute amount +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRSofv) v01-00 07Jun12 + -------- + The HRSofv class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSofv PRIVATE -- Human-Readable Strings + ::CONSTANT CancelOrder "Cancel Order" + ::CONSTANT HelpAbout "Help - About" + ::CONSTANT nilSelected "Please select an item first." + ::CONSTANT NoBtn "This button is not yet implemented." + ::CONSTANT NoCust "Customer not found." + ::CONSTANT NoOrdLine "No Order Line selected." + ::CONSTANT NoMenu "This menu item is not yet implemented." + ::CONSTANT NoProduct "Product not found." + ::CONSTANT NoQty "No valid quantity." + ::CONSTANT PlaceOrder "Place Order" + ::CONSTANT QExit "Are you sure you want to cancel this Order and throw away all changes?" + ::CONSTANT SaveOrder "Save Order" +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderHeadersFile.txt b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderHeadersFile.txt new file mode 100644 index 0000000..7f4bfeb --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderHeadersFile.txt @@ -0,0 +1,6 @@ +OrderNo | CustNo | Date | Disc | Cmtd +SO-1234 | AB0784 | 120821 | 2 | N +SO-2345 | BA0314 | 110815 | 1.5 | Y +SO-3456 | BA0314 | 120527 | 0 | Y +SO-4567 | CU0003 | 120630 | 0 | Y +SO-4569 | AC0027 | 120824 | 5 | N diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderLinesFile.txt b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderLinesFile.txt new file mode 100644 index 0000000..38c61df --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderLinesFile.txt @@ -0,0 +1,13 @@ +OrderNo | ProdNo | Qty +SO-1234 | AB100/W | 5 +SO-1234 | CF300/X | 6 +SO-1234 | EF500/W | 15 +SO-2345 | AB100/W | 5 +SO-3456 | XY200 | 7 +SO-3456 | LM400 | 4 +SO-4567 | XY200 | 12 +SO-4567 | CU003 | 1 +SO-4569 | AB100/W | 10 +SO-4569 | LM400 | 8 +SO-4569 | CU003 | 5 +SO-4569 | XY200 | 12 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderListView.h b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderListView.h new file mode 100644 index 0000000..bc886a6 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderListView.h @@ -0,0 +1,48 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_ORDLIST_LISTVIEW 106 +#define IDI_ORDLIST_DLGICON 107 +#define IDR_ORDLIST_MENU 108 +#define IDC_ORDLIST_LIST 1000 +#define IDC_ORDLIST_SHOWORDER 1001 +#define IDM_ORDLIST_NEWORDER 40000 +#define IDM_ORDLIST_ABOUT 40001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderListView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderListView.rc new file mode 100644 index 0000000..317a390 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderListView.rc @@ -0,0 +1,73 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include +#include +#include +#include "OrderListView.h" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_ORDLIST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Order...", IDM_ORDLIST_NEWORDER + } + POPUP "Help" + { + MENUITEM "About...", IDM_ORDLIST_ABOUT + } +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDLIST_LISTVIEW DIALOG 0, 0, 255, 273 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Order List" +FONT 8, "Ms Shell Dlg" +{ + PUSHBUTTON "Cancel", IDCANCEL, 150, 235, 50, 14 + CONTROL "", IDC_ORDLIST_LIST, WC_LISTVIEW, WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SORTASCENDING, 15, 10, 225, 215 + DEFPUSHBUTTON "Show Order", IDC_ORDLIST_SHOWORDER, 89, 235, 42, 14, WS_DISABLED +} + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_ORDLIST_DLGICON ICON ".\\order\\bmp\\OrderList.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderListView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderListView.rex new file mode 100755 index 0000000..394077e --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderListView.rex @@ -0,0 +1,255 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: The Order ListView v03-00 24May13 + + Contains: class "OrderListView", "HRSolv" + + Pre-requisite files: OrderListView.rc, OrderListView.h. + + Description: Provides a list of Orders and supports viewing any given + Order via a double-click on that Order's item in the list. + This is an "Intermediate" component - it is invoked by OrderMgmt, + and invokes OrderView. + + Changes: + v01-00 07Jun12: First Version (Ex06). + v02-00 25Aug12: Updated for Ex07 using the MVF. + 08Jan13: Removed stand-alone startup (not now needed). + 11Jan13: Commented-out 'say' instructions. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + v03-00 24May13: Exercice08 Update to use View & Component mixin. + + Outstanding Problems: None reported. + +*******************************************************************************/ + + +.Application~addToConstDir("Order\OrderListView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "Order\OrderView.rex" +--::REQUIRES "Support\RcView.rex" +::REQUIRES "Support\View.rex" + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderListView v01-01 25Aug12 + ------------- + The view of a list of products. + Changes: + v01-00 07Jun12: First version + v02-00 25Aug12: Updated for Ex07 using the MVF. + v03-00 24May13: Update for Ex08 to use View & Component mixin. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderListView SUBCLASS RcDialog PUBLIC INHERIT View Component -- v03 + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use strict arg idModel, rootDlg --Ex07 + --say ".OrderListView-newInstance-01: root, idModel =" rootDlg idModel + dlg = self~new("Order\OrderListView.rc", "IDD_ORDLIST_LISTVIEW") + --say ".OrderListView-newInstance-02." + dlg~activate(idModel, rootDlg) --Ex07 + return dlg --Ex07 + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + forward class (super) continue + self~initView + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + --say "OrderListView-createMenuBar-01." + menuBar = .ScriptMenuBar~new("Order\OrderListView.rc", "IDR_ORDLIST_MENU", , , .true) + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose rootDlg modelData --Ex07 + use strict arg idModel, rootDlg --Ex07 + --say "OrderListView-activate-01: idModel, root =" idModel rootDlg + forward class (super) continue --Ex07 + modelData = RESULT --Ex07 + --say "OrderListView-activate-02: modelData =" modelData + self~popupAsChild(rootDlg, "SHOWTOP", ,"IDI_ORDLIST_DLGICON") + --return self --Ex07 + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar lvOrders btnShowOrder modelData --Ex07 + -- Called by ooDialog after SHOWTOP. + + menuBar~attachTo(self) + + --say "OrderListView-initDialog-01"; say + lvOrders = self~newListView("IDC_ORDLIST_LIST"); + lvOrders~addExtendedStyle(GRIDLINES FULLROWSELECT) + lvOrders~insertColumnPX(0,"OrderNo",60,"LEFT") + lvOrders~insertColumnPX(1,"CustNo",80,"LEFT") + lvOrders~insertColumnPX(2,"CustName",130,"LEFT") + lvOrders~insertColumnPX(3,"Date",80,"LEFT") + self~connectListViewEvent("IDC_ORDLIST_LIST","CLICK",itemSelected) + self~connectListViewEvent("IDC_ORDLIST_LIST","ACTIVATE",openItem) -- double-click + self~connectButtonEvent("IDC_ORDLIST_SHOWORDER","CLICKED",showOrder) + + self~loadList + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newOrder UNGUARDED + self~noMenuFunction(.HRSolv~newOrder) + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSolv~helpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSolv~noMenu, self~hwnd, title, 'WARNING') + + + /*---------------------------------------------------------------------------- + Event Handling Methods - List Items + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD itemSelected unguarded + expose lvOrders --btnShowOrder + use arg id, itemIndex, columnIndex, keyState + if itemIndex > -1 then self~enableControl("IDC_ORDLIST_SHOWORDER") + else self~disableControl("IDC_ORDLIST_SHOWORDER") + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD openItem UNGUARDED + --say "OrderListView-openItem-01: item selected =" item + self~showOrder + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showOrder unguarded + expose lvOrders rootDlg + item = lvOrders~selected + --say "OrderListView-showOrder-01: item selected =" item + if item = -1 then do -- if no item selected. + ret = MessageDialog(.HRSolv~nilSelected, self~hwnd, title, 'WARNING') + return + end + info=.Directory~new + if lvOrders~getItemInfo(item, info) then do + --say "OrderListView-showOrder-02: info~text =" info~text + objectMgr = .local~my.ObjectMgr + objectMgr~showModel("OrderModel", info~text, rootDlg) --Ex07 + self~disableControl("IDC_ORDLIST_SHOWORDER") + end + else do + say "OrderListView-showOrder-04: ~getItemInfo returned .false." + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD loadList + expose lvOrders modelData -- Ex07 + --say "OrderListView-loadList-01: dataArray =" modelData -- Ex07 + rows = modelData[count] -- Ex07 - number of rows + arrData = modelData[records] + --say "OrderListView-loadList-02:Dims =" modelData~dimension(1) modelData~dimension(2) + do i = 1 to rows + --say "OrderListView-loadList-04a: modelData[i,2] =" modelData[i,2] + -- Change date to display format - i.e. yymmdd to (US format!) mm-dd-yy): + date = arrData[i,3] + displayDate = date~substr(3,2)||"/"||date~substr(5)||"/"||date~substr(1,2) + lvOrders~addRow( , ,arrData[i,1], arrData[i,2], arrData[i,6], displayDate) + end + lvOrders~setColumnWidth(2) -- set width of 3rd column to longest text entry. + + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + HRSolv (Human-Readable Strings for OrderListView) v01-00 07Jun12 + --- + The HRSolv class provides constant character strings for user-visible messages + issued by the OrderListView class. + + Changes: + v01-00 07Jun12: First Version + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +::CLASS HRSolv PRIVATE -- Human-Readable Strings + ::CONSTANT noMenu "This menu item is not yet implemented." + ::CONSTANT newOrder "New Order" + ::CONSTANT helpAbout "Help - About" + ::CONSTANT nilSelected "Please select an item first." + +/*============================================================================*/ + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderModelsData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderModelsData.rex new file mode 100755 index 0000000..7afdbba --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderModelsData.rex @@ -0,0 +1,517 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: The OrderModel and OrderData Classes v02-01 06Jun13 + + Contains: classes "OrderModel", OrderListModel, and "OrderData". --Ex07 + Pre-requisites: None. + + Outstanding Problems: + None. + + Changes: + v01-00 07Jun12: First version. + v02-00 08Jan13: Modified to use the MVF. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + v02-01 06Jun13: Added drag/drop code to OrderFormModel + +------------------------------------------------------------------------------*/ + + +::REQUIRES "Support\Model.rex" +::REQUIRES "Support\GenericFile.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderModel v01-00 08Feb13 + ------------ + The "model" part of the Order component. + + Changes: + v01-00 07Jun12: First version. + 24Aug12: Modified to use the MVF. + 11Jan13: Commented-out 'say' instructions. + 08Feb13: Minor changes to comments only. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderModel SUBCLASS Model PUBLIC --Ex07 + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use strict arg instanceName --Ex07 + forward class (super) continue --Ex07 + modelId = RESULT --Ex07 + return modelId --Ex07 + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + init - Superclass 'Model', in its newInstance method, queries the Data + component for this instance's data, then does the self~new(myData) + which invokes this 'init' method. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose orderData + use strict arg orderData -- Ex07: data provided by Superclass. + self~myData = orderData -- Ex07: store in superclass's attribute. + --say "OrderModel-init-01: orderData =" orderData + --say "OrderModel-init-02: self~myData =" self~myData + + -- MVF gives gets the Order's Header data for the OrderModel, and OrderDetails for + -- the OrderListModel. Here we've got the Order Headers; now we need to ask + -- the OrderData component for the Order Details for this Order only: + --objMgr = .local.my~ObjectMgr + --idOrderData = objMgr~getComponentId("ProductData", "The") + --headerData = idOrderData~getHeaders( = + + return self -- Ex07 + + +-- ::METHOD query PUBLIC +-- use arg orderNo +-- if orderNo = "ORDERNO" then -- param not supplied +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderFormModel v02-00 06Jun13 + -------------- + The model component for the OrderForm business component. + + Changes: + v01-00 04Oct12. + v02-00 06Jun13: Added drag/drop class method (dmQueryDrop) which checks + whether the dragged source is a Customer. + + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderFormModel SUBCLASS Model PUBLIC + + ::ATTRIBUTE nextOrderNumber CLASS + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + newInstance - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD newInstance CLASS PUBLIC + use strict arg instanceName -- invoked by ObjectMgr + --say ".OrderFormModel-newInstanceName-01." + forward class (super) continue --Ex07 + modelId = RESULT --Ex07 + return modelId --Ex07 + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + dmQueryDrop - Check whether a drag/drop operation is allowed to drop + on an order form. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD dmQueryDrop CLASS PUBLIC + use arg sourceClassName + --say ".OrderFormModel-dmQueryDrop-01 sourceClassName =" sourceClassName + if sourceClassName = "CUSTOMERMODEL" then return .true + if sourceClassName = "PRODUCTMODEL" then return .true + else return .false + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + getInstanceName - over-rides super's method. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD getInstanceName CLASS PUBLIC + --say ".OrderFormModel-getInstanceName-01." + if self~nextOrderNumber = "NEXTORDERNUMBER" then do -- No instance name set + self~nextOrderNumber = "SO-4999" + end + number = self~nextOrderNumber~right(4) + number += 1 + self~nextOrderNumber = "SO-"||number + --say ".OrderFormModel-getInstanceName-02: instanceName =" self~nextOrderNumber + return self~nextOrderNumber + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + init - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD init + expose orderData + use strict arg orderData -- Ex07: data provided by Superclass. + self~myData = orderData -- Ex07: store in superclass's attribute. + --say "OrderModel-init-01: orderData =" orderData + return self + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderListModel v01-00 24Aug12 + -------------- + The "ListModel" for the SalesOrder business component. + + Changes: + v01-00 24Aug12. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderListModel SUBCLASS Model PUBLIC + + ::ATTRIBUTE myData +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + use strict arg instanceName + self~wantList = .true -- MVF - for List models only. + forward class (super) continue -- MVF: super does the ~new and + -- passes data as a param on the init. + modelId = RESULT -- MVF + --say ".OrderListModel-newInstance-01: id =" modelId + return modelId -- MVF - could just say 'return modelId'. + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + init - stores received data in attribute 'arrData' and returns self. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose arrData + use strict arg arrData + self~myData = arrData + --say "OrderListModel-init-01: data = " self~myData + --say "OrderListModel-init-02: type and dimensions:" self~myData self~myData~dimension + return self + + + /*---------------------------------------------------------------------------- + query - returns an array of all OrderHeader data. + In MVF this method is invoked by the RcView (or ResView) superclass. + But the list also needs the name of the Customer. So this model + also gets the Customer Name from the appropriate Customer Model. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD query PUBLIC + --say "OrderListModel-query-01: self~myData =" self~myData + -- myData is an array of records. Now get Customer + return self~myData + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderData v01-00 07Jun12 + ------------ + The "data" part of the Order component. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderData SUBCLASS GenericFile PUBLIC + + ::ATTRIBUTE created CLASS + ::ATTRIBUTE dirOrderHeaders PUBLIC -- a directory containing all records in + -- the SalesOrderHeaders.txt file joined + -- with Customer Name and Address from + -- the Customer file. + ::ATTRIBUTE dirOrderLines PUBLIC -- a directory containing all records in + -- the SalesOrderLines.txt file joined + -- with product Description from the + -- Product File. +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + use strict arg instanceName + if self~created = "CREATED" then do + orderDataId = self~new() + return orderDataId + end + else do + say "... singleton component, so can't have more than one instance." + return .false + end + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + init - Invoked super to read the OrderHeader file, which is stored by super + in super's 'fileAsDirectory' attribute - and also the 'raw' form of + the file is stored in super's 'fileArray' attribute. + The OrderDetail file is read separately by invoking super's 'readFile' + method. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD init --Ex07 + expose filename numRecords + -- Read the OrderHeaders file: + filename = "Order\OrderHeadersFile.txt"; columns = 5 + -- invoke super to read the OrderHeaders file (read into super's + -- fileAsDirectory attribute): + numRecords = self~init:super(fileName, columns) + self~dirOrderHeaders = self~fileAsDirectory + -- List the OrderHeaders + /*say "OrderData-init-01: numRecords:" numRecords + if numRecords > 0 then do + say "OrderData-init-02: Array is:" + say self~fileArray~tostring -- fileArray is super's attribute. + end */ + -- Read the OrderLines file: + self~dirOrderLines = self~readFile:super("Order\OrderLinesFile.txt", 3) + + -- At this point, the OrderHeader file is the dirOrderHeadersattribute, + -- and the OrderLines file is in self~dirOrderLines. + -- Now, for the OrderHeaders, do a 'join' with Customer to add the + -- customer's name and address to the order headers in self~dirOrderHeaders: + self~addCustomerInfo + -- And now add Product info to the order lines in self~dirOrderLines: + self~addProductInfo + --self~listOrders + return self -- MVF + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + addCustomerInfo - Called by init - adds customer info from the CustomerData + component to each of the OrderHeader lines. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD addCustomerInfo PRIVATE + -- (1) Add column headers (field names) from Customer to OrderHeaders: + columnHeaders = self~dirOrderHeaders[headers] + columnHeaders[6] = "CustName"; columnHeaders[7] = "CustDisc" + columnHeaders[8] = "CustAddr"; columnHeaders[9] = "Zip" + self~dirOrderHeaders[headers] = columnHeaders + + -- (2) Add values for custName, Discount, CustAddress and Zip for each order header line: + arrData = self~dirOrderHeaders[records] + --say "OrderData-getFile-02 arrData, dims =" arrData arrData~dimension + -- (2a) First get id for CustomerData: + objMgr = .local~my.ObjectMgr + idCustData = objMgr~getComponentId("CustomerData", "The") + if idCustData = .false then return .false + -- (2b) For each order header, get the cust name & addr from CustomerData + -- and add it to the OrderHeader in-memory file: + do i=1 to self~dirOrderHeaders[count] -- loop over the Order Headers records: + -- get Customer record from CustomerData: + --say "OrderData-getFile-04: arrOrderHeaders[i,2] =" arrOrderHeaders[i,2] + orderCustNo = arrData[i,2] + custDir = idCustdata~getRecord(orderCustNo) + -- add customer's Name and Address to the end of the record: + arrData[i,6] = custDir["CustName"] + arrData[i,7] = custDir["CustDisc"] + arrData[i,8] = custDir["CustAddr"] + arrData[i,9] = custDir["Zip"] + end + self~dirOrderHeaders[records] = arrData + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + addProductInfo - Called by init - adds product name from the ProductData + component to each of the OrderLine records + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.*/ + ::METHOD addProductInfo PRIVATE -- Invoked by init. + -- (1) Add column header from Product to the headers (field labels) array: + columnHeaders = self~dirOrderLines[headers] + columnHeaders[4] = "ProdName" + self~dirOrderLines[headers] = columnHeaders + + -- (2) Add values for ProdName to each order header line: + arrData = self~dirOrderLines[records] + -- (2a) First get id for ProductData: + objMgr = .local~my.ObjectMgr + idProductData = objMgr~getComponentId("ProductData", "The") + if idProductData = .false then return .false + -- (2b) For each order line, get the product name from ProductData + -- and add it to the OrderLines in-memory file: + do i=1 to self~dirOrderLines[count] -- loop over the Order Lines records: + -- get Product record from ProductData: + orderProductNo = arrData[i,2] + prodDir = idProductData~getRecord(orderProductNo) + orderProductName = prodDir["ProdName"] + -- add product's Name to the end of the record: + arrData[i,4] = orderProductName + end + self~dirOrderLines[records] = arrData + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + dirData = .Directory~new + do j=1 to columns + header = self~FileHeaders[j] + dirData[header] = self~fileRecords[recordNo,j] + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + getRecord - returns a directory 'dirOrderRecord' containing all the data for + a given Order, including both Order Headers and Order Lines. + The format of the directory is: + Index Item + ------- ------- + OrderNo the order number (from dirOrderHeaders} + CustNo customer number (from dirOrderHeaders} + Date order date (from dirOrderHeaders} + Disc discount (from dirOrderHeaders} + Cmtd committed? (from dirOrderHeaders} + CustDisc customer discount (from dirOrderHeaders) + OrderLineHdrs (from dirOrderLines) + OrderLines (from dirOrderLines) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getRecord PUBLIC + use strict arg orderNo + if orderNo = "" then return .false + + -- (1) Get the data from the two directories that contain data from the two + -- files. Call these the "src" (source) variables: + arrSrcOrderHeaderLabels = self~dirOrderHeaders[headers] -- note naming clash but never mind... + arrSrcOrderHeaders = self~dirOrderHeaders[records] + numSrcOrderHeaders = self~dirOrderHeaders[count] + arrSrcOrderLineLabels = self~dirOrderLines[headers] + arrSrcOrderLines = self~dirOrderLines[records] + numSrcOrderLines = self~dirOrderLines[count] + + -- (2) Find the Order Header record: + found = .false + do recordNo = 1 to numSrcOrderHeaders + if arrSrcOrderHeaders[recordNo,1] = orderNo then do + found = .true; leave + end + end + if \found then return .false + + -- (3) Now build the dirOrderRecord + -- (3a) Put the Order headers(i,e, the field labels) into dirOrderRecord: + dirOrderRecord = .Directory~new + -- Put the OrderHeader info into dirOrderRecord: + columns = arrSrcOrderHeaderLabels~items + do j=1 to columns + itemName = arrSrcOrderHeaderLabels[j] + dirOrderRecord[itemName] = arrSrcOrderHeaders[recordNo,j] + end + -- (3b) Put the Headers (Field Labels) for the order lines into the record: + arrOLH = .Array~new + arrOLH = arrSrcOrderLineLabels + dirOrderRecord[OrderLineHdrs] = arrOLH + -- (3c) Now Put OrderLines for this order into dirOrderRecord's array + arrOrderLines = .Array~new + rows = arrSrcOrderLines~dimension(1) -- number of lines or rows + j = 1 + do i =1 to rows -- iterate over all rows in arrSrcOrderLines + --say "Orderdata-getRecord-02:" orderNo arrSrcOrderLines[i,1] + if arrSrcOrderLines[i,1] = orderNo then do + --say "OrderData-getRecord-02a: j arrSrcOrderLines[i,1] orderNo:" j arrSrcOrderLines[i,1] orderNo + arrOrderLines[j,1] = arrSrcOrderLines[i,1] + arrOrderLines[j,2] = arrSrcOrderLines[i,2] + arrOrderLines[j,3] = arrSrcOrderLines[i,3] + arrOrderLines[j,4] = arrSrcOrderLines[i,4] + j = j+1 + end + end + --say "OrderData-getRecord-03: arrOrderLines dimensions =" arrOrderLines~dimension(1) arrOrderLines~dimension(2) + dirOrderRecord[OrderLines] = arrOrderLines + + return dirOrderRecord + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + getFile - Invoked by Model for an xxxListModel component; + returns all OrderHeaders including customer info. */ + ::METHOD getFile PUBLIC + return self~dirOrderHeaders + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + listOrders - lists the file. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD listOrders PUBLIC + say; say "----List-Orders--------------------------------" + say "Number of Orders:" self~dirOrderHeaders[Count] + arrOHH = self~dirOrderHeaders[Headers] + say "Order Headers: Headers or Field Names ("||arrOHH~items "columns):" + do i=1 to 9 + say "Order Headers FieldNames:" arrOHH[i] + end + say " " arrOHH[1] arrOHH[2] arrOHH[3] arrOHH[4] arrOHH[5] arrOHH[6] arrOHH[7] arrOHH[8] arrOHH[9] + say "Order Headers - Records" + arrOHR = self~dirOrderHeaders[Records] + do i = 1 to arrOHR~dimension(1) + say i||". " arrOHR[i,1] arrOHR[i,2] arrOHR[i,3] arrOHR[i,4] + say " " arrOHR[i,5] arrOHR[i,6] arrOHR[i,7] + say " " arrOHR[i,8] arrOHR[i,9] + end + say + say "Number of Order Lines:" self~dirOrderLines[Count] + arrOLH = self~dirOrderLines[Headers] + say "Order Lines: Headers or FieldNames ("||arrOLH~items "columns):" + say arrOLH[1] arrOLH[2] arrOLH[3] arrOLH[4] + say "Order Lines - Records" + arrOLR = self~dirOrderLines[Records] + do i = 1 to arrOLR~dimension(1) + say i||". " arrOLR[i,1] arrOLR[i,2] arrOLR[i,3] arrOLR[i,4] + end + say "-----------------------------------------------" + say + return .true + +/*============================================================================*/ + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderView.h b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderView.h new file mode 100644 index 0000000..9b72260 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderView.h @@ -0,0 +1,57 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_ORDER_DIALOG 108 +#define IDI_ORDER_DLGICON 109 +#define IDR_ORDER_MENU 110 +#define IDC_ORDER_NAMEADDR 1000 +#define IDC_ST_DISCOUNT_PC 1005 +#define IDM_ORDER_DOTHIS 40000 +#define IDM_ORDER_ABOUT 40001 +#define IDC_ORDER_ORDNO 40007 +#define IDC_ORDER_CUSTNO 40008 +#define IDC_ORDER_ITEMS 40009 +#define IDC_ST_TAX_PC 40010 +#define IDC_ST_DISCOUNT 40011 +#define IDC_ST_TAX 40012 +#define IDC_ST_NET 40013 +#define IDC_ST_TOTAL 40014 +#define IDC_ORDER_DATE 40017 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderView.rc new file mode 100644 index 0000000..3c77c08 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderView.rc @@ -0,0 +1,101 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include "OrderView.h" + + + + +// +// Menu resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_ORDER_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "An Action", IDM_ORDER_DOTHIS + } + POPUP "Help" + { + MENUITEM "About", IDM_ORDER_ABOUT + } +} + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDER_DIALOG DIALOG 0, 0, 272, 270 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_SYSMENU +CAPTION "Sales Order" +FONT 8, "Ms Shell Dlg" +{ + EDITTEXT IDC_ORDER_ORDNO, 217, 30, 40, 14, ES_CENTER | ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_ORDER_CUSTNO, 217, 50, 40, 14, ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY + LTEXT "Order No.", IDC_STATIC, 169, 33, 32, 8, SS_LEFT + LTEXT "Customer No.", IDC_STATIC, 169, 53, 44, 8, SS_LEFT + CONTROL "", IDC_ORDER_ITEMS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT, 17, 70, 240, 115 + LTEXT "Date", IDC_STATIC, 169, 13, 16, 8, SS_LEFT + LTEXT "Net Cost:", IDC_STATIC, 113, 195, 30, 8, SS_LEFT + LTEXT "Discount:", IDC_STATIC, 113, 209, 31, 8, SS_LEFT + DEFPUSHBUTTON "Close", IDCANCEL, 17, 234, 35, 14 + LTEXT "Tax:", IDC_STATIC, 113, 223, 15, 8, SS_LEFT + RTEXT "0.00", IDC_ST_DISCOUNT_PC, 161, 209, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_ST_TAX_PC, 161, 223, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_ST_TAX, 212, 223, 40, 8, SS_RIGHT + RTEXT "0.00", IDC_ST_NET, 212, 195, 40, 8, SS_RIGHT, WS_EX_RIGHT + RTEXT "0.00", IDC_ST_DISCOUNT, 212, 209, 40, 8, SS_RIGHT + EDITTEXT IDC_ORDER_NAMEADDR, 17, 23, 103, 39, ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY + LTEXT "Customer:", IDC_STATIC, 19, 9, 32, 8, SS_LEFT + LTEXT "Total Cost:", IDC_STATIC, 113, 237, 35, 8, SS_LEFT + RTEXT "0.00", IDC_ST_TOTAL, 212, 237, 40, 11, WS_BORDER | SS_RIGHT + EDITTEXT IDC_ORDER_DATE, 217, 10, 40, 14, ES_CENTER | ES_AUTOHSCROLL | ES_READONLY +} + + + +// +// Icon resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_ORDER_DLGICON ICON ".\\Order\\bmp\\OrderForm.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderView.rex new file mode 100755 index 0000000..88163d1 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/OrderView.rex @@ -0,0 +1,283 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: The OrderView class v03-00 26May13 + + OrderFormView.rex + + Contains: class "OrderView". + Pre-requisite files: OrderView.rc, OrderView.h. + + Description: A sample Order View component - part of the sample + Order Management application. + This is a "leaf" component - invoked by OrderListView. + + Outstanding Problems: None reported. + + Changes: + v01-00 07Jun12: First Version (Exercise06) + v02-00 08Jan13: Ex07 - changed to use the MVF. + 11Jan13: Removed stand-alone operation. + Commented-out 'say' instructions. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + v03-00 26May13: Update to use View & Component mixins. + Comment-out the "Are you sure" when dialog closes. + Delete commented-out code in the 'showData' method. + +------------------------------------------------------------------------------*/ + + +.Application~addToConstDir("Order\OrderView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "Order\OrderModelsData.rex" +--::REQUIRES "Support\RcView.rex" +::REQUIRES "Support\View.rex" + +/*============================================================================== + OrderView v01-01 25Aug12 + ------------- + The "view" (or "gui") part of the Order component - part of the sample + Order Management application. + + Changes: + v01-00 07Jun12: First Version. + v02-00 25Aug12: Ex07 - changed to use the MVF. + 08Jan13: Extraneous comments removed; some 'say' stmts commented out. + 11Jan13: Commented-out 'say' instructions. + v03-00 26May13: Update to use View & Component mixins. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderView SUBCLASS RcDialog PUBLIC INHERIT View Component -- Ex08 + + ::METHOD newInstance CLASS PUBLIC + use strict arg idModel, rootDlg -- Ex07 + --say ".OrderView-newInstance: rootDlg =" rootDlg + dlg = self~new("Order\OrderView.rc", "IDD_ORDER_DIALOG") + dlg~activate(idModel, rootDlg) -- Ex07 + return dlg -- Ex07 + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + -- creates the dialog instance but does not make it visible. + expose menuBar + --say "OrderView-init-01" + + forward class (super) continue + self~initView -- Ex08 + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + --say "OrderView-createMenuBar-01" + menuBar = .ScriptMenuBar~new("Order\OrderView.rc", IDR_ORDER_MENU, , , .true) + + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose rootDlg orderData + use strict arg idModelInstance, rootDlg -- Ex07 + forward class (super) continue -- Ex07 - MVF: required to get Model's data + orderData = RESULT -- Ex07 - MVF: model's data returned by super + --say "OrderView-activate-00: orderData = " orderData + + -- Shows the Dialog - i.e. makes it visible to the user. + --say "OrderView-activate-01: OrderNumber = " orderData["OrderNo"] orderData~orderNo + self~popUpAsChild(rootDlg,"SHOWTOP",,"IDI_ORDER_DLGICON") + return self -- Ex07 + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + -- Called by ooDialog after SHOWTOP. + expose menuBar orderControls orderData -- Ex07 + --say "OrderView-initDialog-01" + + menuBar~attachTo(self) + + orderControls = .Directory~new + orderControls[ecOrderNameAddr] = self~newEdit( "IDC_ORDER_NAMEADDR") + orderControls[ecOrderDate] = self~newEdit( "IDC_ORDER_DATE" ) + orderControls[ecOrderNo] = self~newEdit( "IDC_ORDER_ORDNO" ) + orderControls[ecCustNo] = self~newEdit( "IDC_ORDER_CUSTNO" ) + orderControls[lvOrderItems] = self~newListView("IDC_ORDER_ITEMS" ) + orderControls[stNetCost] = self~newStatic( "IDC_ST_NET" ) + orderControls[stDiscountPC] = self~newStatic( "IDC_ST_DISCOUNT_PC") + orderControls[stDiscount] = self~newStatic( "IDC_ST_DISCOUNT" ) + orderControls[stTaxPC] = self~newStatic( "IDC_ST_TAX_PC" ) + orderControls[stTax] = self~newStatic( "IDC_ST_TAX" ) + orderControls[stTotal] = self~newStatic( "IDC_ST_TOTAL" ) + + -- Each Order Item consists of ProdNo, ProdName, Qty: + orderItems = orderControls[lvOrderItems] + orderItems~addExtendedStyle(GRIDLINES FULLROWSELECT) + orderItems~insertColumnPX(0,"Product No.",110,"LEFT") + orderItems~insertColumnPX(1,"Product Name",160,"LEFT") + orderItems~insertColumnPX(2,"Quantity",85,"LEFT") + self~connectListViewEvent("IDC_ORDER_ITEMS","ACTIVATE",showProduct) -- double-click + + --font = self~createFontEx("Ariel", 10) + font = self~createFontEx("Courier", 8) + orderControls[lvOrderItems]~setFont(font) + self~showData + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showProduct + expose orderControls rootDlg + --say "OrderView-showProduct-01: Show Product requested." + productItem = orderControls[lvOrderItems]~selected + --say "OrderView-showProduct-01: item selected =" productItem + if item = -1 then do -- if no item selected. + ret = MessageDialog(.HRSolv~nilSelected, self~hwnd, title, 'WARNING') + return + end + + info=.Directory~new + if orderControls[lvOrderItems]~getItemInfo(productItem, info) then do + --say "OrderView-showOrder-02: info~text =" info~text + objectMgr = .local~my.ObjectMgr + objectMgr~showModel("ProductModel", info~text, self) --Ex07 + self~disableControl("IDC_ORDLIST_SHOWORDER") + end + else do + say "OrderListView-showOrder-04: ~getItemInfo returned .false." + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD anAction UNGUARDED + self~noMenuFunction(.HRSov~anAction) + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSov~HelpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSov~NoMenu, self~hwnd, title, 'WARNING') + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showData + expose orderControls orderData + --say "orderData['CustNo']:" orderData['CustNo'] -- orderData~CustNo, orderData~'CustNo' - neither work. + --say "--------------------" + -- Format & show the address: + custAddr = orderData["CustAddr"] + parse var custAddr street "," city "," state + --say "OrderView-showData-01: address =" street city state orderData["Zip"] + eol = .endOfLine + custNameAddr = orderData["CustName"]||eol||street||eol||city||eol||state orderData["Zip"] + orderControls[ecOrderNameAddr]~setText(custNameAddr) + -- Format & show the order date: + orderDate = orderData["Date"] + yy = orderDate~left(2); dd = orderDate~right(2); mm = orderDate~substr(3,2) + orderDate = mm||"/"||dd||"/"||yy + orderControls[ecOrderDate]~setText(orderDate) + -- Show the Order NUmber: + orderControls[ecOrderNo]~setText(orderData["OrderNo"]) + -- Show the Customer NUmber: + orderControls[ecCustNo]~setText(orderData["CustNo"]) + + -- Show the Order Items (aka Order Lines): + lvOrderLines = orderControls[lvOrderItems] + arr = orderData[OrderLines] + --say "OrderView-showData-02: order lines array dims =" arr~dimension + --do i = 1 to arr~dimension(1) + --say arr[i,1] "-" arr[i,2] arr[i,3] arr[i,4] + --end + do i=1 to arr~dimension(1) + qty = arr[i,3]~right(8," ") + lvOrderLines~addRow( , , arr[i,2], arr[i,4], qty ) + end + --lvOrderLines~setColumnWidth(0) -- set width of 2nd column to longest text entry. + --lvOrderLines~setColumnWidth(1) + --lvOrderLines~setColumnWidth(3) + --say "OrderView-showData-02: arrOrderLines =" arrOrderLines + --orderControls[lvOrderItems] + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + -- "Cancel" - This method over-rides the default Windows action of + -- 'cancel window' for an Escape key. + /* + ::METHOD cancel + response = askDialog(.HRSov~QExit, "N") + if response = 1 then forward class (super) + return +*/ +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRSov) v01-00 07Jun12 + -------- + The HRSofv class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSov PRIVATE -- Human-Readable Strings + ::CONSTANT anAction "An Action" + ::CONSTANT NoMenu "This menu item is not implemented." + ::CONSTANT QExit "Are you sure you want to cancel this Order View?" + ::CONSTANT HelpAbout "About Sales Order" + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/bmp/OrderForm.bmp b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/bmp/OrderForm.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2c2ca388d05f61ac583536dae5d3f5fb1542e966 GIT binary patch literal 2166 zcmeHIOAf*y5XHoWi5rPG=*k0l0OH>37?(X-Z&u$MrXx;m0t;3;Da_|}=wm2wyFU&= z7gT4#c9lJw(@)Jp3Ne4^(Xk6E`N+W+8 zrgmdIXq;qO6}D6A=rtHuzE(N;Q%27G*XqxfjoOX%!+W1k01{QAA@PNK2(Ems(#$_H z-}Z3Y$~>3yAB$VsYWMIj&R;%yqLlmx;>y=59sD^oB|dR4e?qLKUfek+Gs*2_<}Ywd nJ962=f82kl;%Rj$qK_pY?39&!e12^q*|XOYzW1Hhzhz(rb0Pbg literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/bmp/OrderList.bmp b/modules/windows/oodialog/userGuide/exercises/Exercise08/Order/bmp/OrderList.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4cc094ed82be0c3180c2b8688e39ecfed14165fc GIT binary patch literal 16438 zcmeI2O-?I841|X@OD@2Y6J#B+=gzrV=p=knWW{5*(|>@2hN8P`Tvc|$dm8cibvSO< z*P(p>DA)1ldfDE~Pvv#owzt>YbzPTl=bhK(c;#!ydXuA-vm2vpn*Ve@209RAS! z=hE}NukuU{f3-*+?|twyf2;%aueRUZr=ho=ZpaSngf`ybt2NFHx}_?bV}0s80dcW+*;ANaBK`R_md>pfR* z{aQcpbN;ao&_C~ddh=@iz>lTR&p-WJ4ZZI(d_OyX>a2pZ@_TiA@nruk9r&&0Z|U_u zCl6@p!HeeSKI(v$Ztrt^fSMlX`_u)|n}zrQ@xeNp)4GrPAiA><9}=w` z(Q~OYD>u5*59????|tZi_?dBgjv!3b|YFdq_ulRRyE zllKL$EARmDl-5dnOAF(x(F0xAq3`8mV>C@u6UkY|$1r*2XW;-fLA{+4tpnA +#include +#include +#include "OrderMgrView.h" + + + + +// +// Menu resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_ORDMGR_MENU MENU +{ + POPUP "Orders" + { + MENUITEM "New Order...", IDM_ORDMGR_NEWORDER + MENUITEM "Order List...", IDM_ORDMGR_ORDERLIST + MENUITEM "Order Search...", IDM_ORDMGR_ORDERSEARCH + } + POPUP "Customers" + { + MENUITEM "Customer List...", IDM_ORDMGR_CUSTLIST + MENUITEM "Customer Search...", IDM_ORDMGR_CUSTSEARCH + } + POPUP "Products" + { + MENUITEM "Product List...", IDM_ORDMGR_PRODLIST + MENUITEM SEPARATOR + MENUITEM "Product Search...", IDM_ORDMGR_PRODSEARCH + } + POPUP "New" + { + MENUITEM "Product...", IDM_ORDMGR_PRODNEW + MENUITEM "Customer...", IDM_ORDMGR_CUSTNEW + MENUITEM "Order...", IDM_ORDMGR_ORDERNEW + } + POPUP "Help" + { + MENUITEM "About", IDM_ORDMGR_ABOUT + MENUITEM "Message Sender", IDM_MESSAGE_SENDER1 + MENUITEM "Person", IDM_PERSON1 + } +} + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_ORDMGR DIALOG 0, 0, 310, 209 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU | WS_MINIMIZEBOX +CAPTION "Dialog" +FONT 8, "Ms Shell Dlg" +{ + PUSHBUTTON "Exit Application", IDC_ORDMGR_EXIT, 245, 186, 60, 15 + PUSHBUTTON "Reset Icons", IDC_ORDMGR_RESET, 5, 186, 50, 15 + CONTROL "", IDC_ORDMGR_ICONS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_ICON, 5, 5, 300, 175 +} diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/OrderMgr/OrderMgrView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/OrderMgr/OrderMgrView.rex new file mode 100755 index 0000000..80be2e7 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/OrderMgr/OrderMgrView.rex @@ -0,0 +1,411 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: OrderMgrView.rex v03-00 11May13 + + Contains: class: "OrderMgrView", "HRSomv" + + Description: The Order Manager View class - the container for of the + Order Management application. + + Pre-requisites: MVF. + + Description: A sample Order Manager View class - part of the sample + Order Manager component. + + Outstanding Problems: None reported. + + Changes: + v01-00 07Jun12: First Version + v01-01 18Jan13: Version 1.1 - dialog sizing now uses resizingAdmin. + v02-00 20Feb13: + 1. Added get id of ObjectMgr in init method. + 2. Added menu item "Help - Person" to surface a Person Model in order to + illustrate MVF using Person class early in Chapter 7. + 3. Added menu item "Help - Message Sender" to surface the Message Sender. + 4. Updated 'showModel' method to use the MVF (via ObjectMgr) to surface + List Views that are populated with data read from disk (instead of data + hard-coded in the ListView) also give listview the instance name of "a" + to indicate an anonymous component to ObjectMgr. + 5. Added methods "person" and "messageSender" which launch a PersonModel + and a Message Sender respectively. + 27Feb13: Commented-out several 'say's. + 08May13: Modified some comments - no change to function. + v03-00 11May13: Added triggering of event "appClosing". + 30Jly14: Corrected .ImageList~create(...) statement in + createIconList method. +------------------------------------------------------------------------------*/ + +-- Use the global .constDir for symbolic IDs - load them from OrderMgrView.h +.Application~addToConstDir("OrderMgr\OrderMgrView.h") + +call "OrderMgr\RequiresList.rex" + +::REQUIRES "ooDialog.cls" +::REQUIRES "Support\Component.rex" + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + OrderMgrView v02-00 20Feb13 + -------------------- + To the user, this class is the Order Management Application. It provides + access to the various functions required for managing Sales orders. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS OrderMgrView SUBCLASS RcDialog PUBLIC INHERIT ResizingAdmin Component +-- ::CLASS OrderMgrView SUBCLASS View PUBLIC INHERIT ResizingAdmin + ::ATTRIBUTE lv PRIVATE -- The ListView that contains the icons. + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + --say ".OrderMgrView-newInstance-01." + dlg = .OrderMgrView~new("OrderMgr\OrderMgrView.rc", IDD_ORDMGR) + dlg~activate + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + expose menuBar records idObjectMgr + --say "OrderMgrView-init-01; next stmt is 'forward class (super) continue'." + forward class (super) continue + --say "OrderMgrView-init-02." + menuBar = .ScriptMenuBar~new("OrderMgr\OrderMgrView.rc", IDR_ORDMGR_MENU, , , .true) + self~createIconList + records = self~initRecords + idObjectMgr = .local~my.ObjectMgr + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD defineDialog + --say "OrderMgrView-defineDialog-01." + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + --say "OrderMgrView-activate-01." + self~execute("SHOWTOP", IDI_DLG_OOREXX) + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar records iconList + --say "OrderMgrView-initDialog-01." + menuBar~attachTo(self) + + -- Create a proxy for the List View and store in instance variable 'lv'. + self~lv = self~newListView(IDC_ORDMGR_ICONS) + + -- Add the Image List to the ListView: + self~lv~setImageList(iconList, NORMAL) + -- Add icons (i.e. records) to the ListView: + do i=1 to records~items + self~lv~addRow(, i-1, records[i]~name) + end + + self~connectListViewEvent(IDC_ORDMGR_ICONS, "ACTIVATE", "onDoubleClick") + -- Following line required to allow icons to be dragged around the listview. + self~connectListViewEvent(IDC_ORDMGR_ICONS, "BEGINDRAG", "DefListDragHandler") + self~connectButtonEvent("IDC_ORDMGR_EXIT", "CLICKED",exitApp) + self~connectButtonEvent("IDC_ORDMGR_RESET","CLICKED",resetIcons) + self~setTitle(.HRSomv~WindowTitle) -- set dialog title. + + --self~saySomething -- Test for Component mixin - delete any time. + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD defineSizing + --say "OrderMgrView-defineSizing-01." + -- Called automatically by ooDialog. + -- Order of arrays: left, top, right, bottom. + -- Order of array items: pinType, edge-of-other-window, id of other window + self~controlSizing(IDC_ORDMGR_RESET, - + .array~of('STATIONARY', 'LEFT' ), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'BOTTOM' ), - + .array~of('MYTOP', 'TOP' ) - + ) + self~controlSizing(IDC_ORDMGR_EXIT, - + .array~of('STATIONARY', 'RIGHT' ), - + .array~of('STATIONARY', 'BOTTOM'), - + .array~of('MYLEFT', 'RIGHT' ), - + .array~of('MYTOP', 'TOP' ) - + ) + self~controlSizing(IDC_ORDMGR_ICONS, - + .array~of('STATIONARY', 'LEFT' ), - + .array~of('STATIONARY', 'TOP' ), - + .array~of('STATIONARY', 'RIGHT' ), - + .array~of('STATIONARY', 'BOTTOM') - + ) + return .false + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createIconList PRIVATE + -- This method simulates getting the icon "data" for the OrderMgr view. + -- The icon data is loaded into 'iconList' which is an 'ImageList' as + -- required by the ListView control. + expose iconList + --say "OrderMgrView-createIconList." + imgCustList = .Image~getImage("customer\bmp\CustList.bmp") + imgProdList = .Image~getImage("product\res\ProdList.bmp") + imgOrderList = .Image~getImage("order\bmp\OrderList.bmp") + imgOrderForm = .Image~getImage("order\bmp\OrderForm.bmp") + iconList = .ImageList~create(.Size~new(64, 64), .Image~toId(ILC_COLOR4), 4, 0) + -- Boldly assume no errors in creating the Image List or in the ~getImage statements. + iconList~add(imgCustList) -- item 0 in iconList (item 1 in records) + iconList~add(imgProdList) -- item 1 in iconList (item 2 in records) + iconList~add(imgOrderList) -- item 2 in iconList (item 3 in records) + iconList~add(imgOrderForm) -- item 3 in iconList (item 4 in records) + imgCustList~release + imgProdList~release + imgOrderList~release + imgOrderForm~release + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initRecords PRIVATE + -- This method simulates getting the "data" for the OrderMgr view. + expose records + records = .array~new() + + rec = .directory~new + rec~ID = "CustomerListModel" -- class name + rec~name = "Customer List" + records[1] = rec + + rec = .directory~new + rec~ID = "ProductListModel" + rec~name = "Product List" + records[2] = rec + + rec = .directory~new + rec~ID = "OrderListModel" + rec~name = "Sales Orders" + records[3] = rec + + rec = .directory~new + rec~ID = "OrderFormModel" + rec~name = "New Order" + records[4] = rec + + return records + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +/* ::METHOD initDialog + expose records iconList + --say "OrderMgrView-initDialog." + self~initDialog:super + -- Add the Image List to the ListView: + self~lv~setImageList(iconList, NORMAL) + -- Add icons (i.e. records) to the ListView: + do i=1 to records~items + self~lv~addRow(, i-1, records[i]~name) + end +*/ + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - Orders - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newOrder UNGUARDED + expose records + self~showModel(records[4]) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD orderList UNGUARDED + expose records + self~showModel(records[3]) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD orderSearch UNGUARDED + self~noMenuFunction(.HRSomv~OrdSrch) + + /*- - Customers - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD customerList UNGUARDED + expose records + self~showModel(records[1]) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD customerSearch UNGUARDED + self~noMenuFunction(.HRSomv~CustSrch) + + /*- - Products - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD productList + expose records + self~showModel(records[2]) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD productSearch UNGUARDED + self~noMenuFunction(.HRSomv~ProdSrch) + + /*- - New - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD product UNGUARDED + self~noMenuFunction(.HRSomv~NewProd) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD customer UNGUARDED + self~noMenuFunction(.HRSomv~NewCust) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD order UNGUARDED + self~newOrder + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSomv~HelpAbout) + + /*- - Message Sender- - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD messageSender UNGUARDED + --say "OrderMgrView-messageSender." + .MessageSender~newInstance(self) + --self~noMenuFunction(.HRSomv~HelpAbout) + + /*- - Message Sender- - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD person UNGUARDED + expose idObjectMgr + --say "OrderMgrView-Person." + objectMgr = .local.my.ObjectMgr + idObjectMgr~showModel("PersonModel","PA150", self) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg title + ret = MessageDialog(.HRSomv~NoMenu, self~hwnd, title, 'WARNING') + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Icon Double-Click + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD onDoubleClick UNGUARDED + expose records + --use arg id + --say "OrderMgrView-onDoubleClick-01." + -- Get the index of the item with the focus, use the index to retrieve + -- the item's record: + index = self~lv~focused -- lv is an attribute of the superclass. + record = records[index+1] + --say "OrderMgrView-onDoubleClick-02: Record ID =" record~ID + self~showModel(record) + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - PushButton Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD resetIcons + r = self~lv~arrange + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD exitApp UNGUARDED + --say "OrderMgrView-exitApp-01." + self~cancel + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD cancel + response = askDialog(.HRSomv~QExit, "N") + --say "OrderMgrView-cancel-01: response to ask dialog =" response + if response = 0 then return + -- Response was 1 so close down: + self~triggerEvent("appClosing") + --eventMgr = .local~my.EventMgr + --r = eventMgr~triggerEvent("appClosing") -- if r = 0 then no-one's registered. + --say "OrderMgrView-cancel: triggerEvent response =" r + forward class (super) -- Closes the whole app. + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD ok + -- Invoked when enter key pressed - if passed to superclass, cancels dialog. + return -- do not close dialog - appears as a no-op to the user. + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showModel UNGUARDED + /* Surface the view of an icon (i.e. view of the model represented by the icon). + */ + expose idObjectMgr + use arg record -- record is a directory object. + className = record~ID + --say "OrderMgrView-showModel-01: className =" className -- Ex07 + r = idObjectMgr~showModel(classname, "a", self) -- Ex07 + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + /*::METHOD triggerEvent + use strict arg event + idEventMgr = .local~my.EventMgr + */ +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + HRSomv (Human-Readable Strings for OrderMgrView) v01-00 07Jun12 + --- + The HRSomv class provides constant character strings for user-visible messages + issued by the OrderMgrBaseView class. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSomv PRIVATE -- Human-Readable Strings + ::CONSTANT QExit "Are you sure you want to close all windows and exit the application?" + ::CONSTANT NoMenu "This menu item is not yet implemented." + ::CONSTANT OM "Order Manager" + ::CONSTANT OrdSrch "Order Search" + ::CONSTANT CustSrch "Customer Search" + ::CONSTANT ProdSrch "Product Search" + ::CONSTANT NewCust "New Customer" + ::CONSTANT NewProd "New Product" + ::CONSTANT HelpAbout "Help - About" + ::CONSTANT WindowTitle "Sales Order Management" -- Dialog Caption + ::CONSTANT Reset "Reset Icons" -- PushButton + ::CONSTANT ExitApp "Exit Application" -- PushButton + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/OrderMgr/RequiresList.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/OrderMgr/RequiresList.rex new file mode 100755 index 0000000..5d6ccb8 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/OrderMgr/RequiresList.rex @@ -0,0 +1,64 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: RequiresList.rex v02-00 09May13 + + Contains: The list of View components that OrderMgrView requires. + + Pre-requisites: Class "OrderMgrView + + Description: This script is called by OrderMgrView. + + Outstanding Problems: None reported. + + Changes: + v01-00 07Jun12: First Version + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + v02-00 09May13: Added View.rex to the requires list. + +------------------------------------------------------------------------------*/ + +--say "OrderMgr RequiresList." + +::REQUIRES "Customer\CustomerListView.rex" +::REQUIRES "Product\ProductListView.rex" +::REQUIRES "Order\OrderListView.rex" +::REQUIRES "Order\OrderFormView.rex" +::REQUIRES "Support\MessageSender.rex" +--::REQUIRES "Support\View.rex" + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductFile.txt b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductFile.txt new file mode 100644 index 0000000..a475007 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductFile.txt @@ -0,0 +1,7 @@ +ProdNo | ProdName | ListPrice | UOM | Size | Description +AB100/W | Baffle | 995 | 20 | S | 3" aluminium baffles - suitable for all bonderers. +CF300/X | Widget Box | 2895 | 6 | M | A 10 litre case with flat sides capable of holding quite a lot of stuff. +CU003 | Widget, 5in | 12499 | 100 | M | Meets all possible Widget needs, except those not possible. +EF500/W | Slodget | 1730 | 10 | S | 5" slodget for use with 3" baffles. +LM400 | Driblet, 10 guage | 34000 | 25 | L | 2' driblet guaranteed to dribletize most clambers. +XY200 | Blad Anchor | 3845 | 1 | M | Fixes all small or medium blads. diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductListView.h b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductListView.h new file mode 100644 index 0000000..67f5489 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductListView.h @@ -0,0 +1,48 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_PRODLIST_DIALOG 102 +#define IDR_PRODLIST_MENU 104 +#define IDI_PRODLIST_DLGICON 105 +#define IDC_PRODLIST_SHOWPRODUCT 1000 +#define IDC_PRODLIST_LISTVIEW 1001 +#define IDM_PRODLIST_NEWPROD 40000 +#define IDM_PRODLIST_ABOUT 40001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductListView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductListView.rc new file mode 100644 index 0000000..539fa1e --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductListView.rc @@ -0,0 +1,76 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include +#include +#include +#include "ProductListView.h" + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_PRODLIST_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "New Product...", IDM_PRODLIST_NEWPROD + } + POPUP "Help" + { + MENUITEM "About...", IDM_PRODLIST_ABOUT + } +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PRODLIST_DIALOG DIALOG 0, 0, 225, 273 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Product List" +FONT 8, "Ms Shell Dlg" +{ + PUSHBUTTON "Cancel", IDCANCEL, 150, 235, 50, 14 + CONTROL "", IDC_PRODLIST_LISTVIEW, WC_LISTVIEW, WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SORTASCENDING, 15, 10, 190, 215 + DEFPUSHBUTTON "Show Product", IDC_PRODLIST_SHOWPRODUCT, 90, 235, 50, 14, WS_DISABLED +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_PRODLIST_DLGICON ICON ".\\product\\res\\ProdList.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductListView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductListView.rex new file mode 100755 index 0000000..4021c3a --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductListView.rex @@ -0,0 +1,255 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide - Exercise08 + + ProductListView v03-00 20May13 + ------------- + The view of a list of products. + + Changes: + v01-00 06Jun12: First version + v02-00 21Aug12: Modified for Exercise07 to use the Model-View Framework. + 11Jan13: Commented-out 'say' instructions. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + v03-00 20May13: Now inherits directly from RcDialog plus the View & + Component mixins. + + Contains: classes "ProductListView, HRSplv (for human-readable strings) + + Pre-requisites: ProductListView.rc, ProductListView.h, ProdList.ico + + Description: An "intermediate" component - called by OrderMgr, + invokes "ProductView". + + Outstanding Problems: None reported. +*******************************************************************************/ + +.Application~addToConstDir("Product\ProductListView.h") + + +::REQUIRES "ooDialog.cls" +::REQUIRES "Product\ProductView.rex" +::REQUIRES "Support\View.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductListView v03-00 24May13 + ------------- + The view of a list of products. + Changes: + v01-00 06Jun12: First version + v02-00 21Aug12: Modified to use the Model-View Framework. + Comment "Ex07" shows where changes from Ex06 have been made. + 09Jan13: 'Say' instructions commented out or removed. + Standalone operation removed (not now needed). + v03-00 24May13: ProducView now inherits directly from ResDialog plus the + View & Compoment mixins. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductListView SUBCLASS RcDialog PUBLIC INHERIT View Component + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use arg idModel, rootDlg -- Ex07 + --say ".ProductListView-newInstance-01: rootDlg =" rootDlg + dlg = self~new("Product\ProductListView.rc", "IDD_PRODLIST_DIALOG") + --say ".ProductListView-newInstance-02." + dlg~activate(idModel,rootDlg) -- Ex07 + return dlg -- Ex07 + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + forward class (super) continue + self~initView + if \ self~createMenuBar then do -- if there was a problem + self~initCode = 1 + return + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD createMenuBar + -- Creates the menu bar on the dialog. + expose menuBar + --say "ProductListView-createMenuBar-01." + menuBar = .ScriptMenuBar~new("Product\ProductListView.rc", "IDR_PRODLIST_MENU", , , .true) + return .true + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate unguarded + expose rootDlg modelData idModel -- Ex07 + use arg idModelInstance, rootDlg -- Ex07 + forward class (super) continue -- Ex07: required to get Model's data + modelData = RESULT -- Ex07: model's data returned by super + --say "ProductListView-activate-01: root =" root + self~popupAsChild(rootDlg, "SHOWTOP", ,"IDI_PRODLIST_DLGICON") + return self -- Ex07 + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar lvProducts btnShowProduct modelData idModel -- Ex07 + -- Called by ooDialog after SHOWTOP. + + menuBar~attachTo(self) + + --say "ProductListView-initDialog-01"; say + lvProducts = self~newListView("IDC_PRODLIST_LISTVIEW"); + lvProducts~addExtendedStyle(GRIDLINES FULLROWSELECT) + lvProducts~insertColumnPX(0,"Number", 60,"LEFT") + lvProducts~insertColumnPX(1,"Name", 160,"LEFT") + lvProducts~insertColumnPX(2,"Price", 50,"RIGHT") -- Ex07 (Right-adjust) + lvProducts~insertColumnPX(3,"UOM", 40,"RIGHT") -- Ex07 (added) + self~connectListViewEvent("IDC_PRODLIST_LISTVIEW","CLICK",itemSelected) + self~connectListViewEvent("IDC_PRODLIST_LISTVIEW","ACTIVATE",openItem) + self~connectButtonEvent("IDC_PRODLIST_SHOWPRODUCT","CLICKED",showProduct) + + -- Set model instance name into the Titlebar: + --parse var self~objectName + self~loadList + + + /*---------------------------------------------------------------------------- + Event-Handler Methods - Menu Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newProduct UNGUARDED + self~noMenuFunction(.HRSplv~newProd) + + /*- - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + self~noMenuFunction(.HRSplv~helpAbout) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD noMenuFunction UNGUARDED + use arg caption + ret = MessageDialog(.HRSplv~noMenu, self~hwnd, caption, 'WARNING') + + /*---------------------------------------------------------------------------- + Event Handling Methods - List Items + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD itemSelected unguarded + expose lvProducts + use arg id, itemIndex, columnIndex, keyState + --say "ProductListView-itemSelected: itemIndex, columnIndex, keyState:" itemIndex columnIndex keyState + --say "ProductListView-itemSelected: item selected is:"lvProducts~selected + if itemIndex > -1 then self~enableControl("IDC_PRODLIST_SHOWPRODUCT") + else self~disableControl("IDC_PRODLIST_SHOWPRODUCT") + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD openItem UNGUARDED + --say "ProductListView-openItem-01: item selected =" item + self~showProduct + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD showProduct UNGUARDED + expose lvProducts rootDlg + item = lvProducts~selected + --say "ProductListView-showProduct-01: item selected =" item + if item = -1 then do -- if no item selected. + ret = MessageDialog(.HRSplv~nilSelected, self~hwnd, title, 'WARNING') + return + end + info=.Directory~new + if lvProducts~getItemInfo(item, info) then do + --say "ProductListView-showProduct-02: info~text =" info~text + --say "ProductListView-showProduct-03; root =" root + objectMgr = .local~my.ObjectMgr + objectMgr~showModel("ProductModel", info~text, rootDlg) --Ex07 + --say "ProductListView-showProduct-04: after startProductView" + self~disableControl("IDC_PRODLIST_SHOWPRODUCT") + end + else do + say "ProductListView-showProduct-05: ~getItemInfo returned .false." + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD loadList + expose lvProducts modelData -- Ex07 + --say "ProductListView-loadList-01: dataArray =" modelData -- Ex07 + rows = modelData[count] -- Ex07 - number of rows + arrData = modelData[records] + --say "ProductListView-loadList-02:Dims =" arrData~dimension(1) arrData~dimension(2) + do i = 1 to rows + -- Change file price to display format (i.e. cents to dollars.cents): + displayPrice = (arrData[i,3]/100)~format(,2) + lvProducts~addRow( , ,arrData[i,1], arrData[i,2], displayPrice, arrData[i,4]) + end + lvProducts~setColumnWidth(1) -- set width of 2nd column to longest text entry. + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + HRSplv (Human-Readable Strings for ProductListView) v01-00 06Jun12 + ------ + The HRS class provides constant character strings for user-visible messages + issued by the ProductListView class. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +::CLASS HRSplv PRIVATE -- Human-Readable Strings + ::CONSTANT noMenu "This menu item is not yet implemented." + ::CONSTANT newProd "New Product" + ::CONSTANT helpAbout "Help - About" + ::CONSTANT nilSelected "Please select an item first." + +/*============================================================================*/ + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductModelsData.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductModelsData.rex new file mode 100755 index 0000000..4235a89 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductModelsData.rex @@ -0,0 +1,266 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: v02-00 24May13 + + The ProductModel, ProductListModel, and ProductData Classes + + Contains: classes "ProductModel", "ProductListModel, "ProductData", + and "ProductDT". + Pre-requisites: None. + + Outstanding Problems: + None. + + Changes: + v00-02: 21Jly11 + v00-03: Correct "return" statement not in right place (typo in code!!) + Renamed the ProductDT attributes (initial "prod" deemed extraneous) + - 26Aug11: added some comments - no change to function. + v00-04 21Aug12: ProducListModel added. Modified to fit the MV Framework. + v02-00 13Jan12: Ex07: Some 'say' instructions removed or commented out. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + 24May13: Minor changes to comments for Ex08. + +------------------------------------------------------------------------------*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductModel v00-02 12Jly11 + ------------ + The "model" part of the Product component. + + interface productModel{ + aProductModel newInstance() -- Class method. + null activate() + aProductDT query() + }; + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::REQUIRES "Support\GenericFile.rex" +::REQUIRES "Support\Model.rex" + +::CLASS ProductModel SUBCLASS Model PUBLIC + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + -- Creates an instance and returns it. + use strict arg instanceName --Ex07 + forward class (super) continue --Ex07 + modelId = RESULT --Ex07 + return modelId --Ex07 + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + -- Gets its data from ProductData. + expose prodData + use strict arg prodData --Ex07 + return self --Ex07 + + + ::METHOD query PUBLIC + -- Returns data requested (no argument = return all) + -- self~myData (super's attribute) is a DT. So ask the data component for its + -- directory version of the data (an attribute of ProductData). + expose prodData + --say "ProductModel-query-01: prodData =" prodData + dir = .directory~new + return prodData +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductListModel v00-01 20Aug12 + ---------------- + The model for a list of Products. + Changes: + v00-01 20Aug12: First version + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductListModel SUBCLASS Model PUBLIC + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD newInstance CLASS PUBLIC + use arg instanceName + --self~myInstanceName = instanceName + self~wantList = .true -- set super's attribute + forward class (super) continue + id = RESULT + --say "ProductListModel-newInstance-01: id =" id + return id + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + ::METHOD init + expose arrData + use strict arg data + --self~myData = data + --say "ProductListModel-init-01: myData =" self~myData + return self + +-- ::METHOD query PUBLIC + /*---------------------------------------------------------------------------- + query - returns an array of all Product data. + In MVF this method is invoked by the RcView (or ResView) superclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --say "ProductListModel-query-01." +-- return self~myData + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductData v01-00 20Jly11 + ------------ + The "data" part of the Product component. + [interface (idl format)] + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductData SUBCLASS GenericFile PUBLIC + + ::ATTRIBUTE created CLASS + ::ATTRIBUTE dirData + +/*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + use strict arg instanceName + if self~created = "CREATED" then do + self~created = .true + productDataId = self~new() + --if r = .true then self~created = .true + return productDataId + end + else do + say "... singleton component, so can't have more than one instance." + return .false + end + + +/*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init PUBLIC + expose filename numRecords + filename = "Product\ProductFile.txt"; columns = 6 + numRecords = self~init:super(filename, columns) + --say "ProductData-init-01: numRecords:" numRecords + return self + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getData PUBLIC -- ???? Use the DT??? + expose data + --say "ProductData-getData-01." + return data + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Find - forward to super, then pack data into a ProductDT. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getRecord PUBLIC + use strict arg dataKey + --say "ProductData-getRecord-00: dataKey = <"||dataKey||">" + forward class (super) continue + dirData = RESULT -- Generic File returns a directory. + --say "ProductData-getRecord-01: dirData =" dirData + self~dirData = dirData + if dirData = .false then return .false + -- Now convert dirData to a DT, pack it into dirData then return dirData: + dt = .ProductDT~new + dt~number = dirData["ProdNo"] + dt~name = dirData["ProdName"] + dt~price = dirData["ListPrice"] + dt~uom = dirData["UOM"] + dt~description = dirData["Description"] + dt~size = dirData["Size"] + dirData["DT"] = dt + return dirData + + +/*============================================================================*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductDT - A business data type for Product data. v00-02 07Aug11 + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/ + +::CLASS ProductDT PUBLIC + + -- dtName XML Name Description + -- --------- ---------- ------------------------------- + -- ProductDT product + ::ATTRIBUTE number -- number Product Number + ::ATTRIBUTE name -- name Product Description + ::ATTRIBUTE price -- price Product Price (rightmost two digits are 100ths of currency unit) +--::ATTRIBUTE currency -- currency Three-letter currency code + ::ATTRIBUTE uom -- uom Product Unit of Measure + ::ATTRIBUTE description -- descrip Product Description + ::ATTRIBUTE size -- size Produce Size Category (S/M/L) + + ::METHOD list PUBLIC + expose number name price uom description size + say "---------------" + say "ProductDT-List:" + say "Number: " number "Name:" name + say "Price:" price "UOM:" uom "Size:" size + say "Description:" description + say "---------------" +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductView.h b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductView.h new file mode 100644 index 0000000..b22805a --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductView.h @@ -0,0 +1,69 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_PRODUCT_VIEW 106 +#define IDR_PRODUCT_VIEW_MENU 107 +#define IDD_PRODUCT_VIEW_ABOUT 108 +#define IDB_PROD_ICON 112 +#define IDI_PROD_DLGICON 113 +#define IDC_PRODABT_ICON_PLACE 1000 +#define IDC_PROD_NO 1000 +#define IDC_PROD_UOM 1001 +#define IDC_PROD_DESCRIPTION 1002 +#define IDC_PROD_STATIC2 1003 +#define IDC_PROD_STATIC3 1004 +#define IDC_PROD_STATIC1 1005 +#define IDC_PROD_STATIC4 1007 +#define IDC_PROD_STATIC5 1008 +#define IDM_PROD_UPDATE 40000 +#define IDM_PROD_REFRESH 40001 +#define IDM_PROD_CLOSE 40002 +#define IDM_PROD_PRINT 40003 +#define IDM_PROD_ABOUT 40004 +#define IDC_PROD_NAME 40010 +#define IDC_PROD_LIST_PRICE 40012 +#define IDC_PROD_SIZE_GROUP 40013 +#define IDC_PROD_SAVE_CHANGES 40014 +#define IDC_PROD_RADIO_SMALL 40015 +#define IDC_PROD_RADIO_MEDIUM 40016 +#define IDC_PRODABT_STATIC1 40017 +#define IDC_PROD_RADIO_LARGE 40017 +#define IDC_PRODABT_STATIC2 40018 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductView.rc b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductView.rc new file mode 100644 index 0000000..742651b --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductView.rc @@ -0,0 +1,124 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + + +#include +#include +#include +#include "ProductView.h" + + + + +// +// Bitmap resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDB_PROD_ICON BITMAP ".\\res\\producticon.bmp" + + + +// +// Menu resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDR_PRODUCT_VIEW_MENU MENU +{ + POPUP "Actions" + { + MENUITEM "&Update Product", IDM_PROD_UPDATE + MENUITEM "Refresh Data", IDM_PROD_REFRESH + MENUITEM "Print...", IDM_PROD_PRINT + MENUITEM "Close", IDM_PROD_CLOSE + } + POPUP "Help" + { + MENUITEM "About...", IDM_PROD_ABOUT + } +} + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PRODUCT_VIEW DIALOG 0, 0, 248, 228 +STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +EXSTYLE WS_EX_WINDOWEDGE +CAPTION "Product" +FONT 8, "Ms Shell Dlg" +{ + LTEXT "Product Number:", IDC_PROD_STATIC1, 25, 28, 54, 8, SS_LEFT + LTEXT "Product Name:", IDC_PROD_STATIC2, 25, 53, 48, 8, SS_LEFT + LTEXT "List Price:", IDC_PROD_STATIC3, 25, 78, 32, 8, SS_LEFT + LTEXT "UOM:", IDC_PROD_STATIC5, 151, 78, 20, 8, SS_LEFT + LTEXT "Description", IDC_PROD_STATIC4, 25, 103, 36, 8, SS_LEFT + EDITTEXT IDC_PROD_NO, 95, 25, 50, 14, NOT WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_PROD_NAME, 95, 51, 130, 13, ES_AUTOHSCROLL | ES_READONLY + EDITTEXT IDC_PROD_LIST_PRICE, 95, 75, 40, 14, ES_AUTOHSCROLL | ES_READONLY, WS_EX_RIGHT + EDITTEXT IDC_PROD_UOM, 175, 75, 40, 14, ES_AUTOHSCROLL | ES_READONLY, WS_EX_RIGHT + GROUPBOX "Size Category", IDC_PROD_SIZE_GROUP, 31, 151, 189, 30, WS_GROUP, WS_EX_CLIENTEDGE + AUTORADIOBUTTON "Small", IDC_PROD_RADIO_SMALL, 46, 165, 33, 8, WS_DISABLED + AUTORADIOBUTTON "Medium", IDC_PROD_RADIO_MEDIUM, 110, 165, 41, 8, WS_DISABLED + AUTORADIOBUTTON "Large", IDC_PROD_RADIO_LARGE, 168, 165, 34, 8, WS_DISABLED + DEFPUSHBUTTON "Save Changes", IDC_PROD_SAVE_CHANGES, 180, 195, 52, 14, WS_DISABLED + EDITTEXT IDC_PROD_DESCRIPTION, 95, 100, 125, 30, ES_MULTILINE +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDD_PRODUCT_VIEW_ABOUT DIALOG 0, 0, 204, 109 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU +CAPTION "About Product View" +FONT 8, "Ms Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 143, 88, 50, 14 + CONTROL "", IDC_PRODABT_ICON_PLACE, WC_STATIC, SS_BITMAP | SS_NOTIFY | SS_REALSIZECONTROL, 16, 7, 102, 71 + LTEXT "A view of a Product component.", IDC_PRODABT_STATIC1, 15, 84, 110, 15, SS_LEFT + LTEXT "An example of an About box using .ResDialog.", IDC_PRODABT_STATIC2, 130, 9, 65, 65, SS_LEFT +} + + + +// +// Icon resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_PROD_DLGICON ICON ".\\res\\Product.ico" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductView.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductView.rex new file mode 100755 index 0000000..ea39788 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/ProductView.rex @@ -0,0 +1,501 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: ProductView.rex - The ProductView component v03-00 18May13 + + Contains: classes "ProductView", "AboutDialog", and "HRSpv". + + Pre-requisites: ProductView.dll, ProductView.h, Pproduct.ico, ProductIcon.bmp, + Support\NumberOnlyEditEx.cls (copied from ooDialog Samples + into the folder Exercise06\Support) + + Description: A sample Product View component - part of the sample + Order Management application. + + Outstanding Problems: None reported. + + Changes: + v01-00 03Jun12: First version for Exercise05. + v01-01 06Jun12: Minor changes for Exercise06. + v02-00 11Jan12: Removed stand-alone operation, plus some comments. + Method 'getData' removed (now redundant). + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + v03-00 24May13: ProducView now inherits directly from ResDialog plus the View + & Compoment mixins. + 18Jun13: Make product a drag/drop source - added stmt in initDialog. +------------------------------------------------------------------------------*/ + +.Application~addToConstDir("Product\ProductView.h") + + +::requires "ooDialog.cls" +::requires "Support\NumberOnlyEditEx.cls" +::requires "Product\ProductModelsData.rex" +::REQUIRES "support\View.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ProductView v03-00 18Jun13 + ----------- + The "view" part of the Product component. Now designed to operate from its own + folder. Should be invoked from immediately outside the Product folder. + [interface (idl format)] + + Changes: + v01-00 03Jun12: First version. + v01-01 06Jun12: Minor changes for Exercise06. + v02-00 09Jan13: Removed stand-alone startup (not now needed), plus some + comments. + v03-00 24May13: ProducView now inherits directly from ResDialog plus the + View & Component mixins. + 18Jun13: Make product a drag/drop source - added stmt in initDialog. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS ProductView SUBCLASS ResDialog PUBLIC INHERIT View Component + + ::ATTRIBUTE dialogState PRIVATE -- States are: 'closable' or 'inUpdate". + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC UNGUARDED + use arg idModel, rootDlg --Ex07 + --say ".ProductView-newInstance-01: model, rootDlg =" idModel rootDlg + .Application~addToConstDir("Product\ProductView.h") + -- Create an instance of ProductView and show it: + dlg = self~new("Product\res\ProductView.dll", IDD_PRODUCT_VIEW) + dlg~activate(idModel, rootDlg) --Ex07 + return dlg --Ex07 + + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Dialog Setup Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + forward class (super) continue + self~initView -- v03 + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose prodData + use arg idModel, rootDlg, prodData --Ex07- note: prodData is a ProductDT. + forward class (super) continue -- MVF: required to get Model's data + dirdata = RESULT -- MVF: model's data returned by super + prodData = dirData[DT] -- dirData is a directory - 'DT' + -- for 'DataType' is in the directory. + self~dialogState = "closable" + self~popUpAsChild(rootDlg,"SHOWTOP",,"IDI_PROD_DLGICON") + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose menuBar prodControls prodData --Ex07 + --say "ProductView-initDialog-01" + + menuBar = .BinaryMenuBar~new(self, IDR_PRODUCT_VIEW_MENU, , self, .true) + + prodControls = .Directory~new + prodControls[ecProdNo] = self~newEdit("IDC_PROD_NO") + prodControls[ecProdName] = self~newEdit("IDC_PROD_NAME") + prodControls[ecProdPrice] = self~newEdit("IDC_PROD_LIST_PRICE") + prodControls[ecUOM] = self~newEdit("IDC_PROD_UOM") + prodControls[ecProdDescr] = self~newEdit("IDC_PROD_DESCRIPTION") + prodControls[gbSizes] = self~newEdit("IDC_PROD_SIZE_GROUP") + prodControls[rbSmall] = self~newRadioButton("IDC_PROD_RADIO_SMALL") + prodControls[rbMedium] = self~newRadioButton("IDC_PROD_RADIO_MEDIUM") + prodControls[rbLarge] = self~newRadioButton("IDC_PROD_RADIO_LARGE") + prodControls[pbSaveChanges] = self~newPushButton("IDC_PROD_SAVE_CHANGES") + self~connectButtonEvent("IDC_PROD_SAVE_CHANGES","CLICKED",saveChanges) + + -- Use NumberOnlyEditEx.cls to enforce numeric only entry for Price and UOM: + prodControls[ecProdPrice]~initDecimalOnly(2,.false) -- 2 decimal places, no sign. + prodControls[ecUOM]~initDecimalOnly(0,.false) -- 0 decimal places, no sign. + prodControls[ecProdPrice]~connectCharEvent(onChar) + prodControls[ecUOM]~connectCharEvent(onChar) + + self~showData -- Show the data + + -- Make product a drag/drop source: + r = self~dmSetAsSource:super("Product\res\Product.cur") + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Event Handler Methods - MenuBar Events: + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD updateProduct UNGUARDED + expose prodControls + + -- Enable the controls to allow changes to the data: + prodControls[ecProdName]~setReadOnly(.false) + prodControls[ecProdPrice]~setReadOnly(.false) + prodControls[ecUOM]~setReadOnly(.false) + prodControls[ecProdDescr]~setReadOnly(.false) + prodControls[rbSmall]~enable + prodControls[rbMedium]~enable + prodControls[rbLarge]~enable + self~enableControl("IDC_PROD_SAVE_CHANGES") + prodControls[pbSaveChanges]~state = "FOCUS" -- Put input focus on the button + self~tabToNext() -- put text cursor on Product Description + -- (as if the user had pressed tab) + self~dialogState = "inUpdate" + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD refreshData UNGUARDED + self~disableControl("IDC_PROD_SAVE_CHANGES") + self~showData + self~dialogState = "closable" + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD print UNGUARDED + ans = MessageDialog(.HRSpv~printMsg) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD close UNGUARDED + return self~cancel:super + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD about UNGUARDED + dlg = .AboutDialog~new("ProductView.dll", IDD_PRODUCT_VIEW_ABOUT) + dlg~execute("SHOWTOP") + + + /*---------------------------------------------------------------------------- + Event Handler Methods - PushButton Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + "Save Changes" - Collects new data, checks if there has indeed been a + change, and if not, issues a warning msg. Disables the + button when valid changes made. */ + ::METHOD saveChanges UNGUARDED + expose prodControls prodData + + -- Transform data from view format (as in controls) to app format (a directory): + newProdData = self~xformView2App(prodControls) + + -- Check if anything's changed; if not, show msgbox and exit with controls enabled. + -- If changed, go on to validate data. + result = self~checkForChanges(newProdData) + if result = .false then do + msg = .HRSpv~nilSaved + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRSpv~updateProd,"OK","WARNING","DEFBUTTON2 APPLMODAL") + return + end + + -- Now validate data: + result = self~validate(newProdData) -- returns a null string or error messages. + -- Better would be a set of error numbers. + -- If no problems, then show msgbox and go on to disable controls. + if result = "" then do + msg = .HRSpv~saved + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRSpv~updateProd,"OK","INFORMATION","DEFBUTTON1 APPLMODAL") + end + -- If problems, then show msgbox and leave user to try again or refresh or exit. + else do + msg = result||.EndOfLine||.HRSpv~notSaved + hwnd = self~dlgHandle + answer = MessageDialog(msg,hwnd,.HRSpv~updateProd,"OK","ERROR","DEFBUTTON1 APPLMODAL") + return + end + + -- Send new data to be checked by CustomerModel object (not implemented). + + -- Disable controls that were enabled by menu "ActionsFile-->Update" selection: + prodControls[ecProdName]~setReadOnly(.true) + prodControls[ecProdDescr]~setReadOnly(.true) + prodControls[ecProdPrice]~setReadOnly(.true) + prodControls[ecUom]~setReadOnly(.true) + if newProdData~size \= "S" then prodControls[rbSmall]~disable + if newProdData~size \= "M" then prodControls[rbMedium]~disable + if newProdData~size \= "L" then prodControls[rbLarge]~disable + self~disableControl("IDC_PROD_SAVE_CHANGES") + self~dialogState = "closable" + + prodData = newProdData + say "ProductView-saveChanges: new values are:" + prodData~list + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Event Handler Methods - Keyboard Events + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD onChar UNGUARDED + -- called for each character entered in the price or UOM fields. + forward to (arg(6)) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + "OK" - This is a no-op method that over-rides the default Windows action + of 'close window' for an Enter key --*/ + ::METHOD ok unguarded + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD cancel + -- If in the process of updating, then ask whether any changes should be + -- thrown away and dialog closed. If yes then close by calling the superclass, + -- else nop. If not in update, then close immediately + if self~dialogState = "inUpdate" then do + ans = MessageDialog(.HRSpv~closeInUpdate, self~dlgHandle, .HRSpv~updateIP, "YESNO", "WARNING", "DEFBUTTON2") + if ans = .PlainBaseDialog~IDYES then return self~cancel:super + else nop + end + else return self~cancel:super + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showData + -- Transfrom data (where necessary) to display format, and then disable controls. + expose prodControls prodData + -- Set data in controls: + prodControls[ecProdNo]~setText( prodData~number ) + prodControls[ecProdName]~setText( prodData~name ) + -- Price in prodData has no decimal point - 2 decimal places are implied - hence /100 for display. + -- Pad with zeros if necessary. + displayPrice = (prodData~price/100)~format(,2) -- corrected in Ex07 + prodControls[ecProdPrice]~setText(displayPrice) + prodControls[ecUOM]~settext( proddata~uom ) + prodControls[ecProdDescr]~setText(prodData~description ) + size = prodData~size + -- Disable controls + prodControls[ecProdName]~setReadOnly(.true) + prodControls[ecProdPrice]~setReadOnly(.true) + prodControls[ecUOM]~setReadOnly(.true) + prodControls[ecProdDescr]~setReadOnly(.true) + prodControls[rbSmall]~disable + prodControls[rbMedium]~disable + prodControls[rbLarge]~disable + -- But check correct button and enable it to highlight it to the user: + select + when size = "S" then do + .RadioButton~checkInGroup(self,"IDC_PROD_RADIO_SMALL","IDC_PROD_RADIO_LARGE","IDC_PROD_RADIO_SMALL") + prodcontrols[rbSmall]~enable + end + when size = "M" then do + .RadioButton~checkInGroup(self,"IDC_PROD_RADIO_SMALL","IDC_PROD_RADIO_LARGE","IDC_PROD_RADIO_MEDIUM") + prodcontrols[rbMedium]~enable + end + otherwise do + .RadioButton~checkInGroup(self,"IDC_PROD_RADIO_SMALL","IDC_PROD_RADIO_LARGE","IDC_PROD_RADIO_LARGE") + prodcontrols[rbLarge]~enable + end + end + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD checkForChanges + -- Check whether any data has actually changed when "Save Changes" button + -- has been pressed. Return .true if data changed, else returns .false. + expose prodData + use arg newProdData + + changed = .false + select + when newProdData~name \= prodData~name then changed = .true + when newProdData~price \= prodData~price then changed = .true + when newProdData~uom \= prodData~uom then changed = .true + when newProdData~description \= prodData~description then changed = .true + when newProdData~size \= ProdData~size then changed = .true + otherwise nop + end + return changed + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD validate + -- Validation: 1. Check price/UOM not changed > 50% up or down. + -- 2. Cannot change from Large to Small without UOM increasing + -- by at least 100%; nor from Small to Large without + -- decreasing by more than 50%. + -- 3. Product Description <= 100 characters. + -- 4. Product Name <= 30 characters. + -- Returns string of messages - the null string if all OK. + expose prodData + use arg newProdData + msg = "" + + -- Check Price (catches decimal point errors also): + price = prodData~price; newPrice = newProdData~price + oldUom = prodData~uom; newUom = newProdData~uom -- 'oldUom - avoids name conflict with 'uom' in newProddata~uom. + if ((price/oldUom)*1.5 < newPrice/newUom) | (newPrice/newUom < (price/oldUom)/2) then do + msg = msg||.HRSpv~badRatio||" " + end + + -- Check Size vs UOM: + if prodData~size = "L" & newProdData~size = "S" - -- Large to Small + & prodData~uom/2 < newProdData~uom then do + msg = msg||.HRSpv~uomTooBig||" " + end + if prodData~size = "S" & newProdData~size = "L" - -- Small to Large + & prodData~uom*2 > newProdData~uom then do + msg = msg||.HRSpv~uomTooSmall||" " + end + + -- Check Product Description length: + if newProdData.description~length > 80 then do + msg = msg||.HRSpv~descrTooBig||" " + end + + -- Check Product Name length: + if newProdData~name~length > 30 then do + msg = msg||.HRSpv~prodNameTooBig + end + + return msg + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD xformView2App + -- Transforms Product Data from View form (in the GUI controls) to + -- App form (a directory with address as an array). + expose prodControls + prodData = .ProductDT~new + prodData~number = prodControls[ecProdNo]~gettext() + prodData~name = prodControls[ecProdName]~getText() + price = prodControls[ecProdPrice]~getText() + -- Data entered has or assumes a decimal point; but data in "application" + -- is a whole number (e.g. $42.42 is recorded in the database as "4242"). + -- So re-format data from decimal to whole number: + priceTwoDecs = price~format(,2) -- force 2 dec positions + -- Re-display price properly formatted (in case the user did not format correctly - e.g. entered "42" or "38.4"): + prodControls[ecProdPrice]~setText(priceTwoDecs) + -- Now format price to "application" format: + price = (priceTwoDecs*100)~format(,0) -- multiply by 100 and then force whole number. + prodData~price = price + prodData~uom = prodControls[ecUOM]~getText() + prodData~description = prodControls[ecProdDescr]~getText() + select + when prodControls[rbSmall]~checked then prodData~size = "S" + when prodControls[rbMedium]~checked then prodData~size = "M" + otherwise prodData~size = "L" + end + + return prodData + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + AboutDialog v01-00 03Jun12 + ------------- + The "About" class - shows a dialog box that includes a bitmap - part of the + ProductView component. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS AboutDialog SUBCLASS ResDialog + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method initDialog + expose font image + resImage = .ResourceImage~new(self) -- Create an instance of a resource image + image = resImage~getImage(IDB_PROD_ICON) -- Create an image from the Product bitmap + stImage = self~newStatic(IDC_PRODABT_ICON_PLACE)~setImage(image) -- Create a static text control and set the image in it + font = self~createFontEx("Ariel", 12) -- Create up a largish font with which to display text and ... + self~newStatic(IDC_PRODABT_STATIC2)~setFont(font) -- ... set the static text to use that font. + -- Provide for a double-click in Product icon: + self~connectStaticNotify("IDC_PRODABT_ICON_PLACE", "DBLCLK", showMsgBox) + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method showMsgBox + --say "AboutDialog-showMsgBox-01." + ans = MessageDialog(.HRSpv~AboutDblClick) + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method leaving + expose font image + self~deleteFont(font) + image~release() + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRSpv) v01-00 03Jun12 + ------------------------------ + The HRSpv class provides constant character strings for user-visible messages. + + Changes: + v00-03 11Feb12: Changed class name NRS to HRSpv + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSpv PRIVATE -- Human-Readable Strings + ::CONSTANT AboutDblClick "You double-clicked!" + ::CONSTANT badRatio "The new price/UOM ratio cannot be changed more than 50% up or down." + ::CONSTANT closeInUpdate "Any changes made will be lost. Exit anyway?" + ::CONSTANT descrTooBig "The Product Description is too long." + ::CONSTANT nilSaved "Nothing was changed! Data not saved." + ::CONSTANT notSaved "Changes Not Saved!" + ::CONSTANT prodNameTooBig "The Product Name is too long." + ::CONSTANT saved "Changes saved." + ::CONSTANT uomTooBig "The new UOM is too large." + ::CONSTANT uomTooSmall "The new UOM is too small." + ::CONSTANT updateIP "Update in process" + ::CONSTANT updateProd "Update Product" + ::CONSTANT printMsg "The 'Print...' menu item is not yet implemented." + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/ProdList.BMP b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/ProdList.BMP new file mode 100644 index 0000000000000000000000000000000000000000..6e4e8c14117bbb55d59e59ab37c5452bc0ebf503 GIT binary patch literal 2166 zcmd6mO-{rx426xv0*MV3H($6=ixaCD#mPHm@VaAGoZeWbKXY zymIL1Q$AEpZtBbs~FcyPw2{w~hckMz#zq^_LIH2z8MnmEV&Or0>%WWQ z+~@in%neJGZ#7{*78M{8^TLqNw^~c=9mFH8%hcaMo#UYRRuix)>LRDXnGgEg5kGI_Beam(4 G{^1vcAq+$S literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/ProdList.ico b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/ProdList.ico new file mode 100644 index 0000000000000000000000000000000000000000..51333f85647fcd2128fd4443472a5a2a4cd5b2a1 GIT binary patch literal 2686 zcmeH`y>Y`Z426-qRH>3C1E@-$1ypzi?T|6Nx$+)BP$0!4biNcROj{&{50ChfB=Uma zy1rw6m7h0}PZ9aTwc@(tqJ1`Yg_!Ty>^uHunQ8uvZ5XmFi|FQ?Lv+@SnE5h4r`4XH z@U4XQ4B+1AQ+{@6^(pTh`uOOTHOH4OKSXn)erJ8k8;5~DIcxn^**J`2eazZBfom-X1{t2L}6-a9|A<4=}OmuW(CJ-$kv!gEKz$ z4{@eG(>te=x^l6h@h@`M#5Lw0?Y_@A5@+|V|1OH_nCo*eH*8gY)C7CVZx}@})Mp$4 zT+b31ug!YEHK{T&d{sb?LoDeTzaggmB;8``(Itk{h|ZlcxRnEb^7J4l4BxH}ZwpoV*>cqB1r(0tq3h zFgOB+o1QK<#!r%xb>VXP_Bao;`6b45iLAL2ebOaJrjKbguB&tA#!4XJQ(F%hj zkf;|?7#x8_y_~|}2qc(**{$hL3?yn16b45iQ46CmI0A`UEQP@lNYnx<430pe7FA(z z1QI-mda4p{dJq$}_zHs~kf;q&7#x8_ZIZ&^2qbFb6b45iQJbkSI06Z7pq^TlswA48 z#M*R)!4XK*hoCSx0*U%K6b45iQ6G%L;0PoL)I%PQK!QK0r*^1Tr7Fp$b20Uhha-^S z0n|etjzEHkQV)4J0tqIf9`bMm5=_n%FG%pi-jzgOIfeive|58x7*2nznAm* z%==cGG(VY4>J0Qs5mu`enX0c2)YOcswi>3Kwtu&O#xFk)hxtJc)sEZksm6!*@%(f( zKK^HXn9sSNK&$^L;L@(H7rDCsdi;LhQvNd#ZM9 Q;%WQ(cD%$(DIYxf4Td8?J^%m! literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/Product.ico b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/Product.ico new file mode 100644 index 0000000000000000000000000000000000000000..64a7c78dfa523547b92aab5a13eeb7de6b9334e3 GIT binary patch literal 1406 zcmeIuOHUI~7zW@Mp#t?*;n3=!KTP<3Hq4S#?YrCes(YIlTR z;D&O)hOpFFV1pW)fCLj3?M%5W8dliybz|C%3zvp(@|^cvCMPo=P(Y8x0vb#3#spXa z)DYT&M6&yTt9Gv!p3Y8qy1L-;`S6mwBCq{^czSy9R#oBEGxu`y^w9Uq5A`X(lz5{(2&|Kubz5+Fem%I4G*LetX-lhDizK9JDt zEZ&pw+#JI5^N1`gU?3XBz~UkXmzFTNyo`@4D~QEn__Vr;&sl40_(G!V>-e#;fnS@O z_!^JnTUH{0IOTU;M}p=$r9pJVfI)t4Z6TRVB2Jmu-iE%j17mj=$y5rdy*>Qi-$y!~ zMmm#0h8)&m2mXf+xRm^obC;YetvAc0%F7Iuk|bSvsBpRIBr6vg${9t&Q!Y22vat&c z6*ikqym~kP{F;-u-a6y3UtzF29Mv`TPX3@Nw`=$4eT!hNVz3Ir*(yNEyRQz<^VW2q zeB-nz*ck*-Jb$sy$sgT5QCfQZ2w*mwkDa^EWu^A0sj#>JC^8k6G`^t!al745+V0Tk Ve*BDIcQv=T{!~kI?$`Xw`~Vw((KY}8 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/ProductIcon.bmp b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/ProductIcon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..13ca9acc4179b04c02b504064d5b3f0218fe66f8 GIT binary patch literal 268234 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 NNPq-NNI<+V{0~hZ)gJ%= literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/ProductView.dll b/modules/windows/oodialog/userGuide/exercises/Exercise08/Product/res/ProductView.dll new file mode 100644 index 0000000000000000000000000000000000000000..9ba536c56c4a58511a17d2c083cb98e9b30325fb GIT binary patch literal 272896 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 KeZAW>r~e0nul 2>&1 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/RequiresList.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/RequiresList.rex new file mode 100755 index 0000000..7e3b5db --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/RequiresList.rex @@ -0,0 +1,87 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: The Order Management Application + Startup.rex v01-02 26May13 + + Description: This file is the "application" or "root" or "starter" part + of the sample Order Management application. + + Changes: + v01-00 06Jun12: First version. + v01-01 07Aug12: Support for ObjectMgr and ViewMgr added. MessageSender is + optional. + 11Jan13: Deleted Commented-out startup of MessageSender. + 21Mar13: Added Copyright notice. + v01-02 01Apr13: After ooDialog 4.2.2, "Samples" folder changed name to + "Extras", so change to ::Requires needed. + 26May13: Corrected paths for ::REQUIRES afrer re-factoring. + +------------------------------------------------------------------------------*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + RequiresList v01-01 25May13 + ---- + The list of files containing classes invoked by the ObjectMgr + + Changes: + v01-00 16Sep12: First version. + 11Jan13: Commented-out 'say' instruction. + v01-01 25May13: Changed ::REQUIRES for Person is folder Person2 which uses + new mixins introduced in Ex08. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +--say "RequiresList-01." +::REQUIRES "Customer\CustomerView.rex" +::REQUIRES "Customer\CustomerModelsData.rex" +::REQUIRES "Customer\CustomerListView.rex" +::REQUIRES "Product\ProductModelsData.rex" +::REQUIRES "Product\ProductListView.rex" +::REQUIRES "Order\OrderFormView.rex" +::REQUIRES "Order\OrderListView.rex" +::REQUIRES "Order\OrderModelsData.rex" +::REQUIRES "Order\OrderView.rex" +--::REQUIRES "Extras\Wow4\WowView.rex" +--::REQUIRES "Extras\Wow4\WowModel.rex" +--::REQUIRES "Extras\Wow4\WowData.rex" +::REQUIRES "Extras\Person\PersonView.rex" +::REQUIRES "Extras\Person\PersonModelData.rex" +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Startup.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Startup.rex new file mode 100755 index 0000000..bbfd444 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Startup.rex @@ -0,0 +1,81 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: The Order Management Application + Startup.rex v01-02 25May13 + + Description: This file is the "application" or "root" or "starter" part + of the sample Order Management application. + + Changes: + v01-00 06Jun12: First version. + v01-01 07Aug12: Support for ObjectMgr and ViewMgr added. MessageSender is + optional. + 11Jan13: Deleted Commented-out startup of MessageSender. + 01Apr13: After ooDialog 4.2.2, Support folder moved to exercise + folder, so change to ::Requires needed. + v01-02 11May13: Added instantiation of Event Manager (class EventMgr) + 25May13: mods to comments only. + +------------------------------------------------------------------------------*/ + +parse arg pwOption +if pwOption = "enterPW" then do + pwd = PasswordBox("Please enter your password","Sign In") + if pwd \= "Password" then exit +end + +-- Set application defaults: +.Application~setDefaults("O", , .false) + +-- Create Object Manager, View Manager, and Event Manager: +om = .ObjectMgr~new +vm = .ViewMgr~new +em = .EventMgr~new +dm = .DragMgr~new + +-- Start OrderMgrView: +.OrderMgrView~newInstance + +::REQUIRES "OrderMgr\OrderMgrView.rex" +::REQUIRES "Support\ObjectMgr.rex" +::REQUIRES "Support\ViewMgr.rex" +::REQUIRES "Support\EventMgr.rex" +::REQUIRES "Support\DragMgr.rex" +::REQUIRES "Support\MessageSender.rex" + +/******************************************************************************/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/Component.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/Component.rex new file mode 100755 index 0000000..ac37348 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/Component.rex @@ -0,0 +1,118 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide - Support + Exercise 08: View.rex + + Component v01-00 13May13 + --------- + A superclass for all components (View, Model and data). Part of the MVF. + + Contains: class: "Component" + + Description: *** To be provided. *** + + Pre-requisites: None. + + Outstanding Problems: None reported. + + Changes: + v01-00 13May13: First Version. + +------------------------------------------------------------------------------*/ + + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Object v01-00 13May13 + ------ + The superclass for all application components. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +--::CLASS View SUBCLASS RcDialog PUBLIC +::CLASS Component PUBLIC MIXINCLASS Object + + + /*---------------------------------------------------------------------------- + init - initialises the dialog - not used. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method init + say "Component-init-01." + + ::METHOD saySomething + say "Component-saySomething: Hi there!." + return .true + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Event Management + --------------------------------------------------------------------------*/ + + /*---------------------------------------------------------------------------- + registerInterest + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD registerInterest + use strict arg eventName, interestedObject + eventMgr = .local~my.EventMgr + --say "Component~registerInterest-01: event =" eventName||"; object =" interestedObject + r = eventMgr~registerInterest(eventName,interestedObject) + return r + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + triggerEvent + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD triggerEvent + use arg eventName + eventMgr = .local~my.EventMgr + --say "Component-triggerEvent-01: event =" eventName||"; r =" r + r = eventMgr~triggerEvent(eventName) -- if r = 0 then no-one's registered. + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + deRegisterInterest + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD deRegisterInterest + use arg eventName, uninterestedObject + eventMgr = .local~my.EventMgr + --say "Component-deRegisterIntrest-01: event =" eventName||"; object =" uninterestedObject||" r =" r + r = eventMgr~deregisterInterest(eventName, uninterestedObject) -- if r = 0 then no-one's registered. + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/DragMgr.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/DragMgr.rex new file mode 100755 index 0000000..a6d6bbd --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/DragMgr.rex @@ -0,0 +1,352 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide - Exercise08 + + Support - DragMgr v01-00 26Jun13 + --------------------- + A singleton component that manages direct manipulation. + + Notes: A 'source' view is a dialog that's "picked up" by pressing and holding + button 1 (usually the left button) of the mouse. + A 'target' view is a dialog that's dropped onto by releasing + button 1 over the target dialog. + + Interface DragMgr { + setTarget + setSource + removeDlg + list lists tables of source & target dialogs. + dmPickup captures mouse - i.e. sets the mouse capture to the window + of this mouse instance. + moving If over a target (as supered by a dlg instance): + - check if this is a valid target AND is topmost window + - If over a valid drop area send dmQueryDrop(sourceDlg,mousePos) + to target. + - If response is .true then show dropOKCursor + else show noDropCursor (system-provided). + dmDrop - If cursor is no-drop then no-op. + Else send dmDrop(sourceDlg) to drop target. + } + + Changes: + v01-00 06Jun13: First version. + 18Jun13: Changed 'drop' method name to 'dmDrop'. + 26Jun13: Change 'queryTables' method name to 'list' (to conform with + other Managers). + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::REQUIRES ooDialog.cls +::REQUIRES "Order\OrderModelsData.rex" + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================*/ +::CLASS DragMgr PUBLIC + + ::ATTRIBUTE targetDialogs PRIVATE -- dlg - hwnd, dropArea + ::ATTRIBUTE sourceDialogs PRIVATE -- dlg - mouse, dropOkCursor, pickupArea + ::ATTRIBUTE dragInProgress + --::ATTRIBUTE draggingSourceDlg PRIVATE + + + /*---------------------------------------------------------------------------- + init - initialises the Drag Manager + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose icons dragging cursorIsNoDrop noDropCursor + .local~my.DragMgr = self + --say "DragMgr-init-01: .local~my.DragMgr =" .local~my.DragMgr + self~dragInProgress = .false + self~targetDialogs = .Table~new -- Index = dlg id + -- Item = an Array: hwnd, dropArea, + self~sourceDialogs = .Table~new -- Index = dlg id, + -- Item = an Array: mouse, cursor, pickupArea + noDropCursor = .Mouse~loadCursor("NO") + if noDropCursor == 0 then do + say "DragManager-init-02:" .HRSdm~badNoDropCursor .SystemErrorCode + end + + cursorIsNoDrop = .false + dragging = .false + + return self + + + /*---------------------------------------------------------------------------- + setTarget - Adds a target view component to the Targets table + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD setTarget PUBLIC + --expose targetDialogs + use strict arg dlg, hwnd, dropArea + items = .Array~new + items[1] = hwnd; items[2] = dropArea + self~targetDialogs[dlg] = items + + + /*---------------------------------------------------------------------------- + setSource - Adds a source view component to the Targets table + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD setSource PUBLIC + --expose sourceDialogs dropOkCursor + --use strict arg dlg, mouse, cursorFile, pickupArea, control + use strict arg sourceWin, mouse, cursorFile, pickupArea, srcDlg -- *** + -- cursorFile is relative path and filename e.g. "bmp\customer.cur". + --say "DragManager-setSource-01: sourceWin, Area =" sourceWin||"," pickupArea + + dropOkCursor = .Mouse~loadCursorFromFile(cursorFile) + if dropOkCursor == 0 then do + say "DragManager-setSource-02:" .HRSdm~badOkCursor .SystemErrorCode + end + + items = .Array~new + items[1] = mouse; items[2] = dropOkCursor; + items[3] = pickupArea; items[4] = srcDlg + self~sourceDialogs[sourceWin] = items + + + /*---------------------------------------------------------------------------- + RemoveDlg - Removes a dialog from the Targets table when the dialog closes. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD removeDlg PUBLIC + use strict arg dlg + -- Check in SourceDlgs: + self~sourceDialogs~remove(dlg) + self~targetDialogs~remove(dlg) + + + /*---------------------------------------------------------------------------- + dmPickup - Handles drag initiation when the user "picks up" a dialog. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD dmPickup PUBLIC + expose cursorIsNoDrop dragging dropOkCursor mouse noDropCursor oldCursor overTarget + use strict arg sourceWin, keyState, mousePos + + --say "DragMgr-dmPickup-00; sourceWin =" sourceWin + arrItems = self~sourceDialogs[sourceWin] -- mouse,srcCursor,pickupArea,sourceDlg + mouse = arrItems[1] + dropOkCursor = arrItems[2] + dragging = .false +--trace i + if keyState \== 'lButton' | \ mousePos~inRect(arrItems[3]) then return .false +--trace off + if mouse~dragDetect(mousePos) then do + --say "DragManager-dmPickup-01: dropOkCursor =" dropOkCursor + if dropOkCursor == 0 then do + nop --say "DragManager-dmPickup-02:" .HRSdm~badOkCursor .SystemErrorCode + end + --say 'DragManager-dmPickup-03: Detected dragging.' + mouse~capture() + oldCursor = mouse~setCursor(noDropCursor) + cursorIsNoDrop = .true + dragging = .true + validTarget = .false + overTarget = .false + end + --say "DragManager-dmPickup-04: dragging =" dragging + return + + + /*---------------------------------------------------------------------------- + moving - Handles mouse movements - detects when mouse over a dialog, and if + it's a 'target' dialog, asks it whether it will accept a drop. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD moving PUBLIC + expose cursorIsNoDrop dragging dropOkCursor mouse noDropCursor overTarget dropTarget + use arg sourceWin, sourceDlg, keyState, mousePos + -- overTarget - true when the cursor is over a potential target dialog, + -- regardless of whether the target refuses a drop or not. + -- sourceWin is the window (dialog or control) that has captured the mouse. + -- Note: new APIs introduced in ooDialog Build 7449 + --say "DragManager-moving-00; sourceDlg, sourceWin, dragging =" sourceDlg||"," sourceWin||"," dragging + if \dragging then return + --say "DragManager-moving-00A: Flags:" cursorIsNoDrop dragging overTarget + -- Find out if mouse is over a target dialog: + targetDlg = 0 + do i over self~targetDialogs -- items: 1 = hwnd, 2 = droparea + targetHwnd = self~targetDialogs[i][1] + droparea = self~targetDialogs[i][2] + --say "DragMgr-moving-00B: targetHwnd, dropArea =" targetHwnd||"," dropArea + -- Prevent showing drop when over a target that is under another window: + screenPt = mousePos~copy() -- Point in source dialog (i.e. top left of dlg is 0,0) + --say "DragManager-moving-01: screenPt =" screenPt + sourceWin~client2screen(screenPt) + --sourceDlg~client2screen(screenPt) -- screenPt is set to screen position (i.e. top left of screen is 0,0) + --say "DragManager-moving-02: screenPt =" screenPt + screenHwnd = .DlgUtil~windowFromPoint(screenPt) -- Get hwd of topmost window that mouse is over + --say "DragManager-moving-03: screenHwnd =" screenHwnd + + pDlg = mousePos~copy + --sourceDlg~mapWindowPoints(targetHwnd, pDlg) -- MousePos relative to targetHwnd + sourceWin~mapWindowPoints(targetHwnd, pDlg) -- MousePos relative to targetHwnd + --say "DragManager-moving-04: pDlg =" pDlg + childHwnd = i~childWindowFromPoint(pDlg) -- Get the hwnd visible under mouse pointer + --say "DragManager-moving-05: childHwnd, pDlg =" childHwnd||"." pDlg + + if screenHwnd == childHwnd then do + p1 = mousePos~copy() + --sourceDlg~mapWindowPoints(targetHwnd,p1) + sourceWin~mapWindowPoints(targetHwnd,p1) + --say "DragManager-moving-06: p1 =" p1 + if p1~inRect(droparea) then do + targetDlg = i + -- next two statements for debug only + --tgtNumber = i~queryNumber + --say "DragManager-moving-07: Target found - hwnd =" targetHwnd tgtNumber + leave -- Stop looping - target found! + end + end + end + --say "DragManager-moving-060." + if targetDlg \= 0 then do -- If we're over a target + if targetDlg = sourceDlg then return -- If target is also the source + -- then it's not a target (in this version!). + if \overTarget then do -- if first time over target + + --Get the model class for the source View: + objectMgr = .local~my.ObjectMgr + sourceClassName = objectMgr~modelClassFromView(sourceDlg) + targetClassName = objectMgr~modelClassFromView(targetDlg) + --say "DragMgr-moving-06a: source Class =" sourceClassName + --say "DragMgr-moving-06b: target Class =" targetClassName + --parse value a~class with . className . + interpret "r = ."||targetClassName||"~dmQueryDrop("||sourceClassName||")" + --say "DragManager-moving-07a: first time - queryDrop returned" r + if r = .true then do -- if target accepts a drop + validTarget = .true + dropTarget = targetDlg -- for drop method ... + end + else do -- if target refuses drop + validTarget = .false + overTarget = .true + dropTarget = .false + return + end + -- It's a valid target! + overTarget = .true + mouse~setCursor(dropOkCursor) + cursorIsNoDrop = .false + end + end + else do -- Not over a target + if overTarget then do -- Mouse has just come off target + validTarget = .false + overTarget = .false + mouse~setCursor(noDropCursor) + cursorIsNoDrop = .true + dropTargetDlg = 0 + end + end + + + + /*---------------------------------------------------------------------------- + dmDrop - Handles things when the user drops onto a target. + Invoked by "View" (the superclass). + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD dmDrop PUBLIC + expose cursorIsNoDrop dragging mouse oldCursor dropTarget + use strict arg sourceDlg, keyState, mousePos + --say "DragManager-dmDrop-01: the mouse is at ("mousePos~x", "mousePos~y")" + --say "DragManager-dmDrop-02: cursorIsNoDrop =" cursorIsNoDrop + + if dragging then do + okayToDrop = (cursorIsNoDrop \== .true) -- if cind = .false then okToDrop is true; + -- if cind = .true then okToDrop is false + dragging = .false + cursorIsNoDrop = .false + mouse~releaseCapture() + mouse~setCursor(oldCursor) + --say "DragManager-dmDrop-02a: mouse released; old cursor set." + -- Jiggle the mouse so it is redrawn immediately (OS: seems to make no diff.) + p = mouse~getCursorPos; p~incr; mouse~setCursorPos(p) + + if okayToDrop then do + --say "DragManager-dmDrop-03: sourceDlg =" sourceDlg +-- objectMgr = .local~my.ObjectMgr +-- sourceClassName = objectMgr~modelClassFromView(sourceDlg) +-- targetClassName = objectMgr~modelClassFromView(targetDlg) + objectMgr = .local~my.ObjectMgr + sourceModelId = objectMgr~modelIdFromView(sourceDlg) + dropTarget~dmDrop(sourceModelId, sourceDlg) + --say "DragManager-dmDrop-04: Drop Happened OK!!" + end + else nop --say "DragManager-dmDrop-05: Drop Did Not Occur." + end + + return + + + /*---------------------------------------------------------------------------- + list - A debug mehod that lists source and target dialogs on the console. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD list PUBLIC -- Debug method + say; say "=======================================" + say "DragManager Tables" + say "-------------------------------------" + say "Sources:" + --say "asking dlg =" dlg + do i over self~SourceDialogs + say "i =" i + items = self~SourceDialogs[i] + say "mouse = " items[1] + say "cursor = " items[2] + say "area = " items[3] + say "dialog = " items[4] + end + say "-------------------------------------" + say "Targets:" + arr = self~targetDialogs[dlg] + do i over self~targetDialogs + say "i =" i + items = self~TargetDialogs[i] + say "hwnd = " items[1] + say "dropArea = " items[2] + end + say "======================================="; say + +/*============================================================================*/ + + +/*============================================================================== + Human-Readable Strings (HRSdm) v00-01 23Jan12 + -------- + The HRSdm class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSdm PRIVATE -- Human-Readable Strings + ::CONSTANT badNoDropCursor "Error loading NoDrop Cursor, sys error code:" + ::CONSTANT badOkCursor "Error loading DropOK Cursor, sys error code:" diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/EventMgr.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/EventMgr.rex new file mode 100755 index 0000000..44b850e --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/EventMgr.rex @@ -0,0 +1,134 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: EventMgr.rex v01-00 11May13 + + Contains: class: "EventMgr" + + Description: The Event Manager records interest in events, and sends + notification messages when the event is triggered by receipt of + a "triggerEvent" message. + + Pre-requisites: None. + + Outstanding Problems: None reported. + + Changes: + 11May13: First Version. + +------------------------------------------------------------------------------*/ + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + EventMgr v01-00 09May13 + -------- + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + ::CLASS EventMgr PUBLIC + + ::ATTRIBUTE dirEvents PRIVATE + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + -- Initiated by the MVF object. + self~dirEvents = .directory~new + .local~my.EventMgr = self + return self + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD registerInterest PUBLIC + use strict arg event, object + -- Check if dir has an entry for this event yet + -- NOTE: In this version: + -- Multiple registrations by an object for same event NOT checked! + -- That means if it doesn't de-register, it gets multiple notifies! + if self~dirEvents[event] = .nil then do + --say "EventList-registerInterest-01: No event array for '"||event||"'" + arr = .array~new + self~dirEvents[event]=arr + end + --say "EventMgr-registerInterest-02: event= '" ||event||"' object = '"||object + arr = self~dirEvents[event] + if arr~hasItem(object) then nop -- no point in registering twice! + else arr~append(object) + return .true + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD triggerEvent PUBLIC + -- If event not registered, returns .false; else invokes "notify" on all + -- objects registered for the event and returns .true. + use strict arg event + --say "EventMgr-triggerEvent-01: event =" event + arr = self~dirEvents[event] + if arr = .nil then return .false -- event not registered. + else do + do i over arr + --say "EventMgr-triggerEvent-02: sending 'notify' for" event "to" i + i~notify(event) + end + return .true + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD deRegisterInterest PUBLIC + use strict arg event, object + -- Returns .false if event not registered or if object not registered; + -- else removes the object from the event array and returns .true. + use strict arg event, object + --say "EventMgr-deRegisterInterest-01: event =" event + arr = self~dirEvents[event] + if arr = .nil then return .false -- event not registered. + r = arr~removeItem(object) + if r = .nil then do -- object not found + return .false + end + return .true + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD list + say "EventMgr-list-01." + say "----Event-List---------------" + do i over self~dirEvents + arr = self~dirEvents[i] + str = "" + do j over arr + str = str||j||", " + end + say "Event '"||i||"':" str + end + say "-----------------------------"; say diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/GenericFile.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/GenericFile.rex new file mode 100755 index 0000000..6d27ceb --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/GenericFile.rex @@ -0,0 +1,274 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise08: GenericFile v02-00 24May13 + + Contains: class "GenericFile". + + Pre-requisites: None. + + Desription: A component that opens and reads a text file that has a specific + format. + Outstanding problems: None reported. + + Changes: + v01-00 + 21Jly12: First version. + 25Aug12: Moved file open from init method to a separate method. + 16Dec12: Trivial correction of a couple of comments. + 11Jan13: Commented-out 'say' instructions. + v02-00 + 24May13: Added inherit from the 'Component' mixin. + + Constraints: Format of each record must be: + recordId | field2 | field3 | .... | fieldn + Note that the RecordId or Key must be in the first column. + } +------------------------------------------------------------------------------*/ + +::REQUIRES "Support\Component.rex" + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + GenericFile v01-01 24Aug12 + ----------- + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS GenericFile PUBLIC INHERIT Component + + ::ATTRIBUTE fileHeaders GET PUBLIC -- a 1D array of column labels/headers + ::ATTRIBUTE fileHeaders SET PRIVATE + ::ATTRIBUTE fileRecords GET PUBLIC -- a 2D array of records + ::ATTRIBUTE fileRecords SET PRIVATE + ::ATTRIBUTE fileArray GET PUBLIC -- a 1D array of raw data from the file. + ::ATTRIBUTE fileArray SET PRIVATE + ::ATTRIBUTE fileAsDirectory GET PUBLIC -- a directory containing: + -- * headers: a 1D array + -- * records: a 2D array + -- * count: the number of records + ::ATTRIBUTE fileAsDirectory SET PRIVATE + + /*---------------------------------------------------------------------------- + Class Methods - none. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Instance Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + init - Given a filename and the number of columns in the file, loads the + fileinto attribute 'fileArray', a 1-dimensional array where each item + is a single "raw" file line or record. + Returns the number of records in the file (or, if unsuccesful at reading + the file, returns 0 (.false) if file doesn't exist, or -1 if no records + in the file. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init PUBLIC + expose columns recordCount fileArray filename + use arg filename, columns + dirFile = self~readFile(fileName, columns) + if dirFile = .false | dirFile = -1 then return .false + self~fileAsDirectory = dirFile -- store whole file in the attribute + self~fileHeaders = dirFile[headers] -- store fileHeaders in the attribute + self~fileRecords = dirFile[records] -- store fileRecords in the attribute + recordCount = dirFile[count] -- store no. records in the attribute + return recordCount + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + readFile - Given a filename and the number of columns, reads a file and + returns it in "fileAsDirectory" format. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD readFile PRIVATE + expose recordCount + use strict arg fileName, columns + recordCount = 0 + --say "GenericFile-readFile-01: fileName =" fileName "columns =" columns + file = .stream~new(filename) + --say "GenericFile-readFile-02: file~query(exists):" file~query("exists") + if file~query("exists") = "" then do + say "GenericFile-readFile-03: file" filename " does not exist." + return .false + end + recordCount = file~lines + if recordCount < 2 then do + recordCount = 0 + return -1 -- Problem - no records, only headers - or nothing!. + end + recordCount = recordCount - 1 -- Exclude columns headers line from the count. + arrRawfile = file~makearray -- read file into an array; each line is an array item + file~close + --say "GenericFile-readFile-04:" filearray~string + self~fileArray = arrRawFile -- (deprecated) store "raw" file array in attribute + + -- Now turn the raw file data into a directory: + -- (1) get a 1D array of column headers or "field labels": + fileHeaders = arrRawFile[1] + arrFileHeaders = self~parseLine(fileHeaders, columns) + self~fileHeaders = arrFileHeaders + -- (2) get a 2D array of field values from data records: + arrFileRecords = .Array~new + do i=1 to recordCount -- get a 2D array of file records + arrRecord = self~parseLine(arrRawFile[i+1], columns) + do j = 1 to columns + arrFileRecords[i,j] = arrRecord[j] + end + end + self~fileRecords = arrFileRecords + -- (3) Build a directory containing headers, records, and lines (or record count). + dirFile = .directory~new + dirFile[headers] = arrFileHeaders + dirFile[count] = recordCount + dirFile[records] = arrFileRecords + return dirFile -- Returns a directory containing the file and file info. + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + parseLine - parse text from file line and place into an array. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD parseLine PRIVATE -- returns a 1D array of fields + use strict arg line, columns + arr = .Array~new + do i=1 to columns + parse var line field "|" line + field = field~strip + arr[i] = field + end + return arr + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + list - Lists a file in raw form on the console. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD list PUBLIC + expose recordCount filename + if recordCount = 0 then do + return .false + end + say; say "GenericFile-list: records in File '"||filename||"'" + say self~fileHeaders + do i=1 to recordCount + say self~fileRecords[i] + end + return .true + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + getRecord - Given a "key", returns a directory containing the record data + associated with that key. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getRecord PUBLIC + -- Returns a directory containing the data for the record with the requested + -- key (dataKey). + expose recordCount columns + use strict arg dataKey + if dataKey = "" then return .false + --say "GenericFile-getRecord-01: dataKey=" dataKey + if recordCount = 0 then do + --say "GenericFile-getRecord: recordCount is zero - no records!" + return .false -- File empty or does not exist + end + + found = .false + do recordNo = 1 to recordCount + --say "GenericFile-getRecord-02: self~fileRecords dims:" self~fileRecords~dimension + recordId = self~fileRecords[recordNo,1] + --say "GenericFile-getRecord-03: recordId, dataKey = <"||recordId||">" "<"||dataKey||">" + if recordId = dataKey then do + found = .true; leave; + end + end + if \found then return .false -- Records exist, but specified record not found. + + dirData = .Directory~new + do j=1 to columns + header = self~FileHeaders[j] + dirData[header] = self~fileRecords[recordNo,j] + end + -- say "GenericFile-getRecord-04: Results:" + -- do i over dirData + -- say "'"||i||"' = '"||dirData[i]||"'" + -- end + --say "GenericFile-getRecord-05: record =" + return dirData + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + getFile - returns file as a directory, with indices 'headers', 'records', 'count'. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getFile PUBLIC + --say "GenericFile-getFile-01: self~fileAsDirectory =" self~fileAsDirectory + --do i over self~fileAsDirectory + --say "GenericFile-getFile-02 index & type =" i i~objectName + --end + --arrData = self~fileAsDirectory[records] + --say "GenericFile-getFile-03 - arrData =" arrData + --say "GenericFile-getFile-04 - arrData[1,1] =" arrData[1,1] + return self~fileAsDirectory + + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + ::METHOD update -- INCOMPLETE!!! + -- Given a record as a Directory, replaces the existing record with the + -- new data and writes the whole file to disk. + -- Returns .false (a) if a record with the provided key does not exist, or + -- (b) if values for all fields are not provided. + + expose recordCount columns fileArray fileName + use arg recordKey, dirRecord -- record key + new record + + -- Find the record: + do i=2 to recordCount + record = fileArray[i] + parse var record recordId . -- assume recordId is first column + if recordId = recordKey then do + found = .true; leave; + end + end + if \found then return .false -- Records exist, but specified record not found. + + -- found record is i'th. Now replace that array item with the new data: + currentRecord = fileArray[i] +---- This method is only opartially completed. !!!!!!!!!!!! + newrecord = "" + do j=1 to columns + --fileArray[i]field = + end + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/MessageSender.h b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/MessageSender.h new file mode 100644 index 0000000..8f5c4b5 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/MessageSender.h @@ -0,0 +1,14 @@ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define DLG_MESSAGESENDER 103 +#define IDC_MS_ERRORMSG 1000 +#define IDC_MS_CLEAR 1002 +#define IDC_MS_DATA 1010 +#define IDC_MS_REPLY 1011 +#define IDC_MS_SEND 1012 +#define IDC_MS_COMPONENT 1015 +#define IDC_MS_METHOD 1016 +#define IDC_MS_STORETARGET 1018 +#define IDC_MS_STOREMETHOD 1020 diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/MessageSender.rc b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/MessageSender.rc new file mode 100644 index 0000000..8b3ad36 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/MessageSender.rc @@ -0,0 +1,35 @@ +// Generated by ResEdit 1.5.11 +// Copyright (C) 2006-2012 +// http://www.resedit.net + +#include +#include +#include +#include "MessageSender.h" + + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +DLG_MESSAGESENDER DIALOG 0, 0, 262, 156 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_SYSMENU +CAPTION "Message Sender" +FONT 8, "Ms Shell Dlg" +{ + LTEXT "Target:", IDC_STATIC, 8, 17, 24, 8, SS_LEFT + LTEXT "Method:", IDC_STATIC, 8, 38, 27, 8, SS_LEFT + LTEXT "Data:", IDC_STATIC, 9, 60, 18, 8, SS_LEFT + EDITTEXT IDC_MS_DATA, 40, 55, 210, 35, WS_VSCROLL | ES_MULTILINE + LTEXT "Reply:", IDC_STATIC, 10, 101, 21, 8, SS_LEFT + EDITTEXT IDC_MS_REPLY, 40, 101, 210, 35, WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE + DEFPUSHBUTTON "Send", IDC_MS_SEND, 211, 15, 40, 14 + PUSHBUTTON "Clear", IDC_MS_CLEAR, 211, 35, 40, 14, WS_DISABLED + LTEXT "", IDC_MS_ERRORMSG, 13, 142, 225, 10, SS_LEFT + COMBOBOX IDC_MS_COMPONENT, 40, 15, 125, 15, WS_TABSTOP | CBS_DROPDOWN | CBS_HASSTRINGS | CBS_SORT + COMBOBOX IDC_MS_METHOD, 40, 35, 115, 30, WS_TABSTOP | CBS_DROPDOWN | CBS_HASSTRINGS | CBS_SORT + AUTOCHECKBOX "Store", IDC_MS_STORETARGET, 172, 17, 33, 8 + AUTOCHECKBOX "Store", IDC_MS_STOREMETHOD, 163, 36, 33, 9 +} diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/MessageSender.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/MessageSender.rex new file mode 100755 index 0000000..52827b9 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/MessageSender.rex @@ -0,0 +1,590 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise 08: MessageSender.rex v01-01 26Jun13 + + Contains: classes: "MessageSender", "HRSms" + + Message Sender is a test/debug/utility support class that enables a user to + send a message to a component and see what's returned. + + Pre-requisites: the Object Manager (objectMgr.rex). In addition, Message + Sender should be launched from some other dialog, since it + uses popupAsChild. + + Description: A sample Message Sender utility for sending messages to + components. Note that the messages that can be sent are probably + limited, since a full test has not been done. + + Outstanding Problems: None reported. + + Changes: + v01-00 07Jun12: First Version + 07Aug12: Changed self~execute() to popupAsChild. Launched via a menu + item in the Order Management dialog (OrderMgr.rex) + 14Jan13: Commented-out use of ViewMgr (ViewMgr function incomplete) + 05Feb13: Changed edit controls to comboboxes for Target and Method. + Provided for user add of methods and target components + (not saved over a dialog close). + 11Feb13: No change to function - minor tidy-up of a few comments. + 14Feb13: Correct text in the Help dialog. + v01-01 25May13: Added Event Manager to list of target objects. + 26Jun13: Added Drag Manager to list of target objects. + 03Jly13: Changed "Exercise07" to "Exercise08" for .h file folder. + + Description: + Target: className instanceName + Method: a single method name + Data: Either strings separated by "|" (will be sent as an array), or: + [name]value [name] value ... (will be sent as a directory), or: + space-separated strings (each is interpreted as a separate + attribute, so a parameter such as 'aaa bbb' cannot be sent + at least not in this version). + +------------------------------------------------------------------------------*/ + +.Application~addToConstDir("..\Exercise08\Support\MessageSender.h") + +::REQUIRES "ooDialog.cls" + + +::CLASS 'MessageSender' SUBCLASS rcDialog PUBLIC + + /*---------------------------------------------------------------------------- + Class Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + newInstance - class method to create a msg sender. */ + + ::METHOD newInstance CLASS PUBLIC + use arg rootDlg + --say ".MessageSender-newInstance." + dlg = .MessageSender~new("..\Exercise08\Support\MessageSender.rc", "DLG_MESSAGESENDER") --,,"MessageSender.h") + dlg~activate(rootDlg) + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + init + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose objectMgr eventMgr dragMgr + --say "MessageSender-init-01." + forward class (super) continue + objectMgr = .local~my.objectMgr + eventMgr = .local~my.eventMgr + dragMgr = .local~my.dragMgr + .local~my.MsgSender = self + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Activate - Shows the Dialog - i.e. makes it visible to the user. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate unguarded + expose rootDlg + use arg rootDlg + --say "MessageSender-activate-01." + self~popupAsChild(rootDlg, "SHOWTOP") --, ,"IDI_CUSTLIST_DLGICON") + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + initDialog - initialises the MessageSender + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + expose cbTarget cbMethod ecData ecReply btnSend btnClear stErrorMsg objectMgr - + chkStoreTarget chkStoreMethod arrTargets arrMethods + --say "MessageSender-initDialog-01." + cbTarget = self~newComboBox("IDC_MS_COMPONENT") + cbMethod = self~newComboBox("IDC_MS_METHOD") + ecData = self~newEdit("IDC_MS_DATA") + ecReply = self~newEdit("IDC_MS_REPLY") + stErrorMsg = self~newStatic("IDC_MS_ERRORMSG") + btnSend = self~newPushButton("IDC_MS_SEND") + btnClear = self~newPushButton("IDC_MS_CLEAR") + chkStoreTarget = self~newCheckBox("IDC_MS_STORETARGET") + chkStoreMethod = self~newCheckBox("IDC_MS_STOREMETHOD") + self~connectButtonEvent("IDC_MS_SEND","CLICKED",sendMessage) + self~connectButtonEvent("IDC_MS_CLEAR","CLICKED",clearEntries) + self~connectHelp(onHelp) + + errorFont = self~createFontEx("Arial Italic") + stErrorMsg~setFont(errorFont) + stErrorMsg~settext(.HRSms~helpMsg) + + -- Get id of ObjectMgr: + --objectMgr = .local~my.objectMgr + --say "MessageSender-initDialog-02 - objectMgr =" objectMgr + if objectMgr = .nil then do -- Check if ObjectMgr is present - .nil if not. + stErrorMsg~setText(.HRSms~prefix1||.HRSms~noObjectMgr) + btnSend~disable() + end + + arrTargets = .array~of("ObjectMgr The","EventMgr The","PersonModel PA150") + arrMethods = .array~of("showModel","query","list") + do i over arrTargets + cbTarget~add(i) + end + do i over arrMethods + cbMethod~add(i) + end + + return + + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + Event Handler Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + sendMessage - Sends a message to the specified component. + Returns .false if error found. + Note 1: the return from the target object must be either a bool + or a directory. (Later versions may add array and string). + Note 2: The "parseData" method displays any error messages + resulting from errors in the data provided by the user. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD sendMessage + expose objectMgr eventMgr ecReply stErrorMsg btnClear chkStoreTarget - + chkStoreMethod cbTarget cbMethod arrTargets arrMethods + --say; say "---------------------------------------------------------" + --say "MessageSender-sendMessage-01." + ecReply~setText("") -- Clear any reply data from previous requests. + --error = .false -- if true, indicates error in data provided. + message = self~parseData -- data is a directory, array, string; .false if error. + + if message = .false then do -- if errors found in the data. + --say "MessageSender-sendMessage-02: message =" message + btnClear~enable() -- allow user to clear entries. + chkStoreTarget~uncheck; chkStoreMethod~uncheck + return .false + end + if message = "special" then do -- message to ObjectMgr has been dealt with. + btnClear~enable + chkStoreTarget~uncheck; chkStoreMethod~uncheck + return .true + end + + -- Get the component ID (object ref) from the Object Manager: + componentRef = objectMgr~getComponentId(message["class"], message["instance"]) + if componentRef = .false then do + chkStoreTarget~uncheck; chkStoreMethod~uncheck + ecReply~setText(.HRSms~rc||" "||componentRef) + stErrorMsg~setText(.HRSms~prefix1||" "||.HRSms~noObject) + btnClear~enable + return .false + end + + -- Send the Message and Display the response: + --say "MessageSender-sendMessage-03: message[data] =" message["data"] + response = sendMsg(componentRef, message["method"],message["data"]) + select + when response = "SendMsg - Syntax Error" then do + chkStoreTarget~uncheck; chkStoreMethod~uncheck + stErrorMsg~setText(.HRSms~noResponse) + btnClear~enable + return + end + when response = "SendMsg - No Method" then do + chkStoreTarget~uncheck; chkStoreMethod~uncheck + stErrorMsg~setText(.HRSms~noTgtMethod) + btnClear~enable + return + end + when response = .false then do + chkStoreTarget~uncheck; chkStoreMethod~uncheck + ecReply~setText(.HRSms~rc||" "||response) + return + end + + when response~isa(.String) then do + ecReply~setText(response) + end + when response~isa(.Directory) then do + replyText = "" + do i over response + replyText = replyText||i||":" response[i]||"; " + end + ecReply~setText(replyText) + end + otherwise do + ecReply~setText(.HRSms~noDir1 response .HRSms~noDir2) + end + end + btnClear~enable + -- say "MessageSender-sendMessage-04: response =" response + + -- Message sent successfully - so now action the checkboxes: + self~storeEntry(cbTarget, chkStoreTarget) + self~storeEntry(cbMethod, chkStoreMethod) + + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + storeEntry - Store a new item in either Target or Method comboboxes if a + checkbox has been checked. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD storeEntry PRIVATE + use strict arg comboBox, checkBox + --say "MessageSender-storeEntry-01." + if checkBox~getCheckState = "CHECKED" then do + newItem = comboBox~getEditControl()~getLine(1) + ix = comboBox~find(newitem) -- case-insensitive find + if ix = 0 then do -- if item not found, then add it. + comboBox~add(newItem) + end + checkBox~uncheck() + end + return + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + clearEntries - Clear user entries and error messages. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD clearEntries + expose cbTarget cbMethod ecData ecReply stErrorMsg btnClear + cbTarget~setText("") + cbMethod~setText("") + ecData~setText("") + ecReply~setText("") + stErrorMsg~setText("") + btnClear~disable + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + onHelp - Display help. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD onHelp + cr = .endOfLine + msg = .HRSms~help2||cr||.HRSms~help3||cr - + ||.HRSms~help4||cr||.HRSms~help5||cr - + ||.HRSms~help6||cr||.HRSms~help7||cr - + ||.HRSms~help8 + title = .HRSms~help1 + buttons = "OK" + --ans = MessageDialog(msg, 0, title, "OK", "INFORMATION") + ans = MessageDialog(msg, self~dlgHandle, title, "OK", "INFORMATION") + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Application Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + parseData - Check the message info provided by the user. + + Required data formats are: + Target component: "class instance". Allowed are: multiple spaces between + "class" and "instance"; leading spaces before "class". (Later version may + provide for class messages). + Method: a method name - a single string, e.d. "doThat". Any leading or + trailing spaces are removed. + Message Parameters: A string, and array, or a directory, as follows: + String, e.g.: "AB123, Joe Bloggs Inc., 124.50" The first non-white-space + character must not be "[" or "|", as these characters are used to decide + whether the data format is string, array or directory. + Array, e.g.: "| AB123 | Joe Bloggs Inc. | 124.50 " + The separator between elements is "|". Leading and trailingspaces are + removed from each array item. Thus the result of the above example would + be: "AB123|Joe Bloggs Inc.|124.50". + Directory, e.g.: "[CustNo] AB123 [Name] Joe Bloggs Inc. [Debt] 124.50". + The indices are in square brackets. Leading and trailing spaces of both + indices and items are removed. + Returns: + If no errors found, this method returns the message data in the directory + "message". This has four indexes: "class", "instance", "method", "data". + If format errors are found, a message is displayed, and .false is returned. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD parseData + expose cbTarget cbMethod ecData stErrorMsg objectMgr eventMgr dragMgr rootDlg + stErrorMsg~setText("") -- remove any previous error message. + --say; say "MessageSender-parseData-01." + message = .Directory~new + + -- get target component name: + --target = cbTarget~getText(1) + target = cbTarget~getEditControl()~getLine(1) + --say "MessageSender-parseData-02 target =" target + parse var target class instance + targetError = .false + if class = "" | instance = "" then targetError = .true + else do + message["class"] = class~strip; + message["instance"] = instance~strip + end + + -- get Method/Message Name: + targetMethodError = .false + targetMethod = cbMethod~getEditControl()~getLine(1) + --say "MessageSender-parseData-03 targetMethod =" targetMethod + if targetMethod~words \= 1 then targetMethodError = .true + else message["method"] = targetMethod~strip + + -- Special Treatments: + if message["class"] = "ObjectMgr" & message["instance"] = "The" then do + -- Only List and ShowModel allowed (at present). + --say "MessageSender-parseData-04: msg to ObjectMgr." + method = message["method"] + method = method~upper + select + when method = "LIST" then do + objectMgr~list + return "special" + end + when method = "SHOWMODEL" then do -- assume data is a string + modelName = ecData~getLine(1) + parse var modelName modelClass " " modelInstance + modelClass = modelClass~strip; modelInstance = modelInstance~strip + --say "MessageSender-parseData-05: ViewMgr~parentOffsetDialog = self." + -- Setup self as "Parent" dialog for offsetting the view to be shown + --(do it here because other components may have done it previously): + .local~my.ViewMgr~parentOffsetDlg = self + -- Now show the model: + --say "MessageSender-parseData-06: objectMgr~showModel." + r = objectMgr~showModel(modelClass, modelInstance, rootDlg) + --say "MessageSender-parseData-07: return =" r + return "special" + end + otherwise do + --say "MessageSender-parseData-08:" method "is invalid." + targetMethodError = .true + --return .false + end + end + end + if message["class"] = "EventMgr" & message["instance"] = "The" then do + method = message["method"] + method = method~upper + if method = "LIST" then do + eventMgr~list + return "special" + end + else do + targetMethodError = .true + return .false + end + end + if message["class"] = "DragMgr" & message["instance"] = "The" then do + method = message["method"] + method = method~upper + if method = "LIST" then do + dragMgr~list + return "special" + end + else do + targetMethodError = .true + return .false + end + end + +-- Following Code does not work - left here in case needed in any following exercises. +/* else do + --say "MessageSender-parseData-01d." + if message["class"] = "ViewMgr" & message["instance"] = "The" then do + method = message["method"] + method = method~upper + if method = "SHOWMODEL" then do + modelName = ecData~getLine(1) + parse var modelName modelClass " " modelInstance + modelClass = modelClass~strip; modelInstance = modelInstance~strip + .local~my.ViewMgr~parentOffsetDlg = self + -- Now show the model: + r = .local~my.ViewMgr~showModel(modelClass, modelInstance, rootDlg) + --say "MessageSender-parseData-01e: return =" r + return "special" + end + end + end +*/ + + -- Normal treatments: + + -- get Message Data, and put in an array, directory or string: + -- Note: ecData~lines returns 1 if control is empty(!). + msgData = "" + do i=1 to ecData~lines() + msgData = msgData||ecData~getLine(i) + --say "MessageSender-parseData-02: Data = '"||msgData||"'" + end + -- Everything now in a single text string. So now check the data type: + --say "chars = '"||msgData||"'" + msgData = strip(msgData) -- remove leading & trailing blanks. + if left(msgData,1) = "" then msgDataType = .false -- i.e. no data + else if left(msgData,1) = "[" then msgDataType = "dir" + else if left(msgData,1) = "|" then msgDataType = "arr" + else msgDataType = "str" + --say "msgDataType =" msgDataType; + + formatError = .false + Select + when msgDataType = .false then msgData = "" + + when msgDataType = "dir" then do + dirMsgData = .Directory~new + separators = msgData~countStr("["); closers = msgData~countStr("]") + if separators \= closers then formatError = .true + if \formatError then do + do i = 1 to separators + parse var msgData "[" index "]" msgData + parse var msgData item "[" + dirMsgData[index] = item~strip + end + message["data"] = dirMsgData + end + end + + when msgDataType = "arr" then do + arrMsgData = .Array~new + separators = msgData~countStr("|") + --say "No. Separators =" separators + msgData = msgData~substr(2) -- strip leading "|" + do i=1 to separators + parse var msgData item "|" msgData + item = item~strip + arrMsgData[i] = item + --say "item =" "'"||item||"'" + end + message["data"] = arrMsgData + end + + otherwise do -- msgDataType = "str" + message["data"] = msgData + end + end -- Select + + -- Check for errors: + errors = 0 + if targetError then errors += 1; if targetMethodError then errors += 1 + if formatError then errors += 1 + if errors = 1 then errortext = .HRSms~prefix1 + if errors > 1 then errortext = .HRSms~prefix2 + if errors > 0 then do + if targetError then errorText = errorText||.HRSms~badTarget + if targetMethodError then errorText = errorText||" "||.HRSms~badMethod + if formatError then errorText = errorText||" "||.HRSms~badData + stErrorMsg~setText(errorText) + return .false + end + + return message + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getObjectRef + expose objectMgr + use arg target + parse var target class "-" instance + ref = objectMgr~getComponentRef(class, instance) + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + sendMsg - a 'Send Message' Routine. v00-01 08May12 + -------- + This routine sends the message to the specified component instance. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::ROUTINE sendMsg + use arg targetObject, targetMethod, data + --say "MessageSender-sendMsg-01: targetObject targetMethod data =" targetObject targetMethod data + SIGNAL ON SYNTAX NAME catchIt1 + SIGNAL ON NOMETHOD NAME catchIt2 + msg = .Message~new(targetObject, targetMethod, i, data) + response = msg~send + --say "MessageSender-sendMsg-02: response =" response + return response + catchIt1: say "MessageSender-sendMsg-03: CatchIt1 - Syntax." + SIGNAL OFF SYNTAX + return "SendMsg - Syntax Error" + catchIt2: say "MessageSender-sendMsg-04: CatchIt2 - NoMethod." + SIGNAL OFF NOMETHOD + return "SendMsg - No Method" +/*============================================================================*/ + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + Human-Readable Strings (HRSms) v01-00 05May12 + -------- + This class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRSms PRIVATE + ::CONSTANT prefix1 "*** Error: " + ::CONSTANT prefix2 "*** Errors: " + ::CONSTANT badTarget "Invalid class or Instance name." + ::CONSTANT badMethod "Invalid method." + ::CONSTANT badData "Invalid data format." + ::CONSTANT noObject "Target component not found." + ::CONSTANT noTgtMethod "No such method in target component." + ::CONSTANT noResponse "Note: No response received from target object." + ::CONSTANT rc "Return Code:" + ::CONSTANT noObjectMgr "The Object Manager was not found. Cannot work without it." + ::CONSTANT noDir1 "Reply is a" + ::CONSTANT noDir2 "- cannot display with this version." + ::CONSTANT help1 "Formats for data parameters:" + ::CONSTANT help2 "Target: Class Instance - e.g. 'CustomerModel CU0003'" + ::CONSTANT help3 "Method: method name - e.g. 'query'" + ::CONSTANT help4 "Data: Formats for message data are:" + ::CONSTANT help5 " Directory: '[aaa] [bbb] [c cc]'" + ::CONSTANT help6 " Array: '|aaa|bbb|c cc'" + ::CONSTANT help7 " String: 'aaa bbb'" + ::CONSTANT help8 "Note: a 'saved' target or method is not saved over a close." + ::CONSTANT helpMsg "Press F1 for help on allowable data formats." +/*============================================================================*/ + + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/Model.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/Model.rex new file mode 100755 index 0000000..f0bf6f0 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/Model.rex @@ -0,0 +1,187 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + Exercise08 + + Support - Model v02-00 24May13 + ---------------- + A superclass for the Model-View framework. + + v01-00 09Aug12: First version. + 11Jan13: Commented-out "say"s. + 31Jan13: Store model's data in 'myData'. + 27Feb13: Commented-out some "say" instructions. + v02-00 24May13: Added inherit from the 'Component' mixin. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::REQUIRES "Support\Component.rex" + +/*============================================================================*/ + +::CLASS 'Model' PUBLIC INHERIT Component + + ::ATTRIBUTE wantList CLASS PUBLIC -- for List subclasses + ::ATTRIBUTE myData + + /*---------------------------------------------------------------------------- + newInstance - must be invoked by subclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD newInstance CLASS PUBLIC + expose noDataError -- .true if data not found. + use strict arg instanceName + --say ".Model-newInstance-01: instanceName =" instanceName + -- Check that the model's Data object is up and running. If not, then return .false: + if noDataError = .true then return .false + -- Now get the name of the Data component (FredModel or FredListModel --> FredData): + -- Get my root name (i.e. the root name of the subclass): + className = self~objectName -- objectName for a class Foo is "The Foo class" + className = className~upper() -- When class name is in quotes, then it's mixed case. + -- Upper here to make everthing upper case for parse var. + -- Handling Forms: + -- If this is a "Form" then there's no data to get (the user will provide + -- the data). So just create the Form Model (e.g. Order Form) and return. + -- Assume that the instance name is the Form Number (e.g. for an OrderForm, + -- the Form Number will be the new Order Number). + p = className~pos("FORM") + if p > 0 then do -- if this is a "Form" component. + instData = .Directory~new + instData[formNumber] = instanceName + formObject = self~new(instData) + formObject~myData = instData -- store instance data for subclasses to access. + --say ".Model-newInstance-011: formObj, instanceName =" formObject||"," instanceName + return formObject + end + -- End of Handling Forms. + + -- If there's "LIST" in the name, then set "get all" for the file access + -- (as opposed to the default of "get 1 record") + getAllRecords = .false + p = className~pos("LIST") + if p > 0 then getAllRecords = .true + -- if there's a "LIST" in the name, strip it out 'cos an xListModel gets data from xData + parse var className . root1 "MODEL" . + parse var root1 root "LIST" + dataClassName = root||"Data" + --say ".Model-newInstance-02, dataClassName =" dataClassName + -- Get the id of Data component: + objMgr = .local~my.ObjectMgr + --say ".Model-newInstance-03: objMgr =" objMgr + myDataId = objMgr~getComponentId(dataClassName, "The") + if myDataId = .false then do -- if instantiation failed + say ".Model-newInstance-04: getting ID of Data Class failed." + noDataError = .true + return .false + end + -- Got my data id, now get data for this model instance. + -- But distinguish between Entity Models and List Models - the former needs + -- a single record, the latter a group of records. + -- say ".Model-newInstance-05a: getAllRecords =" getAllRecords + if getAllRecords then instData = myDataId~getFile() -- returns a 2D array + else instData = myDataId~getRecord(instanceName) -- a directory + -- say ".Model-newInstance-05b: array dimensions: =" instData~dimension + if instData = .false then return .false -- if ID (key) not found + -- All is well, then make new instance: + --say ".Model-newInstance-06: instData =" instData + id = self~new(instData) + id~myData = instData + --say ".Model-newInstance-07: instData =" id + return id + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + getInstanceName - For an "anonymous" instance only (e.g. CustomerList) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getInstanceName CLASS PUBLIC + expose anonInstanceName + if anonInstanceName = "ANONINSTANCENAME" then anonInstanceName = 1 + else anonInstanceName = anonInstanceName + 1 + return anonInstanceName + + + /*---------------------------------------------------------------------------- + query - returns a Model's data. + Standard protocol: + Accept a .nil, directory, array, or string of names (case-sensitive). + if .nil then return all fields; else return values for the names in + the directory, array, or string. String is assumed to be data + names separated by one or more spaces. + All returns are a Directory containing names and values. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD query PUBLIC + use arg dataNames + --say "Model-query-01: dataNames:" dataNames + dirReturn = .Directory~new + select + when dataNames = .nil | dataNames = "" then return self~myData + + when dataNames = "DATANAMES" then return self~myData + + -- Caller is requesting specific data items: + when dataNames~isa(.Directory) then do + --say "Model-query-02; dataNames =" dataNames + do i over dataNames + dirReturn[i] = self~myData[i] + end + end + + when dataNames~isa(.Array) then do + do i over dataNames + dirReturn[i] = self~myData[i] + end + end + + when dataNames~isa(.String) then do + dataNames = dataNames~strip + n = dataNames~countStr(" ")+1 + do i = 1 to n + parse var dataNames name " " dataNames + if name = " " then iterate -- ignore extraneous leading spaces. + dirReturn[name] = self~myData[name] + end + end + + otherwise return .false + end + + return dirReturn + +/*============================================================================*/ + + +/*============================================================================*/ diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/NumberOnlyEditEx.cls b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/NumberOnlyEditEx.cls new file mode 100644 index 0000000..9613851 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/NumberOnlyEditEx.cls @@ -0,0 +1,526 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * The NumberOnlyEditEx class extends the .Edit class to provide an edit + * control which restricts entry to decimal only, or signed decimal only, + * numbers. + * + * The NumberOnlyEditEx.cls file is meant to be included in any ooDialog + * program where this extension to the edit control is desired. The programmer + * needs to take 4 steps to gain the functionality of a signed decimal number + * only edit control: + * + * 1.) Require the NumberOnlyEditEx.cls file (this file.) + * + * ::requires 'NumberOnlyEditEx.cls' + * + * 2.) Invoke the initDecimalOnly() method on each edit control object that is + * to be a decimal number only edit control. If initDecimalOnly() is not + * invoked, the behaviour of the edit control is unchanged. + * + * editObject = self~newEdit(IDC_EDIT) + * editObject~initDecimalOnly(decimalPlaces, allowSign) + * + * arguments: + * + * decimalPlaces [optional] The number of decimal places allowed in the + * number. The default is 2. Specifying 0 + * decimal places is acceptable. + * + * allowSign [optional] If a sign character (+ or -) is allowed as the + * leading character of the number. The default + * is .false. Specify .true to allow a sign + * character. + * + * 3.) For each decimal only edit control, the character event must be + * connected to a method in the Rexx dialog object. + * + * editObject = self~newEdit(IDC_EDIT) + * editObject~connectCharEvent(onChar) + * + * 4.) In the connected character event handler, the message and its arguments + * must be forwarded on to the onChar() method of the edit control. The + * 6th argument to the event handler is the dialog control object where the + * character event occurred. That is the object the event must be forwared + * to. + * + * When the programmer connects the character event to a method named + * onChar, the event handler is simple: + * + * ::method onChar unguarded + * forward to (arg(6)) + * + * If the programmer chooses a different method name for the event handler, + * then he must be sure to forward to the onChar() method of the edit + * control: + * + * ::method myOwnMethodName unguarded + * forward message 'onChar' to (arg(6)) + * + * And of course there is no reason why the event handler can not be coded + * using the explicit arguments: + * + * ::method myOwnMethodName unguarded + * use arg char, isShift, isCtrl, isAlt, misc, control + * forward message 'onChar' to (control) + */ + + -- Extend the .Edit control by inheriting the .NumberOnlyEditEx mixin class. + + .Edit~inherit(.NumberOnlyEditEx, .EditControl) + +::requires 'ooDialog.cls' +::requires 'winsystm.cls' + +::class 'NumberOnlyEditEx' public mixinclass object + +-- Users of the signed decimal number only edit control must invoke +-- initDecimalOnly() first to assign decimal places and specify if the sign +-- character is allowed. Until this is done, there is no change to the +-- behaviour of the Edit control object. +::method initDecimalOnly + expose decimalPlaces signOk initialized clipBoard + use strict arg decimalPlaces = 2, plusMinus = .false + + if plusMinus~isA(.String), plusMinus~datatype('O') then signOk = plusMinus + else signOk = .false + + initialized = .true + clipBoard = .WindowsClipboard~new + +-- The onChar() method should be inovked at every character event. Returning +-- true allows the character, returning false disallows the character. When a +-- character is not allowed, an edit ballon is set with a message explaining to +-- the user why the character is not appearing when they type. +::method onChar unguarded + expose decimalPlaces initialized signOk + use arg char, isShift, isCtrl, isAlt, misc, control + + if \ var('initialized') then return .true + + if misc~pos("extended") <> 0, self~isExtendedKey(char) then return .true + + if char == 8 then return .true + if signOk, (char == 43 | char == 45) then return self~checkSign + if char == 46 then return self~checkDecimal + if char >= 48, char <= 57 then return self~checkDigit + + if isCtrl, \isAlt, \isShift then return self~checkControlKey(char) + + reply .false + self~charBalloon + + +/** checkDigit() + * + * Checks that the digit being typed, at the cursor position, is allowed. + */ +::method checkDigit private unguarded + expose decimalPlaces signOk + + text = self~getText + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + if signOk, cursorPos == 1 then do + c = text~left(1) + + if c == '-' | c == '+' then do + reply .false + self~showBalloon(.MT~NUM_TITLE, .MT~HAS_SIGN, "ERROR") + return + end + return .true + end + + if decimalPos == 0 then return .true + + if cursorPos <= decimalPos then return .true + + if text~length < (decimalPos + decimalPlaces) then return .true + + reply .false + + msg = self~decimalPlacesUsedMsg + self~showBalloon(.MT~NUM_TITLE, msg, "ERROR") + + +/** checkSign() + * + * Checks that the sign character being typed is allowed at the current cursor + * position. Note that this method is only invoked when the sign character is + * allowed. + */ +::method checkSign private unguarded + expose decimalPlaces + + text = self~getText + cursorPos = self~getCaretPos + + if cursorPos == 1 then do + if self~hasSign(text) then do + reply .false + self~showBalloon(.MT~SIGN_TITLE, .MT~HAS_SIGN, "ERROR") + return + end + + return .true + end + + reply .false + + decimalPos = text~pos('.') + if decimalPos <> 0 | decimalPlaces == 0 then msg = .MT~ONLY_NUMBER + else msg = .MT~ONLY_DECIMAL_NUMBER + + self~showBalloon(.MT~SIGN_TITLE, msg, "ERROR") + + +/** checkDecimal() + * + * Checks that the decimal point being typed is allowed at the current cursor + * position. + */ +::method checkDecimal private unguarded + expose decimalPlaces signOk + + text = self~getText + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + if decimalPlaces == 0 then do + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + return + end + + if decimalPos <> 0 then do + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + return + end + + if cursorPos == 1, signOk, self~hasSign(text) then do + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + return + end + + if text~length < cursorPos + decimalPlaces then return .true + + reply .false + self~decimalPointBalloon(decimalPos, cursorPos, text) + + +/** checkControlKey() + * + * Invoked for a control key combination (Ctrl-?). Anything other than Ctrl-V + * is automatically allowed. Ctrl-V is of course the paste operation. For + * Ctrl-V, we check that the result after pasting the text would be a valid + * signed decimal number, under the constraints for this object. If not, it + * is disallowed and a ballon set. + */ +::method checkControlKey private unguarded + expose clipBoard decimalPlaces + use strict arg char + + if char \== 22 then return .true -- Not Ctrl-V + + -- If there is no text data available we don't care, pasting it will not do + -- any harm. + if \ clipBoard~isDataAvailable then return .true + + pastedText = clipBoard~paste + + -- We have text to paste, need to check is the text acceptable, + -- and is it acceptable for where it will be placed. + text = self~getText + len = text~length + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + -- isValidDecimal() checks that the resulting text after inserting the pasted + -- text is valid. + if \ self~isValidDecimal(pastedText, text, cursorPos) then do + reply .false + self~pasteBalloon(pastedText, text, cursorPos) + return + end + + return .true + + +/** decimalPointBalloon() + * + * This method produces the proper balloon message text when a decimal point has + * been typed, but is not allowed at the current position. + */ +::method decimalPointBalloon private unguarded + expose decimalPlaces signOk + use strict arg decimalPos, cursorPos, text + + select + when cursorPos == 1 then do + if self~hasSign(text) then msg = .MT~HAS_SIGN + else if decimalPlaces == 0, signOk then msg = .MT~ONLY_WHOLE_SIGNED_NUMBER + else if signOk then msg = .MT~ONLY_SIGNED_NUMBER + else msg = .MT~ONLY_NUMBER + end + when decimalPlaces == 0 then do + msg = .MT~ONLY_WHOLE_NUMBER + end + when cursorPos <= decimalPos then do + msg = .MT~ONLY_NUMBER + end + when (decimalPos + decimalPlaces) > text~length then do + msg = .MT~ONLY_NUMBER + end + otherwise do + msg = self~decimalPlacesUsedMsg + end + end + -- End select + + self~showBalloon(.MT~DEC_TITLE, msg, "ERROR") + + +/** charBalloon() + * + * This method produces the proper balloon message when a character is typed. + */ +::method charBalloon private unguarded + expose decimalPlaces signOk + + text = self~getText + decimalPos = text~pos('.') + cursorPos = self~getCaretPos + + msg = .MT~ONLY_NUMBER + + select + when cursorPos == 1 then do + if self~hasSign(text) then msg = .MT~HAS_SIGN + else if decimalPlaces == 0, signOk then msg = .MT~ONLY_WHOLE_SIGNED_NUMBER + else if decimalPlaces == 0, \signOk then msg = .MT~ONLY_WHOLE_NUMBER + else if decimalPos == 0, signOk then msg = .MT~ONLY_SIGNED_DECIMAL_NUMBER + else if decimalPos == 0, \signOk then msg = .MT~ONLY_DECIMAL_NUMBER + else if signOk then msg = .MT~ONLY_SIGNED_NUMBER + else msg = .MT~ONLY_NUMBER + end + when decimalPlaces == 0 then do + msg = .MT~ONLY_WHOLE_NUMBER + end + when decimalPos == 0 then do + msg = .MT~ONLY_DECIMAL_NUMBER + end + when cursorPos <= decimalPos then do + msg = .MT~ONLY_NUMBER + end + when (decimalPos + decimalPlaces) > text~length then do + msg = .MT~ONLY_NUMBER + end + otherwise do + msg = self~decimalPlacesUsedMsg + end + end + -- End select + + self~showBalloon(.MT~CHAR_TITLE, msg, "ERROR") + + +/** pasteBalloon() + * + * This method produces the proper balloon message when text is pasted into the + * edit control that is not allowed. + */ +::method pasteBalloon private unguarded + expose decimalPlaces signOk + use strict arg pastedText, text, cursorPos + + if signOk then do + if decimalPlaces == 0 then msg = .MT~ONLY_PASTE_WHOLE_SIGNED + else msg = .MT~ONLY_PASTE_A_SIGNED decimalPlaces .MT~ONLY_PASTE_B + end + else do + if decimalPlaces == 0 then msg = .MT~ONLY_PASTE_WHOLE + else msg = .MT~ONLY_PASTE_A decimalPlaces .MT~ONLY_PASTE_B + end + + resultText = text~substr(1, cursorPos - 1) || pastedText || text~substr(cursorPos) + + -- Balloon text has to be less than 1023 characters. If we don't exceed that + -- length, we will show the incorrect text to the user. Otherwise we just + -- show the short message. Note that new line characters can be used to + -- format the balloon text. + len = msg~length + resultText~length + .MT~PASTED_A~length + .MT~PASTED_B~length + 8 + + if len < 1023 then do + msg ||= .endOfLine~copies(2) || .MT~PASTED_A || - + .endOfLine~copies(2) || '"'resultText'"' || - + .endOfLine~copies(2) || .MT~PASTED_B + end + + self~showBalloon(.MT~PASTE_TITLE, msg, "ERROR") + + +/** decimalPlacesUsedMsg() + * + * Convenience method to return the proper message for the situation where the + * allowable number of decimal places have been filled. + */ +::method decimalPlacesUsedMsg private unguarded + expose decimalPlaces + + if decimalPlaces == 1 then return .MT~ONLY_1_DECIMAL + else return .MT~ONLY_DECIMALS_A decimalPlaces .MT~ONLY_DECIMALS_B + + +/** isValidDecimal() + * + * Checks that the resulting text after the pasted text is inserted into text at + * the current position, results in a valid number using the current + * restrictions. Decimal places and sign allowed or not. + */ +::method isValidDecimal private unguarded + expose decimalPlaces signOk + use strict arg pasteText, text, cursorPos + + resultText = text~substr(1, cursorPos - 1) || pasteText || text~substr(cursorPos) + + -- Can't have any type of space character, tab, new line, etc.. + if resultText \== resultText~space(0) then return .false + + -- Eliminate obvious problems with decimals. + countDots = resultText~countStr(".") + if countDots > 1 then return .false + if decimalPlaces == 0, countDots > 0 then return .false + + -- Eliminate any problems with the sign character. + if signOk then do + if resultText~pos('-') > 1 | resultText~pos('+') > 1 then return .false + end + else do + if resultText~pos('-') <> 0 | resultText~pos('+') <> 0 then return .false + end + + + decimalPos = resultText~pos('.') + if decimalPos > 0 then do + if resultText~length - decimalPos > decimalPlaces then return .false + + -- Remove the decimal char so we can test for all digits. + resultText = resultText~changeStr('.', '') + end + + -- Remove the sign character if it exists. + if self~hasSign(resultText) then resultText = resultText~substr(2) + + -- Exponential notation can not be allowed. + if resultText~caselessPos('E') <> 0 then return .false + + if \ resultText~datatype('W') then return .false + + return .true + + +/** isExtendedKey + * + * Convenience method to test if the character, char, is an extended key we want + * to pass on to the edit control + */ +::method isExtendedKey private + use strict arg char + + if char >= 33, char <= 40 then return .true + if char == 45 | char == 46 | char == 8 then return .true + return .false + + +/** hasSign + * + * Convenience method to test if a text string starts with a sign (+ or -) + * character. + */ +::method hasSign private + use strict arg text + + c = text~left(1) + if c == '-' | c == '+' then return .true + return .false + + +/** getCaretPos() + * + * Returns the current caret (cursor) position of this edit control. + */ +::method getCaretPos private + return self~selection~startChar + + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ + Class: MT + + This class is used to provide constant character strings. The strings are + used for the balloon messages put up by the NumberOnlyEditEx mixin class. +\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ +::class 'MT' private +::constant CHAR_TITLE "Unacceptable Character" +::constant DEC_TITLE "Unacceptable Decimal Point" +::constant NUM_TITLE "Unacceptable Number" +::constant SIGN_TITLE "Unacceptable Sign Character" +::constant PASTE_TITLE "Unacceptable Pasted Text" + +::constant ONLY_NUMBER "You can only type a number here." +::constant ONLY_SIGNED_NUMBER "You can only type a number or the sign here." +::constant ONLY_DECIMAL_NUMBER "You can only type a number or the decimal point here." +::constant ONLY_SIGNED_DECIMAL_NUMBER "You can only type a number, the sign, or the decimal point here." +::constant ONLY_WHOLE_NUMBER "You can only type a number here. Only whole numbers are allowed." +::constant ONLY_WHOLE_SIGNED_NUMBER "You can only type a number or the sign here. Only whole numbers are allowed." + +::constant HAS_SIGN "You can not type here. The sign character is already in place." +::constant ONLY_1_DECIMAL "You can not type here. Only 1 decimal place is allowed." +::constant ONLY_DECIMALS_A "You can not type here. Only" +::constant ONLY_DECIMALS_B "decimal places are allowed." + +::constant ONLY_PASTE_WHOLE "You can only paste text here that produces a whole number." +::constant ONLY_PASTE_WHOLE_SIGNED "You can only paste text here that produces a signed whole number." +::constant ONLY_PASTE_A_SIGNED "You can only paste text here that produces a signed decimal number with" +::constant ONLY_PASTE_A "You can only paste text here that produces a decimal number with" +::constant ONLY_PASTE_B "or less decimal places." +::constant PASTED_A "Resulting text of:" +::constant PASTED_B "is not valid." diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/ObjectMgr.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/ObjectMgr.rex new file mode 100755 index 0000000..8ef9161 --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/ObjectMgr.rex @@ -0,0 +1,352 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide + + Support - ObjectMgr v01-01 06Jun13 + ------------------- + A singleton component that manages model objects. + + Should ensure that only one instance is created. This version doesn't. + + Provides an object reference given a class and an instance name. Stores these + in an "object bag", which is a table of classes, where each table item is a + table of instance names, the item being the object reference. + + Interface ObjectMgr { + bool init + cmptId getComponentId( in string className, in string instanceName ) + bool addCmptRef( in string className, in string instanceName, in objref cmptRef ) + void list( ) + bool showModel( in string modelClass, in string modelInstance ) + } + + Changes: + v01-00 23Apr12: First version. + 11Jan13: Commented-out 'say' instructions. + 21Jan13: Make 'addView' private and 'removeView' explicitly public. + Minor typos in comments corrected. + v01-01 06Jun13: Added methods 'modelClassFromView and 'modelIdFromView - + given a view (a dialog), which return the model class name + and model object id respectively. Purpose: to support + Drag/Drop. + + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + +call "RequiresList.rex" + + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================*/ +::CLASS 'ObjectMgr' PUBLIC + + ::ATTRIBUTE objectBag PRIVATE-- a bag of objects - i.e. instances of Distributed + -- Components or DCs. + + /*---------------------------------------------------------------------------- + init - initialises the ObjectManager + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + expose objectBag viewBag + --say "ObjectMgr-init. Classes:" .CustomerModel .CustomerData .CustomerView + .local~my.ObjectMgr = self + objectBag = .directory~new -- holds "class-inst" "id-ViewName" + viewBag = .directory~new -- holds view class and latest view instance. + return .true + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + getComponentId - Returns a Component Id if it's in the ObjectBag, + else calls doNewInstance to get id, else returns .false. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD getComponentId PUBLIC + expose objectBag + use strict arg className, instanceName + className = className~upper; instanceName = instanceName~upper + --say "ObjectMgr-getComponentId-00: className =" className "instanceName =" instanceName + ObjectName = className||"-"||instanceName + if objectBag~hasIndex(objectName) then do -- if class-instance already registered: + --say "ObjectMgr-getComponentId-01: Class Found:" objectName + arr = objectBag[objectName] -- Get info array for this class-instance. + componentId = arr[1] + return componentId -- return component id + end + -- If we've got to here, then there's no id stored. So go get one: + componentId = self~doNewInstance(className,instanceName) + --say "ObjectMgr-getComponentId-03: componentId =" componentId + if componentId = .false then return .false -- Bad object name + self~addComponentId(className,instanceName,componentId) + return componentId + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + + + /*---------------------------------------------------------------------------- + doNewInstance - Instantiates the requested object and returns the object id + (aka component id). If class not found, or class returns + .false to ~newInstance, then returns .false. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD doNewInstance PRIVATE + use strict arg className, instanceName + SIGNAL ON NOMETHOD NAME catchIt + interpret "componentId = ."||className||"~newInstance("||"'"||instanceName||"'"||")" + --say "ObjectMgr-doNewInstance-01: componentId =" componentId + -- add to object bag: + return componentId + catchIt: + say "ObjectMgr-doNewInstance-02: component" className instanceName "not found." + return .false + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + + + /*---------------------------------------------------------------------------- + addComponentId - Adds an Instance of a Class to the Object Bag. + If instance already exists, return .false + Format of ObjectBag (note - directory indices are case-sensitive, i.e. + if entry is created with index "AbC" then 'say dir["ABC")' may return nil. + + +---------------------------------+ + | Index | Item (an Array) | + +---------------------------------+ + | | | View | + | Class-Inst | objId | Class-Inst | + |---------------------------------| + | PersM-AB12 | x'12' | PersV-1 | + |- - - - - - |- - - -|- - - - - - | + | PersM-CD34 | x'5A' | .nil | + |- - - - - - |- - - -|- - - - - - | + | PersV-1 | x'7B' | .nil | + |- - - - - - |- - - -|- - - - - - | + | | | | + +---------------------------------+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::method addComponentId PRIVATE + expose objectBag + use strict arg className, instanceName, componentId + --say "ObjectMgr-addComponentId-01:" classname instancename componentId + objectName = className||"-"||instanceName + arr = .Array~new + arr[1] = componentId + arr[2] = .nil -- Space for a View Name ('class-inst') + objectBag[objectName] = arr + --self~list + return + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + + + /*---------------------------------------------------------------------------- + showModel - Shows a view of a model. Lacking a config file that links + model class to one or more View classes, we heroically assume + that all models are called "xxxModel" and its View is called + xxxView. Assume only one View per Model. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showModel PUBLIC + expose objectBag + use arg modelClass, modelInstance, parentDlg + --say "ObjectMgr-showModel-01a - modelNames:" modelClass modelInstance + --say "ObjectMgr-showModel-01b - parentDlg: " parentDlg + --say "ObjectMgr-showModel-02 - modelClass: '"||modelClass||"'; modelInstance: '"||modelInstance||"'" + -- If this is an "anonymous" component (instance name "A"|"a"), ask its + -- class object for an instance name: + if modelInstance = "A" | modelInstance = "a" then do + anonModelClass = "."||modelClass + interpret "modelInstance = "||anonModelClass||"~getInstanceName" + --say "ObjectMgr-showModel-02 - modelInstance: " modelInstance + end + modelId = self~getComponentId(modelClass, modelInstance) + --say "ObjectMgr-showModel-03 - modelId:" modelId + if modelId = .false then do + say "ObjectMgr-showModel-03b: Model" modelClass modelInstance "could not be found." + return .false + end + + -- Check if View exists - if so, surface it: + modelName = modelClass||"-"||modelInstance + modelName = modelName~upper + arr = objectBag[modelName] + viewName = arr[2] + --say "ObjectMgr-showModel-03c: ViewName =" viewName + if viewName \= .nil then do -- if view exists + arr = objectBag[viewName] + viewId = arr[1] + viewId~show("SHOWTOP") -- if minimized, doesn't work. + viewId~show("NORMAL") -- if hidden, doesn't work + return .true + end + + -- View does not exist - so construct the view name and send the class a + -- newInstance(modelId, parentDlg). + parse var modelClass root "Model" + viewClass = root||"View" + viewClassId = "."||viewClass + --say "ObjectMgr-showModel-04: viewClassId =" viewClassId + interpret "targetObject =" viewClassId + --say "ObjectMgr-showModel-05: parentDlg =" parentDlg + msg = .Message~new(targetObject, "newInstance", "I", modelId, parentDlg) + --say "ObjectMgr-showModel-06: Class is:" .CustomerView .ObjectMgr + viewId = msg~send + --say "ObjectMgr-showModel-07 - viewId:" viewId + + self~addView(modelClass, modelInstance, viewClass, viewId) + --self~addView(modelClass, modelInstance, "CustomerView", viewId) + return .true + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + modelIdFromView - Returns the model for a given view. + (Added to support drag/drop) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD modelIdFromView PUBLIC + expose objectBag + use strict arg viewId + parse var viewId . viewClassName + --say "ObjectMgr-modelIdFromView-01: viewName =" viewClassName + viewInstanceName = viewId~identityHash + searchClassInst = viewClassName||"-"||viewInstanceName + do label myLoop i over objectBag + arr = objectBag[i] + viewClassInst = arr[2] + if viewClassInst = searchClassInst then do + modelId = arr[1] + leave myLoop + end + end myLoop + --say "ObjectMgr-modelIdFromView-02: modelId =" modelId + return modelId + + /*---------------------------------------------------------------------------- + modelClassFromView - Returns the class name of the model for a given view. + (Added to support drag/drop) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD modelClassFromView PUBLIC + expose objectBag + use strict arg viewId -- the object id of a View dialog. + modelName = .nil + parse var viewId . viewClassName + --say "ObjectMgr-modelClassFromView-01: viewName =" viewClassName + viewInstanceName = viewId~identityHash + searchClassInst = viewClassName||"-"||viewInstanceName + do label myLoop i over objectBag + arr = objectBag[i] + viewClassInst = arr[2] + if viewClassInst = searchClassInst then do + modelName = i + leave myLoop + end + end myLoop + parse var modelName className "-" . + --say "ObjectMgr-modelClassFromView-02: modelName, className =" modelName||"," classname + return className + + + /*---------------------------------------------------------------------------- + addView - Adds a View to the ObjectBag. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD addView PRIVATE + expose objectBag --viewBag + use strict arg modelClass, modelInstance, viewClass, viewId + --say "ObjectMgr-addView-01." + -- Get view's instanceName + viewInstance = viewId~identityHash + + -- First, add View name to arr[2] of Model's entry in ObjectBag: + modelName = modelClass||"-"||modelInstance + modelName = modelName~upper() + viewClass = viewClass~upper() + viewName = viewClass||"-"||viewInstance + arr = objectBag[modelName] + arr[2] = viewName + -- Now add the View to the ObjectBag: + self~addComponentId(viewClass, viewInstance, viewId) + --say "ObjectMgr-addView-02: list with new View class:" + --self~list + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + removeView - Removes a view from the ObjectBag. (Used by RcView & ResView.) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD removeView PUBLIC + expose objectBag + use arg viewClass, viewInstance + viewClass = viewClass~upper() -- View class was uppered in addView method. + viewClassInst = viewClass||"-"||viewInstance + --say "ObjectMgr-removeView-01: viewClassInst:" "'"||viewClass||"'" "'"||viewClassInst||"'" + r = objectBag~remove(viewClassInst) + --say "ObjectMgr-removeView-02: r =" r + do i over objectBag + arr = objectBag[i] + if arr[2] = viewClassInst then arr[2] = .nil + end + --say "ObjectMgr-removeView-03: ObjectBag List:" + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*----------------------------------------------------------------------- + list - Produces a list on stdout of the classes and their Instances + that are in the Object Bag. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ + ::METHOD list PUBLIC + expose objectBag viewBag + say; say "Object Bag List:" + say " ----------------------------------------------------------------------------" + say " Class-Instance Model Id ViewClass-Inst" + say " ------------------------ ------------------------ ------------------------" + do name over objectBag + arrItems = objectBag[name] + viewClass = arrItems[2] + if viewClass = .nil then viewClass = ".nil" + modelId = arrItems[1] + --say "ObjectBag-list-01: ModelID =" modelId ";" modelId~objectName + say " " name~left(25) modelId~objectName~left(25) viewClass~left(25) + end + say " ----------------------------------------------------------------------------" + say + /*say; say "Latest View Instances:" + say " View Class Instance" + say " ------------------------- ---" + do viewClass over viewBag + viewNo = viewBag[viewClass] + say viewClass~left(25) viewNo~right(7) + end + say + */ + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/View.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/View.rex new file mode 100755 index 0000000..cde9acc --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/View.rex @@ -0,0 +1,363 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/* ooDialog User Guide - Support + Exercise 08: View.rex + + ViewMixin v01-02 18Jun13 + --------- + A mixin superclass for View components (part of the Model-View Framework). + + Contains: class: "ViewMixin" + + Description: A mixin superclass for all xxxView components. + + Pre-requisites: MVF. + + Outstanding Problems: None reported. + + Changes: + v01-00 12May13: First Version. + v01-01 06Jun13: Added drag/drop methods. Also store model id as an + attribute ('myModel') to save subclases having to do it. + Note - some drag/drop methods are there as catch-alls for + when a subclass does not implement them. Default action + still to be verified. + 18Jun13: Changed "drop" method to "dmDrop" and "pickup" to "dmPickup" + (both sent to DragMgr). + +------------------------------------------------------------------------------*/ + +::REQUIRES "ooDialog.cls" +::REQUIRES "support\Component" + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ViewMixin v01-00 13May13 + --------- + A mixin superclass for View classes. the Order Management dialog. Handles interest registration, + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +--::CLASS View SUBCLASS RcDialog PUBLIC +::CLASS View PUBLIC MIXINCLASS PlainBaseDialog + + ::ATTRIBUTE viewMgr + ::ATTRIBUTE objectMgr + ::ATTRIBUTE dragMgr + ::ATTRIBUTE myModel + + /*---------------------------------------------------------------------------- + initView - initialises the mixin instance - invoked from ??? + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --::method init -- Results in hang! + ::METHOD initView + --say "View-initView-01." + self~objectMgr = .local~my.ObjectMgr -- Needed to clear up when dialog closed. + self~viewMgr = .local~myViewMgr + -- Direct Manipulation: + self~dragMgr = .local~my.DragMgr + --say "View-initView-01: dragMgr =" self~dragMgr + + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + activate - must be invoked by subclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD activate UNGUARDED + expose viewClass viewInstance -- needed for tidy-up on close. + use arg modelId + -- Store model id for use by subclasses: + self~myModel = modelId + --say "View-activate-01: self =" self + -- Get View Instance name and View Class for tidy-up when dialog is closed. + viewInstance = self~identityHash + dlgName = self~objectName + parse var dlgName . viewClass + modelData = modelId~query + --say "View-activate-02." + return modelData + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + showModel - forwards to ObjectMgrloadList - for invocation by subclasses. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showModel + use strict arg modelClass, modelInstance, parentDlg + r = self~ObjectMgr~showModel(modelClass, modelInstance, parentDlg) + if r = .false then say "View-showModel - ObjectMgr returned .false." + return r + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + loadList - must be invoked by subclass. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --::METHOD loadList Wait till check out how do ShowModel for List. + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + leaving - invoked by ooDialog when a dialog closes. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD leaving UNGUARDED + expose viewClass viewInstance + --say "View-leaving-01. objectMgr =" objectMgr + self~objectMgr~removeView(viewClass, viewInstance) + self~dragMgr~removeDlg(self) -- closing, so tell DragManager + -- Note - we do not remove the Model. Should we? If so, not from here! + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Popup Offsets + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + setOffsetParent - set the parent dialog id for later offsetting of a child + dialog. + **** Note: This method not used in Exercise07. **** */ + ::METHOD setOffsetParent + use strict arg parentDlg + viewMgr = .local~my.ViewMgr + viewMgr~parentOffsetDlg = self + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + offset - offsets a "child" dialog from its "parent" dialog (i.e. the dialog + from which the child is "popped up"). + **** Note: This method not used in Exercise07. **** */ + ::METHOD offset + --say "RcView-offset-1." + offset = .local~my.ViewMgr~dlgOffset + parentDlg = .local~my.ViewMgr~parentOffsetDlg + popupPos = parentDlg~getRealPos + popupPos~incr(offset,offset) + self~moveTo(popupPos, "SHOWWINDOW") + self~ensureVisible() + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + initDialog - invokes offset. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD initDialog + say "ViewMixin-initDialog-01." + self~offset + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + Drag/Drop Methods + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*---------------------------------------------------------------------------- + dmSetAsSource - called by a view component to define itself as a drag source. + Typically invoked from subclass' initDialog method. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD dmSetAsSource PRIVATE -- DM setup method + -- Each source dialog should invoke this only once. + -- Invoking it more than once may well result in errors. + -- Note: a dialog may be both source and target. + expose mouse dmSourceControl sourceWin + use arg dmSourceCursorFile, dmSourceArea, dmSourceControl + if dmSourceCursorFile = .nil then do + say "View-dmSetAsSource-00:" .HRS~dmSrcNulCursor + return .false + end + --say "View-dmSetAsSource-01: dmSourceCursorFile, dmSourceArea, dmSourceControl:" + --say " '"||dmSourceCursorFile||"', "||dmSourceArea", "||dmSourceControl + + if dmSourceArea = "DMSOURCEAREA" then do -- set default pickup area + dmSourceArea = self~clientRect() + dmSourceArea~left += 10; dmSourceArea~top += 10; - + dmSourceArea~right -= 10; dmSourceArea~bottom -= 10 + --say "View-dmSetAsSource-02 - default pickup client area =" dmSourceArea + end + --else say "View-dmSetAsSource-03 - pickup client area =" dmSourceArea + + if dmSourceControl = "DMSOURCECONTROL" then do -- The source is a dialog. + --say "View-dmSetAsSource-04: source is a dialog." + sourceWin = self + mouse = .Mouse~new(sourceWin) + mouse~connectEvent('MOUSEMOVE',dmOnMove) + mouse~connectEvent('LBUTTONDOWN', dmOnLBdown) + mouse~connectEvent('LBUTTONUP', dmOnLBup) + --self~dragMgr~setSource(self, mouse, dmSourceCursorFile, dmSourceArea, .nil) + self~dragMgr~setSource(self, mouse, dmSourceCursorFile, dmSourceArea, self) -- *** + end + else do -- The source is a control (such as a ListView). + --say "View-dmSetAsSource-05: source is a control." + sourceWin = dmSourceControl + mouse = .Mouse~new(dmSourceControl) + mouse~connectEvent('MOUSEMOVE',dmOnMove) + mouse~connectEvent('LBUTTONDOWN', dmOnLBdown) + mouse~connectEvent('LBUTTONUP', dmOnLBup) + --self~dragMgr~setSource(self, mouse, dmSourceCursorFile, dmSourceArea, dmSourceControl) + self~dragMgr~setSource(sourceWin, mouse, dmSourceCursorFile, dmSourceArea, self) -- *** + end + --mouse~connectEvent('MOUSELEAVE', dmLeave) + --say "View-dmSetAsSource-06: source is:" sourceWin + + + return .true + + /*---------------------------------------------------------------------------- + dmSetAsTarget - called by a view component to define itself as a drag target. + Typically invoked from subclass' initDialog method. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD dmSetAsTarget -- DM setup method + -- Each target dialog should invoke this only once. + -- Invoking it more than once may well result in errors. + -- Note: a dialog may be both source and target. + expose dmIsTargetDlg + use arg dmDropArea + --say "View-dmSetAsTarget-01." + + if dmDropArea = "DMDROPAREA" then do -- set default. Better is to check the type. + dmDropArea = self~clientRect() + dmDropArea~left += 10; dmDropArea~top += 10; dmDropArea~right -= 30; dmDropArea~bottom -= 30 + end + + self~dragMgr~setTarget(self, self~hwnd, dmDropArea) + + return .true + + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ::METHOD dmOnLBdown + expose sourceWin + use arg keyState, mousePos + --say "View-dmOnLBdown-00; self, keystate, mousePos =" self||"," keystate||"," mousePos + info = self~dmGetItemInfo -- for listviews + if info = 0 then nop --say "View-dmOnLBdown-01 - info is zero." + + else do + nop --say "View-dmOnLBdown-02; info, sourceWin =" info||"," sourceWin + -- store the info somewhere - how about "drag data"?. + -- Drag data = classname, instance name. + end + --self~DragMgr~dmPickup(self, keyState, mousePos, dragData) - not right yet + self~DragMgr~dmPickup(sourceWin, keyState, mousePos) -- pre-listview + return 0 + + ::METHOD dmGetItemInfo -- Dummy method for when sublcass does not + -- implement it. + return 0 + + + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ::METHOD dmOnMove + expose sourceWin + use arg keyState, mousePos + --say "View-dmOnMove: self, sourceWin =" self||"," sourceWin + self~dragMgr~moving(sourceWin, self, keystate, mousePos) + --say "View-dmOnMove" + return 0 + + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ::METHOD dmOnLBup + use arg keyState, mousePos + --say "View-dmOnLBup-01; self =" self + self~dragMgr~dmDrop(self, keyState, mousePos) + --return r -- throws error, as done no return at all. + return 0 + say 'DMSource-onLButtonUp: the mouse is at ('mousePos~x',' mousePos~y') with these qualifiers:' keyState + + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +/* ::METHOD dmNeverDrop + -- Invoked by a target object to prevent any drop (e.g. if a sales order is + -- complete and should not now be altered). The red/white target icon is + -- changed to grey. + expose dmTargetIconImage dmIcons dmTargetInactive + use arg dmTargetInactive + if dmTargetInactive then dmTargetIconImage~setImage(dmIcons[dmTgtInactiveIcon]) + else dmTargetIconImage~setImage(dmIcons[dmTgtReadyIcon]) +*/ + + ::METHOD dmQueryDrop + use arg dmSourceDlg, mousePos + --say "View-dmQueryDrop-01." + return .true -- Default is to accept the drop. + + ::METHOD dmDrop + use arg sourceDlg + --say "View-dmDrop-01." + return .true + +/* ::METHOD cancel + expose dmDragMgr + say "View-Cancel-01." + dmDragMgr~removeDlg(self) -- closing, so tell DragManager + return self~cancel:super +*/ +/* + ::METHOD ok + say "View-ok-01." + self~dragMgr~removeDlg(self) -- closing, so tell DragManager + return self~ok:super +*/ + + + /*---------------------------------------------------------------------------- + Event Management Methods. *** INCOMPLETE *** + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + --::METHOD triggerEvent + -- use strict arg event + -- idEventMgr = .local~my.EventMgr + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD viewDoIt + --say "View-viewDoIt-01." + + +/*============================================================================*/ + + + +/*============================================================================== + Human-Readable Strings (HRS) v00-01 13Jan12 + -------- + The HRS class provides constant character strings for user-visible messages. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +::CLASS HRS PRIVATE -- Human-Readable Strings + ::CONSTANT dmSrcNulCursor "View-dmSetAsSource - Error: Source Cursor is null." + ::CONSTANT dmTgtBadParam "View-dmSetAsTarget - Error: null dlg or null hwnd or both." + + diff --git a/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/ViewMgr.rex b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/ViewMgr.rex new file mode 100755 index 0000000..ccec9db --- /dev/null +++ b/modules/windows/oodialog/userGuide/exercises/Exercise08/Support/ViewMgr.rex @@ -0,0 +1,122 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2011-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/*////////////////////////////////////////////////////////////////////////////// + ============================================================================== + ViewMgr v01-00 13Feb13 + ---------- + A singleton component that manages Views and view-related function + such as Popup Offsetting. + + Changes: + v01-00 23Apr12: First version + 11Jan13: Comment-out 'say' instructions. + 13Feb13: Remove code not used. + = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +--::REQUIRES "ObjectMgr.rex" + +::CLASS 'ViewMgr' PUBLIC + + :: ATTRIBUTE dlgOffset -- A single number of dialog units by which a + -- child dialog is offset (vertically and + -- horizontally) from a parent. + :: ATTRIBUTE parentOffsetDlg -- The dialog from which a "child" dialog is + -- "popped up". + + /*---------------------------------------------------------------------------- + init - initialises the ViewMgr + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD init + --expose dlgOffset + --say "ViewMgr-init." + .local~my.ViewMgr = self + self~dlgOffset = 200 + return + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + /*---------------------------------------------------------------------------- + setPopupParent - Remembers the id of a parent dlg that is "popping up" + a child dialog. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD setPopupParent PUBLIC + use strict arg parentDlg -- the dialog id of the Parent View + self~parentDlg = parentDlg + say "ViewMgr-setPopupParent-01. Parent View =" parentDlg + + /*---------------------------------------------------------------------------- + offsetDlg - Calculates the desired position of a "child" dialog given + the dlg id of the "parent" dialog and offsets it from the + parent dialog by the "dlgOffset". + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +/* ::METHOD offsetDlg PUBLIC + use strict arg childDlg + say "ViewMgr-popupChild-01. Parent View, Child View:" parentDlg childDlg + parentPos = parentView~getRealPos + childPos = incr(dlgOffset, dlgOffset) + return +*/ + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + + + + /*---------------------------------------------------------------------------- + showModel - Surface a View. Uses the ObjectMgr to see if the view already + exists, and if so, to surface it; else the ObjectMgr causes the + required view to be created. + *** Note - Not supported by MessageSender in Exercise07. *** + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + ::METHOD showModel PUBLIC + use strict arg modelClass, modelInstance + say "ViewMgr-showModel-01: class / instance:" modelClass "/" modelInstance + -- Get the ObjectMgr to do the work: + dlg = .local~my.ObjectMgr~showModel(modelClass, modelInstance) + if dlg = .false then do + say "ViewMgr-showModel-02: bad response from ObjectMgr." + return .false + end + else do + --say "ViewMgr-showModel-03: good response from ObjectMgr." + return .true + end + + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +/*============================================================================*/ diff --git a/modules/windows/oodialog/wav/byebye.wav b/modules/windows/oodialog/wav/byebye.wav new file mode 100644 index 0000000000000000000000000000000000000000..41f4ce80e74e324271a79ca9fc561fbb04b1e0c1 GIT binary patch literal 44056 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/cancel.wav b/modules/windows/oodialog/wav/cancel.wav new file mode 100644 index 0000000000000000000000000000000000000000..3605b248fdc8db26776438c362864c563ee720be GIT binary patch literal 77238 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%0A2G@B;<8cw2l1 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 ZlwGQ=+}!LG%Y6fEb!fPgicVEM{|ma6LX-di literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/elephant.wav b/modules/windows/oodialog/wav/elephant.wav new file mode 100644 index 0000000000000000000000000000000000000000..104597be9f2cd802e44c145709eb8dc989226e8d GIT binary patch literal 75412 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 rgv0Z7BHq#P-Se@Lq(4l88GxmRXNnR6+Gmi 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/goat.wav b/modules/windows/oodialog/wav/goat.wav new file mode 100644 index 0000000000000000000000000000000000000000..78f98c29cd9007be922a3258895ebce949574820 GIT binary patch literal 79610 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 Kwi>t7y8j2`KQ?Lr literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/guess.wav b/modules/windows/oodialog/wav/guess.wav new file mode 100644 index 0000000000000000000000000000000000000000..29d199e9fb5050f40d28e04214d0b9fee22f135d GIT binary patch literal 68882 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

>-HPC#KRP`D%E|Y19=oyU*6$WIrP@DIV z1@wSTODn|7{Ut?6#1+bEA0xQA@eP)x6+s_l5pfy{&7YSs_aO!rA}9^Om42X)t|u0# z4TQF6i$DUvMS2h{6-7!P20S!U#FsOf=xnM-pH3H@$%0m4-v@vY$LJ*BFhaqj>}e#l zdMYvG7eunFv|&PS^)-z;`YSy;43N24&mjy@320!FuTer288BFchwk|TScpzr8y?T; zYgjr(9jj+Y%hBVn4$!rzJnYDzO~MSLU1u0 zgZhZKVbaha!eft#h>3{>@I}u*p}8s+_DygLC>z2ng(?~Dst^k`3V_fGP)xtn1tG8E zfJ$*>#cMQW+Jw54qn*^RMx!K2Pl@Vlm8ob*TYDMnP==B#pa2r+38pYKC6t1u+yKRs z`~f>)LqW=pFi@%r3bjVX(p*KrQ$VFE2!$5ZrYc&;S2BHP9LaV7-Eb%@L;%ga9_j$H zC8P>#@h_Eg*PrIKU0I7m3jXD;g2%fu*8+m31ZbXmy}q#26y!~QdEJ!l?XBc%B2WOe z#d@>NwEofFsPEr%`);QHt8%t|K9qM0=7!odh`c= z{zy?)-M&#^v{!%V`wj+wC}Ta_u4J8itK#O~29kBA5`@j=ANd7E{%oTBks{xF9CEE` z_JhYo!XG8%?|bEL3ABhmAxSCQk(v3qMYuoy`VZ(%F>NdU6Dr=yV!fNowc2QJ3CJ3l z{II6H(p-@Nz*9!uuUE;0o~o=H#I~x6;!-Pb*U!6Apz5S1LjVl6R2Y_6LGDITHTSCI z4TRCT*1rbd5}ko0PZ7RA<&zF2of3K4)MRTf{r1(UZ8Rb(vMHMWselFD;>uQ~=Bl(Q z*)r(N+XwG`Qx0XOA6e(3r%OH|Sfj9hvuM4(^ar`>ny;;@y+`@=v>vTL8+?+TJbAr& zwfQQ#-+`PSh@MD{@7xYV^zQ}3-Ou)>x_@1Md$Y~jK52pHd6T7x{KNe9-ZsD6lHU8K zPOIH6p%}Q%**;nWQBS;7s6#!Z3887=U%&Z>f7CnX383xEe78TXx!Mh5vg)z#LfTd! zgM>PQi(GF((u{Z7obub>0o)&qJ=#|118b++8jmNOZKG6|f4_Puu-eN)xfdzEKhZ~MxRyx(FU3|c%OUQ=k^%#at3@!fE1Q!)@b)^C#S zpO;O74n1wAsdmHY5F~k;4_V;Pd@!A%o}#BrZ1c1n+>#fE*_(6+x%NT(ZMIDYDk`Az zHhJVW!(A8?!i!$Rz@`A+XrTL1=21@N*peV?gmL80n+!#<_ETmgVg}?*#S+bG&9()v zFK^%S5pTN0v7N0hs|tRvMaTQ3rd)rNSZ&qN7E|a}=DgH?gucbZJGUs!;qzwiI$cUW z+I;VS+qH`E=7}#bTgsiHd;2Wtv={Gv|L|#Z-AK`U*?;6l1B4@MAZkEZ=L_2FtIdxV z^iBQkohHu@E;n!fyZrj8KqGxge~d=OjK3bGHd?A0Bw4znXtn(AI;kKOgS@hu*j&0e>;Qe~*&==}OlB1rGg({|$N1kLv&c literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/help.wav b/modules/windows/oodialog/wav/help.wav new file mode 100644 index 0000000000000000000000000000000000000000..86dca891c9f81a8d1e3ab29eaa2836297631ccba GIT binary patch literal 32828 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/horse.wav b/modules/windows/oodialog/wav/horse.wav new file mode 100644 index 0000000000000000000000000000000000000000..ff6ae5c5d2744bcd021a55d73861141e65d08325 GIT binary patch literal 94058 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 O{z7k&fkg(8f&UN3G{>+2 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/inst.wav b/modules/windows/oodialog/wav/inst.wav new file mode 100644 index 0000000000000000000000000000000000000000..ddc98a91dbfd49088a2d633edaad348d18636704 GIT binary patch literal 34806 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 b`uacr=lP##w-Y^yMa~o6WYT;3?5qC+-Pn|L literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/jackpot.wav b/modules/windows/oodialog/wav/jackpot.wav new file mode 100644 index 0000000000000000000000000000000000000000..5320fa84d37e7c8297d37dad1a3c8116ec3e169b GIT binary patch literal 65670 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∨(Y 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 K5?kls|NjF8R3h#G literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/moose.wav b/modules/windows/oodialog/wav/moose.wav new file mode 100644 index 0000000000000000000000000000000000000000..dc464de73db33a5afa147e40a84f3ef0ce9e0a16 GIT binary patch literal 62840 zcmeIbOK)6PmhYJt=)oQLCusEdxPueZ@c(`9dvE_wfBhdn_+PvK!+-z1?|tvz@$Y~9>+i+? zfA_tA&y^4E{4d@Aj{Sci=lgfMcifM^Ax$!UL$2>`|7j5zjYi|qpO%Gxc7^qy1a$guFrS?>c1Pvibkf$o&p}_C_VY z!5IE%y#M)E^luHFe{1so`CH(39DawuKMR3Bh%5g=i2k$0`>xRMfxx$<#&3ztmLQ{1 zQf2!)bZxdse0wL%HGh}BO$401|6`=z)iRT-?;Zesd%8gb`B(S9t4iL?%C|%1&9wjJ zUEQFuIrD3_AEk{OgDr{2TfVc z(7qi7+83;7JImJH-}~f^!|68FjsO-Y zXS2m}!A&p?P`x)A7Hk8WfPXX?^n3kYx7Y1-_V;$~+`jeBTW|g4U%vI$t#|M2?ss~N zm%sX_|Mq`;`RXTMe)*Gi_s-jIy>si2~{YK3lFYE-x>y zpFVwhwO%3={8kguCNz|=oseWW==XcQWOr|OcjqoF-+KG)cSvu&_0H`s!t9K$fBFCX zxBvRHXU{%=aW%aCHrL;I=Wb^-9rpJ3N2|-Li}lsZU;fvB{PmY#ynKE!8z}njo!dM6 zy?%FhX9u3a6`nsQy?B1LoDBPeL9e^Nw-3i1HiPkOb@}wg%NH-6J-tSzF*ZF6bArW4 zVcf->xe*4-L?U z?r=KQb!H-U_56!3fBmapeDVBxjYOUO{r$bY{oY{6ai`lC?~ChaFHBD_mt)i$XaUR+ zpPNpQ4Jua`7i+XPorovQa~b4Kpr76++X@Bq7>TF@0abN?iw)JH>07sM-@bF_Hdb-# z-FM#pi=E}GfBJv_>HqxouYUFA=d+!+-};Ncc<0vcXn|b}y2Hh4xmaC1`{}R$@gIKk zi_f3Iy)-*}dmug>2t7xW#ro>$^Ov7vO&5z1mf7v~;BY*dEoL)$8zaDKxm>PRkekRO z5|c3YDW}@90;O+j`UV_O=tcW-yUyWhd8JG1LAzWnJ=UcGwt{Aw}k z?r~{!;UOmw4!8 zOdvD(&GbUB7V0$ki}ebL0`YPWERc3E)Pd_I>EoQ~o${=W2uWxJYs8qi(t&$w2MlT$ zjPc5+&$Q2{mlt4UwWxjp|7&1dt=3wA94>`aQhg+t3b8@BBu!#A!D_=Bu@Ej~2Eq%( z1YO8M*DPUP*q8ULgy4h06IH@!)Czeb{KI1KFZalF=l1Q}NCDP&?_x}Mc6RrBz2V~G z#ZSNd@@HRs{`}cfeGIIjknw6bS*|aiDxxm>OgT)T9jqu27PF8G(^{w%Oo^=sDjLHR*1NmIf4oqw;A=hLkPY1qyH0eY&}2!F zd-nY4)djGPacBrmrbPX$f3{lV+@{O$&4o#RF`O`GJ=+XVpFMpRkurmR6(HmS{Ng8y zCBMZ~+{cA}v9d6rP=gJCf)d)00vonQiiXQ$eB4523XevZt3YZB3yf^NFkWi|{3B2c zqUYQM_G)b&(oWd{&^olTkPQkLN?2svRzo3D)k*PTE(1|onZ67wFh{gA-pMB1vGa&M zZiresozR5&^dKWQp^+M(gdCHFIEAeSFGLTq)O(wJHVvRjvFP8)&L55RfP$(9laKf;9qZ+C*DT@N7Z|Kh^rP8}X zq%_Fvsi+eL3aQ+eBja57NvI_>0QW@R2nB|NaQnMN-@61alyP~9Up%`e5tV3}RttO! zg+hKzSPDrqW|0GN0(Cv33WH8n4V-4|$s806o6@ROLE2L=uO&tb3B%wKBTY#Aiev!* zi;@xM(2J@e8b?Zb@S43n!q{E9MYIHlcYzmsLKGbY`)IRLF zZ_^{W{VpA*x8J?>?#^C+w7R}}ezn5Vp1%5teYlIoVoInY>xxI#r2 zFc>C9cnIW?A{eDQRh3D2b*G5Q1?M4+Xk_tbh#rDQyx}NP(J7b;K)~ZA4uUQfDOKtz z><)9IXM5*e68)50@4Wra+qZXnU9V7msxM-RXedv# z9<+K0#-;Q&%>#wek)iRV?JQ!w^R}Jfcj>-TpMBQJ#j`Jd^7->?ObfA|(@ZX@IUK}x z8-1)w3^t`tte$d%Loq{^H{& zXB=PBa$B-4_I#!;8 zZvT+<@L{KO5TWDX!TtMt4<9^uuzT-)#sGAEZsBO?ZD%kYPkTgr^yWy3p62zlXMg** zKm6qS;*s6{t0!o3HaR*v8iDtye|UU!eAFMGtUtOspAAPR^ZDfX@KF0Z9udb+=BSs8 zC#PrY$B(dx@#uIkIO;xpaDR92LH7uGX#p0fVQ!E6ldG#okJgVbE}zhwIvvkWuz|Ca z6Fhq|J2_pREf=TYdZZobT+uDX{Y_peNs%Ky8WMLtcn`(>;MT4G{8w-P<*hp(9336^ z-n)IfGrM^D@%el;>H2E4+ zA|4tNkB>FO2lqRjhb7T@=p7t%y9em)!NYF%J`nEQ>mJWmr?bJ~;laH--~a2k|MU0% z=0l9&2*>PB&abY{&rX+5u7Aj2;nioKTwi}g)Ar=!k3XTEyIh@~EY^=M5$uGtSe(xB z*MrV|(!&EG#hz^A5fSSnvZ6*0Y(`{Phcg}=A0J2HiP4c>JhR`0+CUenPfyJniOe|g zKr254!9&boA0rsfq%%A|M!ts+d%eSmHRjbR!Ps6M{xCQM64~3|zvlpWFvPMu-NW(h z6z&z`gzy2NVW>7}SJxjubrAIA>gprBa(yPwh5`LwcgJ{-)DTId5#W-#U94CXQ222~ zNXlfXXgeT5YeNHf>SlSiT0c5lX#=NoO~y*_f3k>|Ln%?DVn_uH1TvCxXZ42a?UY=3 zEslmqfkqUw*HjuXsZRiUj_`JzP^y?O&Q|c0{V6&su(ddyPLUaH9UtML;;)}7ZjZAA zTscB6whu<|>HJ5^j15r5$*JBLJ+xCIOHDDb2urD`6~4bp*y_LpmSe(T zYF-)3up`K@(cHK_2$gVO6awxT!$dO>)rxrpjWCUQC?TL~Zz{vGtX+7oR)l?!?8_+E zoH&sEnC8AF87a%vvj_?@3V@MUJL807oh2u~bOMsPK$e7NV+h`&v}seD4L!`Hn1yg; zaTCK{IoQYy8d zWCEw~Izf{*qnNlHXlGT)bjT8Mpu*AYB@Ra#b+XtNKA zH>aDUHnmE}hMxlYAM=xSH(_Lh$?)~`u z^6|-faY8?62%Ol|j2Y3%mg&c_xCgOAaA^k3Bj13|_>qKC9dju&Rp>P$pp zo16y^4w&=k9?++y4|s$CgTwyOF?~jqa@_B8gQm!tIr?ld)5=Jx)0?iIJbiNU=%ec= zkIx@Je)9DC>5I=kdwQ{?^(oBAsqX zjApCVM;~2(^0A|BCX}APc>a>P>LR^wA~Vvgp;*+|l%^ z3VoFt4MKV|C7f8J*`jA~exAb!1<}5OS_w3sI#O_)s-*d+Y~+Q4Ew8eH2p)9UV@ij< z7cD0JXQmC`zx_Agzjf;ePChfP`aT<1G@^oSotnjI+6b7kM z8zC9p3|i@!7>b<6T~o*u>Qzt5WI{ON1Kwn3#~C;!ySKah!QJ<6|IH8hcjx{0-hcN8 zZ~gW6Z@>4!&d$BwWcAVWmtXwsXaD6FKYsO@^9qm7&(6fo5P5V!kK4&Rtc$79=PzEo zc+SMB10qHZOotFj#=|}{_{_sFlk~8AfR$@}T9AzxT+SFT;Jf27GSfLDAZv^GAVQJo zXM13utH@Urt2D?{%tgr}835^wANC)19_)o=AH09}?g#Jh-n+;2$^N|$cRu84!o%!W zBK*Vt=w$Kuqfh_#M?e1QFMjdkm!C52Aa)MoG?%apDPx{7I(qT)<;&;KK7R7}jM0q` z6ZBPf-G|r-lNt{?NXZi@^?>GxRfISchG7Ri!DFJyx$zmJq?o&Kg30L%;4-kJ<;s9g zW_Q$*ksL-UV7L45q18tH41NywsaH-g*n=J|TJOPqChr~~Ge9`}bNt1)Oe)L0zKRzrd&{0FoDxe7&Rijrv9*db3yv~Ol)DWqU5ix@GDFH)JhvO#n|2C;Q@$#vXUf`2%@x9NS3}<0y|=&jfO(Vo>hblbpS}9KzkBuhXU_>u%w`66 z3fQE;o?1g}Oi-0%Jgqv`t`JyBNrmCe?oiKUJPo1rLM=JRopmf<>VQ)!N&?Esc`mzF|`kWT%C03d^j z8K|g2aSKWa1dR|os6Zk_u7$jBkXFq?SFuYqMJ1LaNhAePh!z%Yp%u6y1PJnD7-=F) zSadwsGD7lL^E#RpL$6-BflDxRE^qVkqe8^;tfAEDbY@-%`bROR|W;)SB-L(V4|lCxsP_m`q0kbd2n4p(sas{OP7so$X5-pM z8fC4i2$;L52<^9oM48U>r=;0g;5jPKBuVJhE|7);V+0dgSXvz(WZNLd6Nd;`cJfTt zNkw5^njVsdD%=&k%~D+1t0W|dC}q5hi8$xqFpd^T5LC- z%T$$yMp?vSrwBo5Lls6@tWjo|<)k5`8~BkuCFTR^;9!7;na0#;-{^l5^wAj8Zwy+1 zAZ9{j0j7{qW2b;IfE0Q)z(ruEaf7KeM zO)H%V*I=N{z5Ry=j4Yjh4_S(~!gq|1(b8+L7Z>N}5hyjYv&Hh%fpqk*or)qkM$I{% zXv68)&`<0iG4sLbE9Nrj4aQ^?lYR;qZP$4k?ZUC0$i*B~7(7zS1){cfrz9zy+wA-* zRHmxIRHDy3nQ-JeLzrZkO&X03Whlg!E-o(~UtT<7{+ixQC@^O}>A>N!q;NjC&=;8^ zaEfe9`|U6(nNbCyNh}+x4pT|l?FF;*b7hRQV0y3d(MlJCC?R*FEu|^4q~Gl`d7Azg zKA2uepPdyS$QH&@96w+?MRAWWo?Kmj^bs@vj~_oSnzI*9O!euyha@JyH7p0i0`2Vl zLk3BE`}ZHf1D!Ios(>lKQ^P2S0(1|ZHOVaU^5>iQ25&8W%7Wm@<@Ny3E{80E9Eb zf8=PCoju5fhaE7#&q!0b_Vzyf z@I$8aKltEoq#cJ&u|PtFY3f1E)+wYiUVi-X_4N}HCb`BUAF)}hDCVYltXS%zTj@M& z4z8FUc8ZgkmXa{UOvYIZ3kgqS^o4ma0TuumW|Du8R1Y0Q4>Ltci3CZ#ELuA4&!BjZ z5unz%zlWLJzfVuoUWiXKqp?P^>Rbkt7<(}MU^@Q-Lo`fg!q+gKn2l@dDjlutJX>$) zA&(1mUqVL}fN7%O6A4lmZgUDi#cPpH^<{&TsMvkeMV;p$MF265&=o~CVxg^gO`OGW zA*6EFiCOuWn?E^2ZP8%~g-1+E0~m}Id(RPHq$0r4_Yg^_TW_{G*(?yY*WRC;sQDiMmz^Q{U> zmK!Cx3O~WMT*7CB(Nr%6W!r~I#p9L?G*wik$iIeUDyi~Pv%khgD}R8vp_oU}e+n$p zVw(InDVe9%w%NC`dl+D=f+A$ID=Npp=%vYrG+Nf zy|-QUCUbMtP)iejO<7yYYf8OFxk~bN^>Hr=WTsSc^<+c7-W%Pv5R_mQ*%_lp0bAEh zDxfXdhAlI0&Ni}r)e(f0c#}4SZ(^5BCnuXKT1Q)Ta6PiN>^MR-8{2_2W0z()EmnI6 zme81y)7WWOgVa)SQ(Lf^cE45aoANe=sFZdMnv#VA97b%2sd8)1zgGUOL)*#ZaC4dS zB4O2|{%SNnX0EDCuFw!54$sP9wJ93P-1L<~P?ZtlWUeGFW8awMs|tYENUg-;l=KFH z7G{A$o(B!7M50LS8x1ysh9Z@b|B4trc{_d)8fsNAfwkHS#vLtJwjym{$hvNdSgzi@ z+>qWj+9FN8`^J4EN+sPWu92^$!R9bbRl5ntgZD;*vJm2h4&!!iZc2EQooX=DORw|B z-ExjZN#;#k-Q`WG5mCxb3T3@%LyQe7wWbnF*`;81T{4A)YS+Zwz`$hy2w*coEEW3HS`aDc;O!`adC!F>YyWX6jE5zLic*(_8n9g4F#4`QLuqsb#y4$W=r$HVEQ z&nhAY@sq)1!l;Z!f_7naG#nuf3szVMa@?QsaFV50^!TjPhoRha(S$rw)czh(l$nC@ zbj~`e>6E2d^l52R2tF*!@wxBmY#h$%ld0(hnPiu0Z3G#o@lYb3ggRG^y~`T|6@+HF z4kPhEfLxq;Om-iZMlhMpxkP6>nDB9`890YMW0#e1$RDbJ>0>&b2sh+m4?`;-`GizH z{fP;0DvW2=^C_(9b^K?59An5i69_z#XPD*?&93K6C|Uo8RI12CeZW7o9F_B*5h^6& z9vjxhL`H<-q-HW3c|v1~7sPU}`HDb8AqCSMd`<*Vqp`9O@{JXCVbIYr&vg4dit$S5 zs&+-gO6Ymh0kAfV4HY?BpxO5iYYbC#cj7}dlfxtT=_wi6MZ5|nzjE80%UyL9Gz!wb z$G}k5CmAurQ-?E5hA?E$A+|5Fa1+)7feDN8CTyS@0nXtu$w3C)vK)+t+S6Gy8jU*3 z$}h~<6*o2J`i0j+=vOv&flS!IQ^nyu} zGQf15UUR@~^7*Q38t4wk7?SndjQX9Gaggjdxr`;bPR}u9K!{QS0TR*?Bkc+ood(2} ztt#@ySTdvr)KR1|t;hi*6*0!MI#SqVu}Uo=kt@`!vns8sE2OQPkh-n798x>M7}Fj+ zedFb(oV{@_5s?`%`*=C#i5*JEgHxO%*o+FZ%2?nhsL;@$)r$OAh|HfLB-4da<%UY; z4vnTcQq*arn63)hB?JkLJ-p7dmR8#XoJ3SEl6Z3INw#2lRH3R@EhSE27)~zWqR2tO zh-teRWjB*tIqC)*v=TBF8so9DEf1Y>I(#Y5{^M?f4o zIBMCz2Id`(I$x`~VckUH$24^2tp;w{h7Hxll-WSLhuFa|m19#78^&p`>!QPqg?S zn3)yu!86{Vj7&N!f`qtk5@7O&_^hwe!ijZsr;s(>n!xTPnxqQkmII7%AA}bVFNHQW z>=F|_48#&;;ftFX7FOk5kJ7wwzA#0qoC$)@udaD`#Tx2l98xGc6Ug zc(&%;f^buTy;d>{1rqLNRs$&!mpB2tH{%o5fHjKq4|HCMG!1v-G$2+x^m{DdN&tkpBq1-r3#BbiU|~e!c?9RatJUd_ zFL;^hCoIh8E#z5mpO>EQ#^cbyorpK#ardPUfL*Mz^1X51P37(6M6S3XPsFt=9}rJ{ z6BNqvFh`B1N^Kp|stBSeO1o`Ari3a$*IS^1Yu-k31zKls2WGRe#k;~u>D!#l;+eZL zM1W<~;N!@!8?mNdeJ+-|`Ifpm6cC)oX@92tyRK6*^!V~*w>Ms1J{JaFWnNAOh`6)c z>HF@x-3bhRwmippKmqSs`l`7-0dO)9g$AM_<}opE7_!RK)n&e<7|(q&LzqrXLZ{v6 zzrhw(Lp||2RO5EoOsJP2U7AG0S6v~JI#wQ%mPPJ7H1g?L=ojJCInss12o1}=wr}Jh zw2o%+_BQW#zqnq{hP)EKx99U5V}-uWQ(_lGzI4?NBJ=t=WRWN9lRww%*rw&f@>qyf zaZVdV1T+fYFm5POFX}izjmRN-I()NWI%BVj&ah}bX~hm`$Zj-ISZY9dVa2TDqi2?{ z;qxMXyne_s&wT>U6<;QJ zx_|EjUxs2mC*FAHJs!L5-n&1TtUvke$3Oq&|Nis8`}FbIY~0y>e`oi8_aTe~t9&cK zRaSWN=e(mB-lG&CB(F4v3apjUHN{JH!Vt&%kwtl@i+r!zRey$Itx9K74qC|Kp9qAY zH7KDINXa|TYcll4`!V-?v-Q3Ac_|N3c)fMMJHp96`_a$;w;#QDf zK3lUa?v=~Lo`nEnL&A;|?a4G2F2th5XfSHiqX<}Td~Se8Si!vQ5{42KLIxd4k-SXG zKp9R5Jfwq%_v1A}o^XEf{_P*!y7kr%_Kq)K{_;1!`Q=YuetNMOcJ}Um_~C=z5%0b!$cVP3Kzkcghcm3*Dzy2jJIPzL! ztlJe1BK6&OZ{6PQ^Ntzs1-^3i9ju(5o%7_9?=?KU_rd$`f4J8G37+ zn9Z5nVJYg~{f9@RiBBpWFQ2f6*~D`^*Fazs@etF;u#9s2G(tpF1CXJ{XW%?5e(ybA zd;6=~qpM&2<8OY#7erPth%Eblfn(6&gC+0YmBHuFd6kfEi4oA%DHn@z-x$kxNFr(& zW3j=r$22on7w4w}6FzKA40kisXqUFhaKcRr&?-b^OpSwJ#zNjC=d&$-vE$aA&iLt1 ze(@7u4P6>)dEuL?1|46L-RX>%D2T`MjKxjT7w2P`QFCwKbA4 z6)o`O|AV{tdee(fug)Wm6Z>@_Sbw;8@56hYqwxvzUsOCkIgN0*ezbBX%!x4O#mpQ* z1QzNu-~b}{fgwXnsH(WDVuT>}3PRO7vXMC&e9_wLO_o;|ym(DU-tk>4wW!B9AKfvV6Ld3w^s(R7i0@|58^wUA&CX{TWkeJ)Z{mUrqARo&ACXbF z**2%~X>cKhZA`XU)DZ@tBuYgSU|99dHj+nt8^fs-pFXW0U-Ek7TCF+#3#0-gfRVz~ zTovGofZ#KqlKaq~#%(y|;|DgAIOpooIrB$!RuqH62+kCrZWK(1!;0KMt7kC42%-T@tXncx$%O(){A_AHaelw&g zgq_9HE?ZukFjoV)7|xF6n3V{zUWm#t3A!2-wi2~M^3`mDgKf_$UlxUOOr+{4e9Xjf zibcjBi*khB9?J2Ntz~p899C%n`w#DTI|E#CK!+IO%az|!BH-{wlW~cjNAw+B#6tBt zgR!URK2Y=Dy%smU{j4H6+=JAmvMCkx>m=BUDvEL={|;a z!|2J91#Bz`IX`1!e$4C9$GAn-8~kwWyTZ)E`X&JE+E~$)j(y?VoaBOg1Dm!xDsU8LtO#PoM9m7m$TK%>S?G>XI#8Tm?HndN5ER2D&4_JJiH0Rz==F}FR z;YNqD9e^9GfYM+D9Xu?U7KNDP@%={^28oSM;Uf%Fb}f0Yxp%;eUEJn{Bwo%rJEe6o z2vIHS;2}_1p~G@G%#~#9rkV&-0u^2X3b5`V%*U!~149JetT$}an3h2&f?<81*-j`g zw6TWLvKqc%LQRQ6*9x7D1UF3P3B!QDi~~@RS*u0HU`>(BaaltXed+9ClLLw2mUb7d zifk|y)C3lQGxVzU6gg;T+%ZQ~MAmDA z5;U}UAZALnd-g(uqhQH@!f_n(p)qaisLbx7PvY; zU-9Jw=*5=~95BJM#rX^atE_y#jBZD;E1Q*J+*QC;m+WG|rnD99g(NFbLhl5B71E>) zcj`02f3v8yx*&{Na5LUtBOwj}Kf1?SoDWp>M7^+4h!$t?rGZkwn)F+er}Bn>#qx}L z8$P+4-4gCAUS+{PcD2Kiw^mS$m2(6EY?k+Mxn1U-^Sqk2EiaLjNJ~^r;;&%61g{?LZ#gEk!vxJ7C!-> z8`En}RoLC=SPs)NRWe_P;Hi7+uqc6c5*-dwgTR$x0M4RrOdt(XyD2{1(iqjbq`Z*2 zfz@_CZ;BWUg)6fU>p7y|!6t4lcY8k+wqrnU=JTWd^B zW5bT-w0+w-0fH7)TP~D?pUPcPMyp8Jc)`W2zb!vOBAm5aKb88`j<}(AvJwLYXlgSh zECy7fMXei!Y#EjQ;n+bE4MXTPNw$j_|HB2<7*dm@i6mCAA>XPgGW`yl05C#W#M&s? z!m+8vYu-#Q!-RsR+ERs$aKFV=(7L%P_hU!TBdT(WmuNUBMt@mRv$RD+GVIyE zP#J9iTD3NYrBrXC+qzcnv-_r;O`(WGg|Xl+t+ToRwFjG8)O%DLD|xM;zFPKJHKgu*-u-t0Y$JF76x*gRJep#Iq9d*B_ z$>(>m!pX@GKl$|2)05HhLFafp^{Lu;Z9V>FG0%pe}M&o{O#~9ArS`6w@>44=< z3&*95Ivf)F4K0s&J_0Ws+2iM3@JXMZ0Jm8~MjpDe95YTiF%M`Q(rgKvx5q4A(m^$S z7c!BXHD4SH0{`HGkenx2P8>pud8EuFo>)s}x19-K=&HNgi(FcV-I4Sma&rYbk%8)I zf^vvV7BqrfV>(-Khi>JXD5`6vb z$fpOXt#-qrgPD13$sGy7@u{OWS%&-q*rDDC2qWkKjWgN|S5n)E4vQF-m4#KvCg_Nz zgoJ>S5Mo0PQZ&bbnbA7VxIvwfS&2hzuBaE!&|AR3N#Q4mgoIpkY!t2?^kaFLRMATm zjza=AvM7#*1}he!q`evJf=6PG>S(T#XJvDp986g^oMk2DP>B)Gyw;?ukU%!^1FaTR zm~q9n2dtbU6E$>k5Y;vt_jm+{i7fc$L9d5B@v#;Sp2|mE=HFM$GP017EKmW+8BZrE z%K4Z%4l1*9jZUMD@jj=p9(Ldz;g^3Mgugg}LLAAg2cEZ5xlpom<3HHDVyVX7(5 z;$}VEDm)@> z?$r~nwXSaN|2{{R_BYY^)+_#|3jfsiZkCAJqoE<{24hG04SvsOl2H2|%Hu70vbV@B1WMv^T zTfnZKolV)aCm3~GDY>{El|#vHW>6$c@&qvsB1cedHs&^07L6`-l$LZ-r%-Sd_vrdc z#F}B&VG#?-g?BJ?NZ}o7Mq0bNd^MSucYM*s-f&a{kr~4p@AAtQ4pYp)Xbw90nh%u) z&y+wWsqxrx#DhuKHw|Ze(2$V_!zHAqEaODR^Fl-&v&C>Qo%Z{V>Or0|@F=hn9Ckk{z$6;3H9d~Zvq00wfr#y-?HIw*dMZd zk1Q5pJpd0OxdRy$?~6eWTqckK9t30n2KN+&NkAC#fky6w`xwY%m+G)Bs){<0S;+wl z*4a&vlOu=$Zs-*C@+YGH3kx+rx{S-p!6A=zQ=#e@p5%qWjkhd386Jm*W849AsL0yH zQ+*^sPw!+cx;ia9t@QiZ8s#r8=7`JGyzphI2jRr4Ib6&;=$idauPU56cPnO46hQ9$12nNXb<278^ah%=r0i zh2eQ5C7&(@@szV7foG{gn3X?y zD@u*CWG}L8GMG`}N`A$Ol=1|=nvlYAVtgcVszi#D+wwGBA!0p2te)a48+>#fyW}T~ z`00eFd>%weTyN!&6+D#`S~su&8?rZs`iVYe)-E^{*0fFa*>vi1rsdmu3Q3%*x=w#7d?L& zAC9|P`y(2$!Ykh{E1-s3V+?c({Q8QY=EAT=FW$K+J|$E7Rwy^#^T-9cdUpT?QsH-* zEiAe*>5NkmBgI=~rdFE}7^GuU4N28$*_p}*fB22JDa&yEG-(Qd&0?St?7@b1+Urw z#ls`iMv9*RWhLoH=vFf~wvfU~s63JgMC1aYnj&jmHLbb8d(Vf71R@rY^XiVm#pl!l zTUKK0;t3x(c-=gx{E3_H&eMFV&GvgNW-zVyqVddC8&XC!CuX@)+UDB;i#MS zinc4Y)~KnqspP#xo>r=v@=}CyHl!vG$B8D}Y@p-*CPyW)5jw7%_z1QL_H=G4gr7M<{@@Y?*T6b!W?3d(iif`(P zqpZAay@E_^tuXF4n@z@A*Y@7~+gCWVi|k0GouJr0eZz56=kIoqlwRW@F1(=@*nQ*G z-~Zy9=oXm+lLn}!s#b~CVRO5E0HO4oo4B?!rDzS%TY&ovf-ZkP#AHxM5-b0wRp0rb0fia^?&fQl&>XJ6{T4{#p7DIh-Heg z>McY{G^EW{S4xp`_2%I*-{MeEzJ3?0GMjn|k`%>;WeO#q z`ce_=kg{vOVTj(P7UBA^WFM$XFKCm=BUqEKm=obtB${U2TMK6H`c;MM}m_`Rcsf3icgK- zb~ZM&H%E=&*~Qu1c>QQ&(v5Da=|)%P^%7o5GYHEL)uhs0O{qw%m9N6bLRO`9ec$UK zGTaC&RH|qbS&|QxjjkJ}3Loec!$qrM=DAu+K-06cKTW4vQ=ztay=lFE%+HDOlXbp^ z=qq5;Q#$$%?}H}6QUi_OA7QE?UMA}H{K&6XJ$T5EnZ)7+e&+Fl-wO7X(fz%Lyh(68 zIyrsB@5Y^?&EC;Lhpz({)8n&2bn5*%Hh<&;;;gQ-?+{!uS`VL+V}VH(8hlE0qFVcZ z>37@>6^Gp0u81MoT~HTffofQmbShR7je)zl$mf<6u?8bDV-}W_DKsB0ote|uYo5#$ z?8v(mNrkjnMaftXS}%T;J}w(o3M`a~^jh}3P%{b-ILAby<`r)N$J;a7gXd+k zG5D$*xT^FUiP}uJBoNFurb;WNuV?N>UyceuF=7cSO{Q9XA#BxZFEyx0nc4_ce%UvW zw63)exgS7oHf4aEa|80`d{q3nNHlngP>1CqPK3we9brB(hpkz`SfZ_Y1x(3K@+{-Q zUt`s^2_a!oZJG;Fgo|lFa}#ei~I-?D9L#69T6cA zu9qr%m9yj{Sxcx&_Qbm3xpG`hCQMGyWTwC^8(a7XY6S;DY-oy3q=tT+r2)P1R=Jov zXIFAYDkoulr<GJqu@LJ!$T#iKE073unOLNK(I++A3>odbre(BNJSTc zRoF|t@w&3&j+W%xM&D5*9CNN&RT1FA5!(h^i> zP|C_WmDR&Ef?^Aqg=|eu72e`THYvHukw=tE{0fSdIQC-hq$UHer6#A8$sD`bv})zB zT(8=Lr)u(T_G+1GV)~?AG>Vrv0E5YDUk* zIim2WFfi>+d%{zrR}tZ*W)?E_9p^>BBANM;-@;L7+FHwb5hiwpUKA2XsD}Hf;aVsg9 zb>rw68-rTbS$LCC{wsHZDvY9$tHoUFuoe!f->^}ROf_eFA9vapwk@Vr&u@1qV1Z;F zU{)aGI~9Hi%H*S59$$rBNfIz-w0;@d4eBJ!tOk62ums+K&l03yCfG)RDxjbhQ5&($ z9+^>b+2^j2xm_YCK+b)*W0E$n*=j{whYcYQT2(}K+jVZAMcz^fJMa|H(hvP!1@AKY z`wLtEHs(V3-NpEhj~OWjlSZg$5i4p<*FyX>xuyqygSkS(t8MvHNUxgARFeEP=Xp1_ zQP^rc0JH21r~Ssg7HCa@mij9FMmu3PaW#*sOXj{ZrQ3iDvsh$>FTe=*62Jt}Plu2y zocWlw5DWdvG}vXoi`TYmBWdSi1764=p~|RS)#I>4Z*F54S7K8#dK@atb7Dy2<{;%C z$kpf=hF2~Mp2XdfHX4x7hK*89*>QdA7D$0p^bi8l>{Q3XD~%{8@~G98P!e7Yap5vZ zwlp7WuacRNp{V#9cOirAEPvaXtvFM4x^h2j(UMa9B3k3luJz(suh{l%ydfZJa8wJ5e6IP!N&Ct zK7fk6Ui2kuR)#pZm`wO!TFd}K#=*Otqf|Bz$*eqB2~t@X8Kh*Agc+zZ^2PuVs=O88 zigwr;EnEw3<^Ff+IC*;XApC<8gCCdSQ>X7wL&%;oS?xt|z?cy5*gD*>uHYU*!4~_3 z#@=_lOYO@Dd@2S4q7dM*0LFfsMJ&ymz-&dtw+~|Ny>Eg0tj(G^3=lIbNJNEvn2k&k zH0=fYE&#Vuc#eV(#74qUOE8t}N;s&?pcQ9ki^{3sy5}rzG2-PQ_3SkPBXLiO6<^3= zppD2tqeOylr_@7uqe-tDy|5Ey7uqj1;4Yp>3 zd(5sK%eYq=5HR^Lc~H)y%7(9ofjo%Jb#voh>vU5*;j`BGYvtJ-ir$SRFK%8q<2Ui^ARqMzmZ~W9iyi< zzcMUCt*SPM!D&cQp{Tag)L9M+EQNBoOTELjQo7b#FI225YQF_Aa$C)z6mOR*Q>o(Q z+2LYbymE*xDhF9OOab>#f8mz z){?m_kwLC^{^HCdt!C})*Ui=>yb{@i-nx^RQ3f>szx3%PBO$`oqM z<-mKxi3b%XEr|bLjgy&!T@R|s`%W1sil`2fYfSQ;=X24 zaj#}9`*wbhTLzTDDXb_|+X$HMmj0IBl{REduGUoIQp05mnp>+b_1@qnbsD(>hOggj zK#F`8+bY0$(9gQIsw&mTE^kEE_T{bPfJHzyHdNq=jw$%GYKAY7(8nVDMCeW%5~3!l z&15m_YI7J@plz&6s|i$E8!Ox(uzl31A!htbC55~sIE3m(mZ+p|;&N1KR%&tAa<&bd zwM3F?9!eOg^X(FUu7uvCKY3%qlX50qZZl#Vbt2|aO@T1b(|!`2tOO6G&tGz+0Lh0O zhVXGOSY?yf=++v{LIQJ_yW!qw!D2V>RRU(WH*TpW(!ff=Os2f|l_|N-+ljBvty ze6uo_#iYRmHfcQZm_#n4)(|<7+8Az_G1@KyBUQ>2N(`wiQN*j~C4VuYN-VK!z_V11 zW>sXfwjC__ii>URg43)svKJ7Vrz;g70!?^S2AtSpM%ixZTp4Bp9?i!GE;Uu>3Nx3b zO_P`axJ?$2Uw^2nqJboZ#T&blUqr)^TJ{NzdbJHtdQ2m5MJ+5NxrtHEhOs!x{BdZ` zG?f&ileCuhgQ++#cp*cZ)oR7optS}Q4MHJv5u1yVHi5DVSoZ9S zVU-JH7vvHd&pfZZ)xC2bfep%t(k`|w zZvwow>^3MCKCHUPR=C)pw5fT6QZj4STCD0juKA4pM)Eq9RpC;$*tVe(F3-K8UPFb+ zK%=WFY-3VLoWa@rCJWSDX*%_6vk&`-+y!ZYVl8*PHbLc8>H@qw3#WM5rzpf~PWK!7 z<*4NUnq4Icl7dPil6%M^m8tU@1F8#NS;D|aDXwcJg?=C%hxOG`ABI~>W1o>yz6QnEztm4QwE zN|5TS2H4lD?i(n-=HN!Y3R>V*BD{?uO`^sYUWxwVDQH2=F&p2Mhz@7;IgR<@rXfc# z30)fM=xtcsi-Il2RnIaWdoW%=H8^E@Ji;8kn3RaG!*97iz zFLw2!=GDFq)Be4dw!n*pFRT`Fsd4lkl(mSdY~h$-7d`dWibWiJKb>Tg$bKSEP;$? zK>Q4RZvki>MB#S^#|yugMB#nDdo}IxJ6nt0#dLQ)94rqOqk~E3bl4qtPAB~(ACelJ zjgDvI^XbuKe0Fj;8O_fR;O%UDG@Z<6!{Hp6(KjDiTEZ;&2*Hf+DfQOl{&KLK3|E{C zXQROtAE5P|XKKUMs5e>kXVcznFkbh2Gvw{?lcIeTh@5@C*|pqRjz?GB9-rodaa7Y; zj@Oer*PYqLt;q!szd9p+ZnN)KocjE-7E8q@>n=92_BT>ie4461TXw-qL*N2_pV^A|A-c;bG162!cu?!aDM)9ibai2y0iIc!DqYpDs+D_jjxvs zhdm&e?XG71Q4cXD-NkU#-@WDmVvp9X*W(LX1K^l+`8XFsz%4rC8&lTwfMvR$`V8#!a ziS}^a8!kr69ws#Fcc+)VA)i_zZM@t9BlA3S~l!^{2YV$fZ#x>UPd;bQZX@$~5GWbZLQqR>4%JbTg| zuTCaQKPoosuKL3Zh)t%Qb)R3{TJ`WUd^c=zpAV5Ox|8MZV%D1?U}v_!p6)J(>tW}j zw;XjZ`AS(A&%%XJ<8anr4@T?mY&Gc3t~&rrjmi#+cV~I9&7>gURI{HoP`?Ec^ZSY%9-eqUD z>@0{4xb9-ss@X?s>s?Xp#i56~I3P%7?wy-%1KOqS6q zVC_7mpY~Vd-3uO2cdxbKWq-Qb=T|X%oi+OE<9{7ZfH24x0lPLF;5J_LSNx74A9LrM zdW*eDe0#39o?>w{V4czBlwXaTfbwX1!8f$mi_VBh(;ciwy;W~E?XCthVq<^NgBxR; zVQM&A?~nLg{qA%@tRWsPdjzz#zGUlw-(g9^6-TzK!b8=50QeH7NL&M9WHT539TK!RTnj?o*) zu84ko(7&@HNcJ!Ao!;eOI3F#K_`E#tJhKAhY<4)Go=gt;rGPG`x9SmUE{FRI!k=pu z0L8TlG}3lEV$}uqIUX1t>AcKlJ+wF5$5m;E{h7BbqBoB2cN8(^A$E?xg&GM;n1Hc* zGR3`70*VDr*t9c9A)S=Q9PAK^31M4XZo9k}Ecz=#;$THbV!FUYSr>vmQFvxVM_PYW z6P~EcE>T(xit^is#5hn!mG&;UkS3R>jps*m>h#tXJWt;Wa*kIUR5g_egjmD_g zkKREX;bBuFVg~{QMZyY3%eOeOhwc)Tus!=*V}6gXzeG5ktVhGc$JO+F4Qbjnkn;7; z9`<&@FZMwTtE0I^$;0l1e#LM|2+_C+QiAMio5`p%K4H;60mU{2pGB)UFLyDN$r<)M zo71P7pKvlA&!?la`O$24Ha+lX3;}S4MUUvU-~ogtRZCbRbmLl>*QiSv#`~$qh8>^4 z0H*Y?P?S5mMz|9IpgD5+;}v)r5ksN;Mkvu(_oJ&!`0;a^k!!T1J)!svS{O53Du!Bk zUUzcAPf1zKC={L7=&VL#(($)3{E^9Vk4}q@4Wht~Zn!b-5Vn<9x{5#@Y7JG9G%21fi65)&y?ex_~4 z?|;tui3r;`@*p5c(+jmX4Sj1=J1ClF#?Qj4a+*6D5VQmk23?1<)@n2Dq669}eFf;U0ZP_3g;wPno_6CGal1ojc{3X zh7=&WIKVaKT;8csq{A@?ZeB1WV}2qsTHuP_V*sEUs;1GxBo-5Tl7P!Ej*V!yh;MlP zknstDiw2aQCN{#@1jrDd&(p$Hu1!-p5$7=)gSNpB^K?y~%o8WZ$KyG@C_bSm?<2##vwq8C)#1=;Haf7kbU2+HpA5(IgXxTqt|(x}(C%z@=veElf3QZ( zV->}S0PiLjAPcnIpfoU}8iT7!HYR{RhD_vv7OHn#cEq4>2GP;D&xd9w^yV1bAw9~T zBQiu$?eTcgBPy)=Ge%Un1U>u_RZma)hf9=06rOac9bi<$V0enW0W@69p)ovzdz#?m z1zm`N#xtGqgJ2q$ky-ilCr7pdq`}b{fB__hKk{QQgXx^#dj+s#+nwVRq=7gXQj%td zB1S9JJ01eu^mvZvi9a5XOH(OGz@3UR`~nC<5Eazh=y*QHVRa^=%Vcy+42w*|BT&)0 zB0y7l^a3!M3=qx@fHk};K;fw0Uo*Qs7kx_#z!1U~usRK&G68wh? zzzE46dblaa{9G?N^gRLq+9M>$O7<^~XJ`*`kLO%73J_q9(LWffV8swyIXo64a6oC` z2}1^Zt0N8#__<4+VmhZS!>EHPO=eELSpPhxM#xT-aFji^bqzN@cGQc4j?@xE?->=^ zP{glq26@`o5NR|*4t@Q^E?Oue0*_G@)~Qk>hg131Fbq6gfkS)%f92c-TGDFH1P{7AB9!WC$mQ9AxN_<5RKoj`PWBCOoPE6L93@f;gCVl%hJl7y1z znxZ2rUcfg;C|8z)IL1X%FPT&kan_qbIIrq648X_KOe7>ca1V_T;`yTn?n_*xEzE^V z4${CU5;$O17QPKneuJ}YXeKIy1ENjZ zcre9x3IbSJ*tmC0gPhYe2x2sKMRi_A3gbY|LwbQa8ryEDdBdhD*bbM|F$rswj4%=oZ6?{HlAt3_ z3D#U!PWD?onypFPmLvqdl)zg*^iymvdqHFIxJe1Kox_2w6>qCrsL6 zShx~3*GqxGH<|!5aXZ8=HxsJ#tGLakm`NjQy&j|+>R!#0FapWed%9ZDL6+72s#n;K zZzx7>FjQ3Gj<~T^xK>jNrERn+#BrE-62h1ZIq4S3t#hkh=!CMObm3hAHkl$~#O)iK zuom;Bz$!L#RK_=^RUz3>Xjt1^x_NXHzRFb88<{x@|AFsXbslZk*O<)B8a$_MExES~ zy(w?|+6JKZ)$L;(4QDgaS=eY(lj7QT-uBsRoY?GV;z)*p&!b3K8GY4u`8cj6HaDv6 zd8LhiG*QJ`;7YYw*l3v0H4W&7)*HFsT>J|2+?3CwO@Vp`ISS(pGPoV+xp7{%jTr)j z3?OURxtU&<{$`FF=fO%)+%VOSOC@`RktQZYv*(>!rsZ>9Zd}3>Q^hsNI7W-=AM)@uvHp;i{fnjjheYWQ rN&C+M@PF;{{W)O#9S`3j@ErobCjzeps@E?3o)!EFi~l~|itqjZf+5;8 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/nope.wav b/modules/windows/oodialog/wav/nope.wav new file mode 100644 index 0000000000000000000000000000000000000000..d298b4cd661d307a6b741158785b6eba70ae3b6b GIT binary patch literal 14884 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 SrN}6wu>>eV$)n@1@BClZqx?_+ literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/philcake.wav b/modules/windows/oodialog/wav/philcake.wav new file mode 100644 index 0000000000000000000000000000000000000000..2fc4726c74e709d2882456487555b185a2024f8c GIT binary patch literal 97534 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 K=EE6rjqyK6BQ%Zx literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/philhelp.wav b/modules/windows/oodialog/wav/philhelp.wav new file mode 100644 index 0000000000000000000000000000000000000000..a33a3e6ed30a18e3a9c614582406c24846e3ed8a GIT binary patch literal 80762 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
>wcxt-1K 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/philouch.wav b/modules/windows/oodialog/wav/philouch.wav new file mode 100644 index 0000000000000000000000000000000000000000..3241abe05e4fda5309e8ed7aaab95158bfb39036 GIT binary patch literal 43950 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 XufNV!TV>>?i`{A`S|-EaoMg_Iq(Y6u}8{5p{~c zjXTD9qk~ZbYf{tOAZCOjo*cnFYC3jfQS8qLsPpwkuD1@S+y{ zRz>HOk?eWaVCw>Lx{Ms^(0})|F}OX;>?@qodD;AM6`cWJgD^x=6`DB#O3d$=;m^o3 zzC(Ss6+5Oq^y4AW$o-3zv<20yY*_8Vj^yRBUPhvZ`VT(#VYepZ%qR~%aRX=-hX9ou z1pkh5h_yKoGfQDi>*Avl&rwHDlvtDnXE;9?j5t59Z8ClNnle1okh+<1Dl5( zfT&WG-3mmo9qJ}2?0k3=uErXwg6zx(WolF8b7`pH1bgoV9d_O!yV`)WpdR#Y@Q(sQ z9M5isKYM+2P&N+#A}@BT%j^jUyX;se{n5MZ zDDaN<7<0FI4II@6$N+ZJCGfpmN-w|#b3LNd1bk&P_UUIJqp36l^`{%OF!Gk>xMln_ zU*hf_jkvlMn)Zpvgnz)PuoQf!+hF`kq4Q{EsF-g8f%=9FZ!PqQcW}oz1kG5`ojMer zg;m)R|8=>x;Q9I+{seR3KET4IXEHL-V2@cB;%ET1#RO=sz4$*7E9ErQpJTBft6+5} zAqslo;Q1R><4o+d7(8J+RM&Q5uWiNCp~npT_XO-E8?w5FSTR9ea|7(6Gl(O5p#(e& z9p)YAmLDT>p8`f4_n-S-uwwxSMe_^n^uo|fYM7O~VDBErPoKm8|HjWB!Oq-|zn>u< z#pBE=jp$*(8}AG9agcfN6u~Y!;fM}Z;3M?|div6E{|N4c0A6VevX@-Avt_jcxB~}$ zAc8KZZLA`|`huR~!9I;GQAbgcA^*a8Ai@ppJkExbI3rhrLv#S6a0$`u05XZ)a6sGw zLOvPnkUI%jQg!GepCH?RLqGmEtILr+bf+_DKe(Pgf!ArUznmXq zmg?TSOq&%+&~R~GgilM#IY6lY!&kA5jY)(p}tuX8B(yXZK(ACZXub-3l~AN zJ&);y8|Xr!lg?06?ci>53!s=9O1{7$bPzl~HsBnufxO`!eCyU@CwIiY^Rwyf1N2ZT zihfCDQQIC4W#>cWSOmX)B(h8!c1KTSpx2eAQZfftL1Ac|CC*v!<(aGUC>bEnXSKp5FqA>E@NyzLb!$G7SbYRWkTM_g^P5>)p zBK&m*qV{_jYb*utIyW4J9w9q^f@ipd(cF*yz83rYF772I5G!POX?#KET^0Mk5U!fKW>i>#2^7*FAMjY%GkqY z{yW+7-~{}PwfqSmX}IHdgs;F%?BJWs6LdPc2^`0cc-9F0BRc^dRoPjj57(Vngh*%Q z5U-=GFq>IH8|%~6(drIeU~`GX#IfQ&d$^cLR^az4@W}8oi>y0zg8ofCqAfReo2|{) zbUf;X5k|6c#_R>pgM)~HZ_MFXDbIn*Ihjsy=ZiN#7~R1Y$!nNqD3evp5!NSkwEY(Q z%Gj!Bs=P6UsY-g0X}B3*V53Q8G6APlQLZZaVHPzS(X+@RYJ)+SiLV}FnsU|2VWSRB zv}Tys>2Bl=lTdMzjT9YYs*3JtD#0qWWv==k+uR>)6wiex9jVy zQ1*|RlTESq)7sF1SF@tHL{f?wP4DP#I+v}-ze1FoN>*{#NDu2S1&0$SNKqyUnYEpM zp({xrev>uXn8(JL>*W&kEV7>AObP0@Vu|0JX?!;qb6DfXH$>#I+FRo(?yU*tFJm6f zN{<`e*jLcd2%Bz?!M;@5GLv6kvuBTPcZ;FkCaYV}J@E1u_S8!fc~sP9%H?f7a; zc_SNYo$alH>=k4nZLNmfBeo3<(;Vt^_K|G>aKoH@oS7QvuE#+|Tmrj)09)F)tz0)( z+gyC8d54Z<`v@ZE)^jVJj4xP4B5Lrd=%dxt${^oRu`0v01s|ocRnFM1FH>7-bGT>Z zGU~HcQSEz3D|5|ov;Iut)aJh2>Nu7N&y14lB69`P({N}>xa&8uctK&inZNXzdUv`` z{i2R1>Qs5QPXbRI6sxvF+kkQj7YTYSuvY ztDJ6~=8x;w{KZsVi}FQgoc7$w7!x=r70a?R=Y#C~!Yevfi|e=qek54zJDoTA4@zQ2 zXy!fdCnXEA+$;2yVORgCD}X#qHC;ohCLb)8*MYs%6Hj%Vl{TR(utIm0_^b9`00`X7Y< zjGe3RN<0?GV=G~7q+MOz!`oVCe?3b-#b=eSitYKk5c>S9&Q92L4Srj6Vrshl<|@?m6m z@{%3xJO8H>*C0x=d*$_3r0a;~R$Cf>ke6rbO~lmb%ktN+|5M&NdyAd8PU3XB3rfEa z>S=!)|Mifh@R_1Y*K4vdEHgCFn{VLEE6q{5Xv?`5_AP=Dcub2pI*2)p&QJ+l4^&mV z+V1nW`Tik$9IVnb>9hZhEllWVR%Rv(`4FO#(@DuT;X>R*Kj5c*@B>tu!Ai zg<9(ZwP*)>l0Gc84*f_pZ5VCI&g6C~?L2+ub<8i(gE%yk4`VN@_mTtYJJ^%PeXdv5 zSaHDbeHqchKBb=;6E!D1G2?oAc|BW7<-p9?`cZY{VkzT1*(}Z$$@pmp{k9~#D|sKJ zjPyH6F2@wBy`(2_&A@zk>SA1no zOO<@8qhO@Vzb$2zZ8NFl%jX}@ly+6I_4GbXxn#=~KF?drdoW^O*a**(-&c(tp~Va$ zpA=o(dLdTG8rTy^M4jd0@6HLc!wP1-sAtjoyQZ`Ay-v9!DX%nBhlX#_Yzdd>IM+A+ zrlN3;&75nzmVTU-J!iacXfrWKM2(Poa^v)-&c7n_8r@S} zOs$B@$_CFNu9f|RbV=KiUW+vgoN)55N#fMdOQ9q5lYv9du#iO=`BRQK3dQcTjFi=C zcJ}~@$vEim9eyONvawe^Di#(7dvd1ql=Pfko$+dd+J!b@IirL%#?i-Bldq*+;NCDr z)$O*sd{v>SeHwGyob3CY)>s-A+RZV*-4J~$BZa=Y&pSd*l057s-R^!I_OBL_n%CTv z{ZaVZv^&0@RzoJYlxAI4YSCHJVaGJ%4?op;G`*+XBr1xF{S%$i+wITxhneNS%)PhO zw5H(Z-xOM_?DEizZ%p5aMNEA91EF3Pk*F#2&EwHEg?|$_ecP{g$Rb7*&A67bBI;}8 zuwRRRRfs7VqhzK8x^Y#F&X&dBHA>Niwg`TOXNC7JF9YYfAMzt4JNre+mgY>o!A^ER z7t*z=tm*iR)G z>>_6MKFhpoH&D3Nl&wp~&)_tJkH@7W{jXr@m{DnB&+M{+r{e@KArP>b8& zxDw>W->>q#ZQBkOvW zq`q;cg@kGIGOp^Kj7HAvF@s%0%%7i{B=Zrs?3{Oe=74O?@|nrqzYJ$PI_q$6jr;5( z`#bGr+N6xG;_lGPq`i9~o0PUUz%Xy@)wv(?+CU%WhoNwbLf1R5%3|_b-yES^XsByO zMw9d`u5|lre_p*n$ZlR!S8~g}Bt0rbj9AC#6>4d}eqK*&o+TznT3}`R6cR()`j;AS zBM;c}YgNK?G12iklGZw>L{+nS?R(sLy`B#ZNcQ~4nWc%%*?MtBnZLhw3zUie*D*N$ zY|@fE7h}1UPJilI6GGkz@$zoHsN=Kr_FJp3Z?aU&_rve~mP_26@1hp?abFv*4`!MR z*~w$UWjxZpipUK-s(#$LovGlp`5TgMAq}Mb8O^-?!%BvoR_sP!XD_+^_f4KMS@!4p zuFp&PsFdZX5b1y6nIYv5$tLo?D#=~QW7mB4ej1zBC8TurSFW6%wHdo5iHq_r5WYvf zOPl+7jlF-?(c07GLVU}txx+uQ|7smmot_(HAu~;y@9xSzk(UB%oRd1!d%^K8d@XsK zzSDSWzsaO2*D_DJi^a{)@TJCu_{qbc(Q>C;?{n7Yp6Vk4DWv3dtzf;q-q z8Ic(?)}QgGf$g=kskf2m9=IAgZN(zp!T8!CC!BN6+fvZutRB)FG{^jBqlhWncEB8^L!WZeomE;wBCB2EiC6U4-g zuJbWp_9BQue6@9Y;e;m{y=s=&VS~mynj|QB zdt_!&U*Fh&qqAhJ`5DhW&oa-^*tW)f%l1k8Vp*<2);ixoBe&Qhrbm{W_KwUK+Q-vH z=J^(Zy$Mazy4rKb7I4gEN81iaC6sNM)%35v;wcXUx~;x5)mdJsuGeG>hAy+UO1YQ* z(aA^B%-X+J+U`V^cAeL5sf%2lgi8L&flkt6*YrS6HJ;?R8rsr~T7kW0U;eZ0zM3WD zvavMuxXYHYIx&~oPMmFT#UG*BjFMVa)NI!|*~kUVH(xisE$7duk+d@;IeS}Xt?!P% zj!&X@*yW;|?W)?9JLx~Y@JkbPrntDp?bgfvyq4|=iLv+h7R{{7j1WGU-`EA*HTFWF zqA#4Ykvvut+Jl)1#$`qGgA&GYwyMnkv|7ds4xX%H*{B#{yd2@HT0*lSv+-&kr zNaa?uvD*5~1hpGkF2oCP=+~ce>m4z|Am)>N&|58V4rf=KP@j1~7l`qWXp(N-(Wk2W zK6KkavpDUs0*8`t^&(73&5aNT>2K#DV(4WviYsPdR9nBBJ?P z{jJpn|KU5W$iK2p7cLubz1L;*o+Kf*A$*wGMUT>dDGPLsdt{f0BSDJG0t8g%7Xcy}&>oFN)z8=pkm)7&mP{)`}hto+UpY1%5 z+b668zGsQn1NH(DnFwPC>$2BjrfO@b0oN=C^P6zQuZ3wW`+<+(--HHj>=HBKDZFw%QzF`%Bo3DjC6=S_$-ix^ zkmoToggfLpC$rbB6689RR*&>?N=faj_CgOu%1wWe2%vkF?Enxf!a^vA>Q=Tcwp5}(~o5*nHm023q z*oCO}yf!M*2r$d5aZ9*!#0PgdlR1NW{}3oB;^{E+8|npjnW=0E@(X=;j==-DlSRx| z!1G4{$3JO|MkTQ*vkdi%t{AT=;CVV|1MHhZ;6u-)8)#5Uw-kBvi0d84+{XflNh>&>wWh1Sj?sJC7{nqWO*dcicXg^Nsm#oQteOo&O_q zjP(&8H;4aA7%ME{)496bJN7VGZr8w}sewx2RWg+8$gL(OxHBKEtw8hU(^Ab0?x`JZeP~fHvj@R#X@j?5e26?*WIQ1`xA-n2kyB(K~LfWBOtb^IRiuqK)Z+O7}Uo8>z`2V#ku1U?VRAR4^Ai$Fy_u$M_m zatoEjZuqV5&7kA-FY5<08;qeamZAbTklBTbW;!rm2RL8HP z6Te0M+K+x;-SPbb`1)LUhF$~fAlP^H0`SC>_*+2T-2i9hI537);1!oa6>}Cm0cW8y zo@(Yrh546t8_2?HurIb_Cu|3^V!>?it5y)Y1YMNu8A7VzsnKLV@m&@SQ)dw7qBH*F)CQsRlY!Dy23=DAt7>L`z z81OOKr;8MH?4zVLJ{t--H>oML@9elSoFo0b^ z{DM6(?!t|7K5FFiQE}(MDmscMHt_U8C+6y4UI%LyFW^FX$PD&Cd%PY5Jb_AX65dZ4jCcS$G}zxR63ADu zyJKEvKC03KQ8D(Rnmh|XGX_ke~XCYLS;jjo)jst&UAkd92 zaK(*n1W~fAMm)%cxD@%Q~$u5v;eBo2f#4NiSy3HitP**&l+@s z$$$p17rggp1I0>%hv)-*9K&<=24=ek`?Ce2^l1Do0mXfRQ92Et%6zZ}-k9T{fcXLj zU$Em|d#vH5SOv@RUS{EAK3-)qoR?D&367!b)l=|XGN3iA4!)KLyCoc>J03I90Qx>B z7#39!1A^W1f}OSogO{=$_4f#L|we%jiSaa~% z--B1-0iGNWOyVk#4HZ7NxA8sM3Ze=nfyWrAJqO@T91DlsU?(RB(6etqLGxjD;_!Jv zFfM{UV|kzeWr3upB6ut~n6ulE9ks;Ww5< zzXBQjuD`HXEyUl>K(V_4%c_J~>Vcgf>;W5*KwHwghk(k9Ac*nIdhn4YJ5cQsb z*i{p&pe9&iNrueLyslzyPR{&-HO#`$ve!C4?x)h*>|KRl#%#GNk z6nlCqc4?5)fEy5U@rOX{lFg>b5iWqCbkte^?~=*LPg&+)_==XqzkL8E6i@Wt+=?d|hk1zyyY37kg5S&? z?B4)K=fEhyZl=Hzaiv@?TJ{)*`W=F)1 zFu2z0)(-5F%TUtR!@k;s^=87|U^bHs22%l`SAC%4KLclCzX28rxGk$O5|eORbwkvs zU=71f;E6dApA9neBU%^2>+3jU3t(Q`;>4PR81n>--eOh?Fv-e@lCR-RJ^%>LL#86Q zB}?$Wf8lhRY{gR^Xks-mVQN9K5Rct54r~01bqrn!)!1rasfgfRtixEk%wYGJTId2j zoZ;ZLTmi54k@*Mr2Xvpps_hJHZwU5dJEju25Y6!ueSyUJ*j|{WTR62*p*TX{B=};qGB@E=;IW5i;S4B@(Ov)~yd0zA^$r8o7m?$< zgnF1~>tL^~$NNsUrhyG1Gkw|0Rt(TShi@HP{3S;dQ|0qrpbG zjx(V-`xiTfNjFzoJ=uRTrcdF$JA*B3Z8q}qr|qUn6| KG+fZnS^o!0pO?)5 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/philslep.wav b/modules/windows/oodialog/wav/philslep.wav new file mode 100644 index 0000000000000000000000000000000000000000..98787a73c389c43205e715d49ec58b06bbcc8f91 GIT binary patch literal 84580 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�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 U`s>)@S*S0NU6pD@n7#M^0PGyGA^-pY literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/philstrt.wav b/modules/windows/oodialog/wav/philstrt.wav new file mode 100644 index 0000000000000000000000000000000000000000..aee7eafb929e5de04ea34bef37c296581f3f3544 GIT binary patch literal 81976 zcmX7w1$#iH)oUY51KSShIBLS=iXoCD$vi3zkfaU= zBuOQONTY@gpRD1!v{jNu44XVmqWy6tpwyFIDUTGF;#2I3EGfzh<)zYH>LHn>ic%G+ zuGCcOEKQLnN~5K3rK(arNiS_sauh{*t7xRB{B0+-k=oL_iZns$Bn^?e@#$x2kmORz zN;RZ(C7AE3N-d;D+#ew&DIroh$-#Y4|b)F-Z9(k{wry6^F8c`)f)c6`PW+RFkSpmASXCv_u*&1xq)Se5JIck!neAX?IQ8 zp{!S|(&thKNh`fnaup|i-&GDPvC=2>Eumi@skhXNUMivY17uRLhg$legfn_QBsNN8 zr2$wkMOmxN=FVS~Im#c(bmgIPL9uYxaV0}3Qtl|b_}TnMbY0pj-H_f(Po$&LdiraFH*P3yED(X#HgtT=$R4zNt0a~@E+hL5<&d&hxyt8o zsR0(OiiSa0xs9{{o0Y;Jua&=*b;<-ZovwVZ{HBanb}E~Z&#BZvj!{yibVmur7Rl%o ziWV1?gNh#;Whx!eeu=U`*{7USPAl)}AzK-YKA%XFu*eiV<3Xznib~pz>><(-Us{1?Tc!Wu(bDKW0w2~y``@I4(x1{aP|*>YM@!#G zyQDv)meN1cVyPVxekFCK_c-ZmY<>c(UQ%xIT3hNVJw(bJB#T0Rv(yCLW5Cd89xrM0 zPT3Bwy3+r0>47punTL0UeHu%xr1tdq0NMYCwpMAgazJS<6)UOO;1Q^aD#4Xsxvr#O zR~Z{Vz!TND(<~k1>JvsCBn9y1O>CL1RF}fA+u9z$>4rP(0MjV3|T zr;Kq~IZD4{q=nLIq9_>aevQu4cs~Q{c9d#M*OXU^PKuSDD`%8OQfq0Zv=W52ma-XH zEBWXlg7;U60y{_!Cr%V>_zW!VX53dG;~stumE1~}(w-h0fs1G8_7vIAC?}QglrCtr zLYb^ArLWa|9t*O2Dh6ewvQXJVt98ncAnt^+oR%Y%@z^+7Nn+Ht(tFx_u|q&9#B%+V zpTO`5Ws_1_`55SiMOx#fL|nMy%i%RV$u1a_Yj)pA?-fpjWV5>9mF#j ze@+6GU0{+FJhK7a4kBlLz6l0laiFgm2-|=S1PdkMH5bw}#hWKVbwFu@j~^(V;gFX~ z18@{A{R0XfD!rAdSmZ5QuSD**v`ystF?3mstgn>6lv{j1kE=OKMX5i2Xf0Jkik{K| zeEL1ODJ3lhjf3cYI=1ProK>DHe<~l*dMo!VQ|_YeP~|a9_Kj4580iYnw4$f#Qamvh z0^*NjQCTub1t4N4IP!so$JpHf_cW2_(keA4=LoHL*pjRpy-=UY8jGo6G0a~2q4iCKA9a}Gy zuE1%ZOXZQF4a`3kj7}h0BP2DpTdM22|c(dt|Wo#n#7<@X-bw!Rmy-H6>NS7?_UKy?eTviNPkZTvPjqIc{NNzIjKqs4wasivnLWEZPk zS3Xa~L}Te8(q#DeAtRQ>A3sZLrQu}AlRVE!aq<=EU+E6xZIgbH4)b>e+}#}%jgtCF z1EtU4>@X|c)oXfRK(q`-v0&Z-H@d*achVJUi*y#hsgPPj z)J9QDt-+_8l^O7dhj-t>CSI&@gv_x3jBdlLpMsrD{5>RHM)Gg4dN*_#2cxc1=EAi< zkqb>Q?Omk}5k6Cy1}aApuhqy0E|B>Sdl;$dD&vC~yrMy`Z^1=hEKpXuh3++oxg74A z1vmF2Z+OTAb70Gk@Y`9CU7PXBzzsWzgH?=Phn%#9n(-ZNZ!<skZKa7HNp*_fU=fO}}-pay~rggxgEu>sBCIeqcR;v4dsp3xQB--C^7@CYUg)JBp}*u#(aZFuno-=-kN2khkK zu1n<4baG2or1p|w{m5&OOw`(?z*aCk{1G|M5!0#Irw`H4f>AD_%`q&Lj5m{E|6}z2 z23hv=_z#baL)Sy(st4fy96frKp4?d`A7K{A4~?zbFk?;Y`uclCFHiH z`05@NS{yhLwmA$6%Yn_vlB_Zi{byi-;V|)2thpcWF2he3kZCKe*E8~Y9{ahv945U5 zDsti0&B&Ebh0zXcWDqYd5R?uUqlxzkps*!8-4>pkge6)Nk?~l#9Y{CfO&M9f!2cbj z??Gfa7^eyHG{P1ws3ZMYVHaAxzypHGM7|CsSBY6n1ksTT2D3||&ngw-M-6`Yh^@;L zam~qZ)v&gny5R~fqZzX!@lYMV*^sdcehj7R31_s*c<2@AI|Qy=%t>Kde3H+W+WM41A-5_Er6%KS`^8h|~DHZT{y!00s z6gE^d{u=3-lq-eEX>eZ%*|;yZil$Dgi_eF_^GlE}9(=SVM`RI^vHa~0A9QEjpOAPm zmakhfL%jhz-6p=$s79|5S?PSb1J{%y*GojzO>#mUdi17xI1Eb9k?Z5IM;mN0Puhs> zzDK(Tcr^eg9i%>dNA@~MUys3ZD$fGY`;2Hl&D}}xM<#K0m1^xHtkjrMLcmTq5=MiU zdWV zz-IU9F(1COkij2djci8OqH%lbs2X_YHMV$xcdY1oj4Jde?s!0Co+pMgh;I)SS~)z> z8GKZt%?tX9h4IBqyb^YMh1OYE_9NVs$hUX#!$I)6nS4Ku*K71I=68YtUeop+BZWz# zvc1UTFk{^;$$*(i`2VXY3fz+o&(_Afek?EY%0Ae28GT)ZSAvnh7TMt#<2*pdL*%qK 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%0Ao!-(rb{=4rKYEjAputdhxje94#ULWmxOW$ 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 X7Zl^_ChW_rpuw7;r4-gL7oYe4k6gzg literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/philwait.wav b/modules/windows/oodialog/wav/philwait.wav new file mode 100644 index 0000000000000000000000000000000000000000..310c7985314c65803f901c4688988631e10caee5 GIT binary patch literal 79024 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%0AnfBEF_+Gby%ouPxtWXxj> zhf)!9zxVv`1X=6R+gKL4qCYRF57en6$}!(7yEk>Zy!JX)qTjT+K303gchI?D@Q)IM zq4am(9A|`pg>>DrtK~8mm^icHwTg;Ap*KT}((cHNwA9{7zv93At`fEAXY5z?`R=Ey z9~!+Y`}X&%?=M!raK60qveO&!Zu_VBANhY*Oj@1kXB}qOoh1WXXRDj&M49## zepRYnE#(~jYWO!9^0dpcC>Qd^?u@8!#~zLw zv4)xLjgwF@J7twqp)x<}43mL&S(Y7ol##9zm>tnDrAcC9Y(}&e+2ebWFAF{nfA4;? z`}MGwf4unetjM#{&+ln@FGd<`)#Hj-Li@q;?ykgzT zy!zVei>lwPy0LQJiUDPtlzLvYQNc#JRknXa{`7n26K!XbkjlQwbP zDl!snNME-*X+rbBo*SK2sNX42Ju9jL?Jf+Z+yfbp9hCU1I?7PizRIkAQB2~dh|6p~o z4uk!c-MnOc_nh){@C<@>;GE2x8K={_r$i9^~2M zPIe^Nx>(y~R7o9_T=v(IxIW*je(v_+>ASjbPP}^ZGUnx>7d>8#dSQ8)^y=p8*YC!D zeD$Sw{OhEBS*p{di8l%Uxx#Np9xL>*WTUc!VoFyrRqs>tVvT7vepVS;=}=i)$@azO z72KNlN%-8ro4$vP-Lwlex51$M=sCxH-((`*YtnQ{D?jj@bVs|NxV}3dIC?vZ-!+Epn>k~L6C@Q36NbBH3!IcAd_}l$n znr9jJ>N=}CrF+gHwgTBXX%~~b{BD_8HnDr+>cob>W0S9>=Fco=&Er_@X#^+fe#_H< zgP}VkYDM3hm;SR zkJUal|1|g0EtoS;e{p>47`OcA@WhKLvorOMzvcP57g)kc5jXSpE_|!R`7*kSM`8+9 zD^%@XwE@+v6-SpJTY7R)HL6VB?1*Z?cbL=*(3`2>`znV#k6``U?&&VCr7E9KE(~g# zzq_*QkaLCoko`r@Rco8<$gH~=N7LJ6WM&ixBdD|OcFqguzvOi{H089jU{dXA{$N?- zTg2~}Uje@#K2_i?vKb!ek5eOkA-8pRfsN;cHCNW1^cQIi3Z{NeZIpg2L&(~1?UR$+ zSqRjpVw& zO-VzNq7x4#>XVGWp8k6L>srFagxG|w@sH!j{i>4?8s94Z^3R%af5#n9_?A#RxqW6_ zb|WcP++~OgJQTVt&*&&?vB>CmWeqWvDo0g`s`fZWt&mbCr9_vaV+yQ@tRGP<$lt%A z#ig&WwP*sAZNvgEI59EMJ;mM0J=oQd8EjvBkbPNBAKQ7`PU{_OM%J3F8rhGs-egzF z+Gx$T9kCSvRkXLXM`=j6Bv3cjIL@dyt+4d7jPvd9yVYlj&oT2V(@w*D-3`qzd5tv4 z<#H^x^TgHxu&3qE?vmZXI^DJ|r!x%P-8>0kG=^wI-5T9#{U_57liv5Rf3Cm*A-ssudijFuxTCpsTGspw-?Yc6TT_mu zPD?A4{x>K}r?Y=pujkxyEOS_$HNms4>$>N>1pfT?oYVHt)~ePJTi=XI=>ch0qO~!< zoWIH?6pqh`yYb^%+?=n%_o3fUd|CP(U8#7v5+#lou97b^d{l5Lp8>`^+Lp>!&uz!^oSW9Y*1_c2pK`9{ zymRd0Y{PF)W#ar(&YYYGMi9+R_?fOR_qwC35E20~}iS4Y`Bnwf2KiF<0>! z=07^%mw!TlCU954LjSjZ2|l|`w+(xlSt=yIaCLFi2hH3kYeHu2%&F-UGX`a}1RKW& zdsacvm1n|^(LkCghtpT`2<^o-+J^d1@OM=+4T4R0uHT42NAQWTg}H|28J@3tfu#j% z7pzw>DSt}j;oS4W1_V6!8LiJ!KDp=F%4IH2m6ARue*e|=*TY2R_y1BiW}0&XU6s*= zj{0D;zs~~Sy?#-Cmk9`(8rSG5ie;5R_iD#`{QRSgv1#X%nwdaQ_81VUrv8+{jKVc;_(ksie;a4))Hr#)BN9sKh7IoxL`@8biMM+ z%R9;~ta!iNzG!`EU6IrIYvl_Ay}ch4aA7*M$OOS_e28n+M)CP}EV zq1k3!Y%FDbp^Fr|X!?WI|F0{_vDv_x znv>0E%qL+9lXSh|`Q9kGUDF-4ZPD4iGOnlePPv>MoZK-bHg!n)w9HT0LH5tiN1okO z7TwzB`f(Z=5YOA;&HX7=c2Qo2m=Tk%B#%iRlejRx+Rw}1N`Hy?Jn=*H`yn5EKO}va^Cj<(Rtc6gkA04k zVA>a4ESE9rP>FJ7PgI&%HCOeH)y7r7U-fCs$x89jgNuzX_$FdSV4As{exL^EO0dtj zN~uawb)J~174^N0?~VJ63k_Y2OPOKS3R&)G``YY%sTF_6#lQY>>|2Ge%fJ2eeMtP8 zq;9FrvKu*WO4o&_2FWKh@O(&OXsfW9VfjPv1nu!pHc!y?RyFP`_A%Cu8ODrzX>#iR z^pK3GtT3BkAMYxm{H3WY=ID*4(dN27g?;9mcbmEx#%LFbhpBL1mZwQuJpH6JDL_e8 zqeWkRxbdsyjQ`M}<)Q7u62m`5tOWONVMx26d;X6s?M;vL=Y(v|?nTQ-U@C2XZv3C|tD%IhhY+G!DQnzMonssZ`}UkM_Dznujxw%^p5oGK zYQfipm*W4l2~5@&7Yv&3$|LEg`-&^eIl>X26Kxmlk8Obt(b>we-xcF}$7J|3`$Bt$ z?FcwKmD3jgUi2#~e&UZVU$=ib@*(G)@k5pO86O&c$@%s)J~4HGZHHXQTq*EMM0mkw zMdgzD%JwT?wZeiU7vL}y;yRG#BPbfiIsjWkI$R5F7;a48k^G-tEp(Z;deKn z58S6`!V@A6hqn#M6*wZGqHl5IZQXCdDkppHxVq+SvNp1gx8Ac4bdB(Us6(}GrS_QK zq#q5Yb}P*&W;!t?UyYs+i1OEJ7_y%uiz@-*&tV8qVcP6TH9K8 z$I#Q9X6fj^FyLh1tDxI3-AxVH=BL7HnQd-iYGs;i%x(PJm}J;tD5}2+lJ`I=_<2Ab ztEW5xAEOU=43p(CQUj?Q*;S;wkgFROx(TTHVeT_vjZOqd>8w3GXPT`n9`IOJ%gjKS zo&qwOq!&(aotB(3A*FiqKfl)|{g=2jX-wkB#Ewa!zl!}zkM9xZ`2ObmxbIzmoQ=O5 zf8$ralyMopj?J1%mh9kBd2&VND)G3?sfx*!PgVX|ado++rRNmwR6w6+e#lJUkH(o| zOSy;JAH=Pz_B7{mPR^yNS=uG~?dA%;!!1S3LB@&VXT{=PY1@|dBW+T0TGG^{FTc;G zw9QyyeQn?6DXgidzhsdE7KWwenww`u7I~JF6~gVle3OwjLitk z9FcJ?b7yu%+eG^jX9f2|&m}1n9>|mOU*MY_1wVbC^C#@4^X*-nT32pQMP-5L&~GyD z^uG~UCNv?;C)^P6J}iG&-H=g1Tl`m8t{B6KD+b6OH?rQJqN~RU>>ItUxO;;UPb7u+1(42}k2VBK9 zva4k;&gz?8z&0)Ct^K9*o4bb8OWvRqra!hqnII>D>pRa?*tyhh&pDs-$@(m-Qr7MC zjMVBWlaqHO-TAdMaZsWov1dw3##7rjk4fj_J32Hz&%3De#iqeUJ*m``653)*3RcgX zKjLt(!|#lFi#`b!7mu`n$)CGY9p;nkXjkcTj4dtMmV!RjEUOGh#Bs{s&JotQ^t>r; ze~0`ole{N&V&)#(c=s;#q%Np@Y0WBpRi%?9ET^jcwcL&bD z{B}>oN~JYR!D2%33I4@wWoC^gTv6x^uyH7T-n?OEYY(158AxqeYLf+ zLz>|E;x6Pix_i1hx{kYEzz@_F3|6bXgX6n>uKkK*ljFHP+a6&bXMb&PW{+^Zw!gAJ zaTpvv&a2MC_9;2TiLOSZRY@@=9ZLL`R53LrtGDYv@uKh7u=V+87ad+Qu~gfVVa4+l z9G08vpii_O9xu;*=TJw6eIQ)S)m{5Nt)v@j4N=z4Gny^Kd@A~W@abSFXe=e>l?OVy zWjRt0BzH~jkh&}Lj{TSXSbx*c5gHt+DKMwNynK!FObD+Ubl8%li-mta$#E=Ji#*6C&NRznEV|kGx)0Lr@d3jt zzipV?`|sfR)-5o;#J)meFBlIQ#VLAo9giY#F0V) z;kNi(xF@8*SG59ml+B#EStq>EbmXLRoEj)ppubazb4oL$I-Zv96Rzg2wP4r(a3^}E z%c`Q=Z{VuIxHbMZ?A)Qy0*Iv_B2cgoeTgW-;Zb)7a z&YCBStHjT6MRX81af)QU_HS6JS{trYMeJ<6VGs?=^+$NUKPR{p@WOg<>hrAJk26QP zz&7Z}q|H~=UoEfHmF=F^?qgI^dfA8Pl*)N#i?*G#mCboUUhvhq%AMmLEfu8WnZa!0 zJf>XBs4Y3u*9gn=x7-yB1G5qa3WSd75LtYqouS*Vn+;1vANVuM>I!K)gZ9ygDT$M6 zEqb$lAWZ4FavNcr5Fn&;Vt)}ZnOJ>bAof8Bb59;Gdp+I z!i*;w_p;vD(wujdblq&r{D73;zr*r`?+ptJ8STH=R8>rqmN@jbq1hd?H(Dp=WH>bL zy3%~2vJJvG>~9n&(Yn$<+A1^_?s3{(V!rScOhhwe?=0(LafZI6dApx~@TahyaH#Fe z?T9!Z+CQ+B&o%u<&2Xu;OR_hzf3Od9%I@mQA)%FSnc1O z`+b|n_9eS2ow4IteX=K6f7&kDMVE!M1h<5}x+jLsrUY{<%Xaf%(_BNe?r$MnZ6%wf z9e9qm@ZR_fsyISdMqgc@sGFmEu07BE{d%x3TBwPfh_4Q|pBdDl$IN%x>8D45-BOTg zpWkW&;kp>3TLenxMi?&+>XYGrr~(gl1F&lff!MZL^Nn+PPr&Ib#`&k`>UrfaaHprb z$AblEcMNb$v@gneVVi1gpM5mzRA#wMA@fv5>&$6cQnn_ij^n0lhE!7hChX897=pk( zSm(3Y_qOjT-^IS4eG2-twQMrqG2Jm%GiK$BcxOgWF;R4kYSUlD-6!Qb^meAY zce#EzZ#l0!&8}l0^v`9*dby9&`F_k9_-`J)C&Jm!vC00`7GOJ^<<2^2Eo-&eTG{Kl zD!@Inp1Gm^Vq3!k;}mm>d4TzedAE57yx5b>Yt3IwN6b?!6D^Di!XQ4}lx!?+)aflC zm6v1kFNLX!jY@IQV&*d`|5X?(TL17iToiKDfyy9h65hTA@q0DmvDfw?jwm9Cr>?v1 zRUR{}Bs?xYsve9tDiHoRDUJ+EP|7)<2)*xAgP6w_RTVhym`e8l-H|=HL|M?B_`{6s)x3X`2 z-%UQ9e70IznHy5H=zt^?)^CN=!%w#ae2Hw>G>VFc(Q_+v(?>bGlut>O^1?8tx=y&p zxZ1hey7IUZoom4(?E*L5Qs@6%FI|P*SKOJNXn76un~yjVkWSw|)R1G?Z)|HCZkl9# zZ)j&2sPCt{h7>tK@DiEIX{V&gzvP?pJn%K&$l>VZaWL7E6c6^*3GUoIFi{qQTXR~y z3Kp1?iS%!r7|17tf~mFv_O9w0CwM0jpkNIKoj@zp;QY-Z@Ou(D-MCFHpe|&JYKlBv zIt>>?A(!k}V{e?(-!{;in%y+}W!9wZFzN2 ze(k$4pgk3yOMaCtNAyPFfoB3dky+VQtebP*JDqetHtMgLOg_DQj#;{yV+<{{TQno7 zE9V6nVx#n3sV{WU4K>a*NBR`yzVg5!iPBtN!rY5-*F(F&ISjdfxKB> z0&1mEDWp78I)UJopgAN=XA-3uI3{<*LL!qA;LZKw#FvRlC_QIA5z$X9gu9UgA!6i6T{T>Z%*oea2|5V_M-Ox*`w`a?9q;1j&w(evx_6d zanRnt-q2pt?gzWvYHW10(pNJTPK!LIILk2KBL12F1pvp1 z8V;M+a4ANL0P|;{v{kCk?C%tH76>luMGG?|kKr{N1m18x-D+(jxIX=a>pc4~=BDp4 zf6@xX;tTQ+xtRO_bn8jd3AzbQ6kpY){?Pb|J+XA-^=%C)2Awg`s0DdB(9jdz9t^T= zePIFf7g|t#ih&JcmyGfY$;lKzs4`2jVr4|8G&_OMvk&~J?aXn9aVC3!gf(?HcP(^Y zbCh@7vG=hTBsy@~HrW*GL94+UK&IWoTFW*vC!fR5)!t)}k1D%hy=|tyVk~SRD++k)Xm+6=x%HYxIb)(_6D=X#_HJl+H2DaH*P$R~3m#3An z3LHApPkQVPq*Ra2(})i76xU~0wkyUR>pnz9iMsg%;jp2mx&{>Jr&R)(8@biW0&bvm^&JVW=HLHETQ4}GU`9=GtTK+cQfluX^&L!Re zZ)K(Ci~19t+Q-T99`HzA0Sne8Yr$@EfELydKCnV+H)6ae;2pk{S4-ukdQu&!vorxj z5PDFcQN<~n)oPl3Ofww-1Ejt_Uf!jT(wh_L0r~JUe=*}AU08jg= z`y+Yo8TTdkN7rq-`j=oBohvN|9oo&TU=7_6*k5KC+=dwABg0%nCBrFwP5mO>XkBUe z-Ck)YYi}_Z6d|}k#>%fGN;Tke^6?yV8$C6p4$QypWKyu2x>>Qw3#5PDg*h z{p}U(|Jn~Y-ooBm#ue)dbiH?kIj-c4wmr12v7WW2T36(3bi{zwbXqD;taJvdp{(N5Y@A5u}l+pfV;h719G9 zpe!jK4Sgb|%LnnsW>6`J4!Kxpp>mY)vsO*-)J-1!`T!URlh$}2oKY1Oy;6(;3%W1W@ z@Qkg8Z_5l1!CUo<&|Wvo(ATub9Av3%Ib~jLDq@_cZ=)-#4HH*@H(G`1yf`%X7U+l$ zPA^VnR?r}g_007w_au8xNZC>dYp=1uy zzrZ4QMjvHx>jU5&aOkUo9{<4b!w_yPYD_SM8fNPo>$WpzHkQ+{J>@P^ZmBmjEIpZD znM1U0mU4NF*CQ1VAG?efFD+I`Hu&E1c` z`+>W%0?xoWaN>P+#CnnFU4EV(oZp?!eCt(hMK6|<>9<+2=zV|s&V(_thW}2#ExtE= zwpaqp9gI)(ZtXbn0Vp!Zh}YIA8f6w39KQV98cd^qIH&v>nH-EiJqMG~P0+2@F+tLc zY0^=kB;DtZ{Xr~m0eh6GP9*y-_4HH~GIfg4&0a?n9wHdEAkjVMYi83% z>t%hYajtQXQ8X1dtun?Lh8s%iBXmL9dV;?ugGsi!(k4%^XO;Ut`0014`z?fvV+M#2 z37`oa6%^(+^J&Y&(YQ$ai<8k-GRIzEPyP!V%~IaEi@Hf}cZ%yHlWTLC3MlJpLWFn1 z>2&<(_}8J@i#nP();fkbA36VX)$$OjDtk5SM345mzOnI(sf?w#PbXg=-#)$ve4qQQ z@EK+aG+!{bAh)X_J_EI(BoW69c6KvpW7C zkef>1nE8A_73j0OlP82(&_eK6u2q_Wve=nQ&`UT6WU&h<(?_+vV3CT4ClY=mQ5D`3 z{d57nyEzEC7ljJqd-0mKF}%{E4sntl{>^lSSEg|(ICl}10CKY2l8|| z*r4*7yuw>yAb8fpV0OI9dP`zEaX(RrhBFcaII%Gse7szqJMOveR_@F2k+uMtE``XZ zJ{D^~Oobi6GMqsq8124BY#;1g;|Os4Wv^$iW-nuZZ=d9t_I9uvSy zJSIG4M=xrciuO9wzD_tSL1%l*>s z)yeP?R@KY8MPSFL5XI%vSX4cXY^9}3@T>Ln^ucl-fWJD5E|LWts#Zjmqmk%H?OPDt zKY{!Gj+kAiIY%|5A=ZBmv+K1$AQz|}C4j|O0mQo(x*dBYWri^|VcYglS@scDy!8t0mjqi^X(-^j{EEnX#axJF%rjz~^;xhI}k| zV~?1UD-4d*GNfZUNX;rIGtMh1oW@Gv%)|-gc_LBSW>AB#!7=sy2ok7Z3 z0wcf^%|_<3)5S}0gB~X$zsZ^O9r7)vBm+DH+##Uj1;ST&7w;@90@kdh_*z>>@6zu# zTs7F?mV2!KKyGw_6ODlAC;K}yvf|>V;TnY60k0AdRp+-=ib1gdX z%Gwa`?cg-48wAP!n9Log87jmuCD2}1K)*ykRlfq(jwqOLE9+)y_lf6(`*4J05>4EO z`=BzOC|s_A+;>qz$h8}BdT=$8m;;9LJE|byz%k`K7u1Qtd=&%P?ga8uO7mUQ58Ts_ z%;|51GbCJB2$Z$K+PhfuOF}ZZqBS)KiS;tsp%r}HRK6)e;NYGl(kjUn_H&}k%XXR% zR>De5W48iO~C#srPQaI)fqJRW=e!|5$P1= zYevJl5KcEE4JHup=V0kSfFsq1llFT+tCXnO&O)BG@+N77^cj}OP|t2Mi?1%1%ZGaZ zakoU>;si)2m&7@`dGv<2m`7U@Ec-3lX2le4av1KzbuxwX30H-i^pRJBOymn5T`ZEl zi518t4ik@vcf?6><~?Ushr&c_^Z3BhSI%A6y$43|!;&hGBuhOa3=->WKWLl5D!X1+ zSa(Dlt(_*`6Yij;!5fBA!&P?NoU1+KdbtOf@$d|p@^ih(jZjdO$}c;6E|&1vHLWnUuz8eLs*Qci?feu!24CxyhP!oWOV@wu7O2fp)F- zs5qI5)okUl)SVf^_wMqZ5_Bv|f%;_^r|XIu(qTA%YIp{!q*L2Z^b;0?zHkam(op#a zl?#8W5RovHR)7O24;bG630=i)VBub6YJ9vf6)xK{N=x}Fvx>c8_V!bTsZTX!#JSov zx>Nf5`oa1d4BwQZLR4J*fIl9Bj=unTv#R=lJ6;SM!3HYhM%M2vd>Xx|wbcNV`8>Gz z??J8og0?MTuA&qFj$HJ+?0FY+g=GPX_@yfi6W6%`h-rNNo*4NmtlWj$4kgGlK~V!e9!_CEOLH^^xS(ZUjteZuhPDWF$3 zgD1Hec;Xv{OCUC16#O|Iat1W!J|I^u1~2L$NF}q8=6G`R=bRxs1)IuT-Zv4x0GlQT z&V*jVAn-poX;Q%!D+}}9HuR$o&%Bw}25>4p5LC-qARtfR)N=*!FSZk-2P&X6Q73qa z1X&a>|L#XBZpG*?p29!Mll6w<);=7>s51^vsfbXO(9i(|mV=|Rg zs(#&Mg)E{A(}>l`qyCb&DV;S5!ffqZ-C}(Ua4Q?zQ%R!MJtmII84`9aDs~G_>tK0))W39MKTMq{6#`-#( zhk301TeK4~T_Y1+A`iw|Uz2N7vo&yTsVgz%2jabPLK1k?&*1$i&e_3>~dYA@2^xms>7IZmg+VLHDoi? z0@&wD^z%*-%}(T=>!}jfA{Z$;$nICes#OJN{F_jn9eNK!@Gv+(&XCJbAfi&KihqL1 z;ytMUl{u%}j{0L~&U4OVCo9u6T}y1;mdcfmYUD%e>g$!a=xQ@C&Ax&ku@Acfgj8fb*#)`*@OQYc~u!S>T-4 z1rO;AXf?C2S*3Y~0ld09apOjGYbr8vnGWkau&d%#6@T{%&YSMo=&c~(#!!cXnwJSOdkN~l!ARo; zUZ2D(zv7dB5qamP#`PLonug_Vjii*}9q+-Jn#ex)BdRO#XWfUf=O;nGX~M~mM(EEp zo+FvKZ7-hS5HgfZrEVQxkMO=mr7x{tB?oX zMY}4YWu1|WyR4VL2BZkqYXhGYPDkn<^7R-kKgT?}O?n}1lX6oT3Zi$CPiQWd*5(Gu z-J_k(nbjO2SonoiZm2w=dw-9<{tC?+&TCfGe%Ib&y1+({>m@e)nbH%>afj)bUTDfb z&Xa!x38^M0I(uWuw&EuxR-i9<5j)wDQ**br(zd26a9u`5A|wEtV<>*N=ve$(^#u=M1&d0 z+)ZrE1pMMcu4-bvH(~uQqe<_Ok)>$U56}SSkkQ;EGtW&Id>;CG2y49qeHeh={zMKo zbC*rXL29$F{m`jX*qq;LS*)6w?7kQpI*FZH3bU9Fi(teX93@sQ4yNWSw7fewa^rZ? z%{=dac!D8(H9$7K+!U91#WymHd>SuzSqeW{Pe-&S`|91z&#d@%a=>_{G(O}7h>ccs zYX))02r|dz+}{Fh1IRPn@gz+PczfDn73XQ1^HrIzE?|e%MtfFZ9X4WH3e!WZhF-)F zn=BwInMUSP1FLh7=dZ&n9>ad)gVlOS4ZAVlwM5hJaaB9^zbUUijULSB3hTIrmMCc% z%s54mxV&m^c5W6=eM0?-ymd!rbEC6COmTQPIT=A-C9z*2=x{|o=M@&fN+gwmy`96< z!2#}P4%q#J;RdSA9u($J3VZz(^t}n}Q7uh2(;r9p$w|05uCf2Oi5G6OXUDkHlB{Jk zPdN&ou^W!3^F&dDiO42nM;f6SL0Ew|y#FY=W5s$eC*In_YyQ(bCz{^_8`BQ7x(RE$ znpdqy%9bF5rHP|P^8QZPm!o|0c|N~C+$g#6beF*HD#H~!5eE!Ht9G&aN2ol@*rPaP zCmqjxgRH@X76)OkpMe-9z?$Rj*Jg0P_xb!cXy$XOMs2v~8?5MQ&Um}9XtUtT8AN^m zC$HU%ML*5D63w6=Cy2ZbAdRQs3pqfg(MH6T8%yHFD=5QrHpUJ($vKZBdp_8xGDt%u zzWTv@vWAtuLu@t@q{MO9l0sONzmSsN$k9l+6Q=XDd)R}Umec?9?bM zQvWIjtFZh473{fE8`1#c!EpIitF ze2_hi;$G`vOJB3Uk6?ajjqG^2R;D8(`I$n9=8n2@y+E*?=Aw7SVZXTtnn@vc<{8!F zQN-HoSf`8lr|MY5zVxnO0_ILYO()*o&t82d3g3r*C}e>$wUl01*c#k%3wE?SF~xhN zA(2nL$e(zA?@#=8mfinIPMw7BJV0bS0F7r_7q2~y&jcfks$E{JS#NkU?oqw*kX6Rx ze{8JU2P)bhsA~Pj|7^#;WK(&3MYd2-h@sNGhCHwrSo|_xsvG$KUXGf*?B-{rtScII zLgVEn|H$soK(DSNhdx9zw}`tfJpFRkr7gMXHr9Lyzn=}SkEXKyJHtlmOa{sEdH z!>yBzm+?l@i?KMX(U6~5%co$VmPfkdkvA{)$z7!L0rK~OpL|AA>_mq(@HW|?)T9xQ z<;Hflfd9uAZT*eRUS=2XQ{TG9%6#U1DO{-}j5>M$*t>UJ;|?D14U;(zt}e0fSGndb zp6?3pJi>2I^SlCkRSUWE<9(H}J7w9MEG+l}H0~l=y`7k32U?SfM=OY34Mv&+u^#!6 z;9U4D2iFbey>@KWL~K|uq_ZeC^bvdZ8cEB>jvmI^f?vvg=3F2c$X4< zUM=?TI@TnM#CWW?dSxhG&Sw3UiH(=(i$N6mN@GW{dJ`?+DG2 zkh0*5M8O??&0}y6mSU)YsbF`_Pz9Y8Q9=y!Mxn!(1oPyDK{#>tLy>Pz=E zr^7Mawa+!dT}bwoD`{H6Z#oc0<5FS^%|&<(e5nL=hYe;Q5>k%N!#~1Nn6$?(Z;Sai^CdvOQKj;SCmCl0L z01`JIbvIqH2FNqA4g<>)IAX?7HSltSg}@=CVRopgQb#T%wRC%VAO7>SA#>`lNK9Cj zhrK7S5XM`~=Ocqv+tkKBoDo)$5yy&$R>L@jgbcwT%2yPGo9i0TXfym;}2bZi5GA zwI)BAZ6v%T9boAECD&(d{izvm$G5E}_UNcop=x|idL_SAI%AW%qm#2WdxSCSGWj38 z;v40IW;5D(OF!Q{+Avz*TGw0CfjDTivR2B*c63u4XwZql%Y` zrOVd_4Ox#BGqB$;`12L}{S(|bf3oGRNU%&iK0y${eGH%ik%b?tiN@>(H!D~$f;i?x zkCT}d`ijR{gSYC2C;5n$M}VeO7FNFd`1cjO=aJe2slBhJ<0B>PbWLJ|>Ex+3iHKwQ zlxbiouOaSgL`K?;NbfS!D6`Zd++h(sMnQ1Hnxb!e@lj*2JDs`zp&;lU#a}Kbjy#X| z8j0opiKS4~X38C^tG#QfjOVLHs6S*HjjcYG%Vr(g9YHE9!Hq*dau+{}8#a0Z;88tpkRR zrD7}?NXbfublp>do}(li!SOAnovq!hl|?F7K%p-LV=SG!GT>u_g!P)v!YVlSR)FW( zQke*j2Gv`sK9zyc~El(hSmY(+O-8R&A_h=5guz6h>eAAL@|}AI+PSl4?W)JyINAkyu ziZ`?G2&emLCii+GVHxsJ*a{SI*O!xtDWJM_KoVz>-8O|at)>`2jd%q8sWs^3HlFB_ zx|90Y0_2={M;Qt_))Jzk(>&pLGM?>TJTxMIr)*?OrycqFNTn@vI~wlX1iIx8rcX~0 zwT{Ox+~@n5>Tfd4YcS+ARDUrf+EFxVhjWhM8rq^2?t@;k40hPR)Z64^R$`M%f`=I6 zyigP5wNo(Y4q%TD6Fr*2bBq^iQG25QAQzDPGFdTNwu5Cg4E%kAb_)D5YvHvROVzle zQcqpS>|?sPfxhT7@f%2(x0ILCc~1@M&X3i8;yiJewvXL5Hw6e-cwS}kc(-0>sA<^bDC?tww-3aTvkf+eD!RWcBlo#?^>;XqP~vqi5Lgc?*@4# zd}X&KkMe~o=3inPU6}SHGb!De3feA@pm&g)x@}G7R%>Yn3468Q;6O+OH!y;}?=B=_ z6_UROEbAyN^cZl7?_-t9P??W_74W%OACFU68O-cSlw#3L6&7F(zA%l^RGcoDc~?25 z81-M5{7H^erh-3Ph)zgTY7==l^Q57-Z-RlV7S?7TT$h7j0!e3=8UJ!5xbP1-e>tqv3-t$F*^5DHyN5)cBhSbJO|1>};U%y|y;Wv`AKq8^M%=8B zmw3@J*OEO=#V`Ad@_>nYRq28Eiv^W$CtOo!=)lYa=X;)JkZMux%8#)b0+RDglf?OqFkKG3-f39v zZ&c7aP&-NHE;f?4?_gD4sPD-YoLI_x-bjh)vMDH?Ms(r_8B0@o3uf}H)5M0mK&O63 z-Ju)V`2^zP>#SF6JosqrKKOjZADzh#|xF2x(xVvaJFY+{zCf;OG0o*1nnW;3C< z7EC*xqyU%^FO zBj;u2=NNnAM-{#>-Jm>TJ|-68lA5~0qhl%@lQjYXgUe2D3!aKj=Buy18T@BePkA`{XnA}`>%GvP= z_}+!uw%Yol2iw027P&{%#l8`zz5=T?O)xSG6RAxVj)BYfKc;?Oqi!Ro^ z4VGpX2tF&g>UuR>vyihtZ^gPoDrXR;Ve>xHi9R7eRnCK@?htxw_iL@<|AbIAx7=8I zD_y}_)Bv-5k2qG$!(F_`9wx&_a#SiRPr#p_(&UFpEteQAtitC_!}~J5L7!?IQPtmM zpp}r#;?#M@DBtPgi~w8oJo|8&RoTRJ!UeeU?%`GYD6O&QD-{@%VOdIr&vA+{4MhGQ zWaPi-BzK|T@szx~DmLIGo_;sp?Ht#tMc<-?az@so6WhW_VcYQ{jvSx063H2eOD$+Y8S z(!s)5&A((=*QL`^E3yi&H+&*&5!VZ`*w(7dEht>82>HkxtU@W_3b~dnj^|{-dofUa zM!eyXH_0uK(={L(HzOMI@;Yy({xq1L@=D^d=Wx0W;VK`9b5)}0??k)Thz8yeFRvsr z+6H&YJvhrj<3wIhizT#mw8O>z!c1awiA?F0FvHt9XGScB8ct8T78BJooVXI{_l~BX zy@>wJX>{T^JeDA;%aL%xFO(ahlQXFT#F5j!r5BkSp3BBeTSQZHY{tY)KWebUsTtoT zIuAgftWqa=zv5J15%FCkzRnQxiIGAXP(zn8^H)GQM;y_MnnDaw+heLtpNScZ!p2mT zUi^BVK0j5F(IB;s5Jhd8__x?loGpA;Khfp(@&*5-;(vx{3l1bOI1f`N`-d5cMEQTp zG7#yHD=yGxYtSDk53gu-;kEjan5e28jRc)0Uw)zNB;)WC|0nu#vh6?Ejdm$+`2rTJ z4VtnFMEf^Fb?ppoN$}D0h;=ph>5!MJ6vt|7Ak&C6&WqvXv(2{~)?VkCn1i zn2Uk2-BrAWjVOb(d?0pk%B|?Io9K$g!g4c~PQ?qV`7K!gA55ekqF;DhKBUZ{VwkBp zAuOSL3Z5-z;kM8n9DvOlO;u$C6|W|LxV@9<6zs;!t)r{rtw%Gl0*a}T+2nL$`o%Ea z9A}O;ooV&<_>SgqP&_4z?nnLW3sstM7=LC^{praQ>8VaXB>!kfowb=}Jkv)LVb}YM zX!|bRr-nqB7vWIdO*ODTuUJK`GnP|^CDEy-L=0|Zewgrzj8G;6`G;81%euUjC~P?y zbW`CVkwrOlsX2AS^T_*Kw6+W$zYmqJ?o?9RXqu@NShvIM^ISSG7Wzqb$jI!-k}tn= zG7({+OJk+lWu}{Pm+Fm+TIxOeYvYNhw^MDsKov;OCt8UESCDzmC1=UT_Ic~OQ_(ap z@3f6itVxA;3-z}%+}%eiJe9~JIa7E*RhFT%b&%fY4(cbHsrrm2 ztLjd#r99K-eRy>p{{2GT@G?_82k|Nk>15WTGB%Jd&vNxPx#>(I_1@GXLA>Xy8h$vQ z8KYWcnMbL7-ojr`#@_xWrmf8!=7v90VYS(}3-oN>V{hLxX|S7Y;WqxT2JwxAJ>12$ zLsg4v=1wkA@47|wdj3yOA(Cq0NwSt?ruW7YA2Gkc#8Of6gMZnJ9A0yd%GCo+bs>_f zM;m4riqY>&V+Z=sX)30M_@7v3} zeCTT=5i=z-vvO65;rkyvWe8Idk6}6Yp1O&kzY|5|bAd|BC1SuBp)X$NG`U9~GWae$ zMSXVC%S!r^I%#QSeKPrfL$o3Zi{FEO(iQ6Zoyl_U5owJj)*7MN&;IwuFSS8NOAz_B zWd8$smJY&bm;nY8t5hHtQk5?37A&9qPRs0bEY*b7R0)S-*UlmJrRfvDfma8aVWy%5 zJ@zehW@n=%6{$!hV1L_k#|>GZ+|2bHrGJ%4MKBL6FL7i&rFk9axu}0j%;9W-_wEIH zQ5=qk@#s=6qQ-3Oct?8gA?QUA)fw=(sdqe}$~m99g)cGkVY2#A`f59cAAIg2y3F(7 zqHn0Yq5swsEe}JBQpsgAkkv~>vulyIN>pl|)6uSqlwPDWvw^x%65ZR6 zrt0C;`3U+maZymT8p(kE(1AJqy>HLXO(N~wRdj)lmP zEA#JTEZM3*y_jeu?h~=^G&)W_u}p=jssD==_zPVKMgH>;OWvn~G>+$vWS3_mPgT*L z!Q{CG`F$k&cnX<&#y$PZb!M^-b*O+(dLMiWEa;Wfo*u&c=&2RO)CdyLg^;&QJX8 zWoaMH6Cb0S@SNHfbp?7IE^JMEWHFPetrSJe?mfiAfB5rNg1pSjyYPalsT+%So*pCK zmU`n7p5Xy^eUa5ZkIen1Ytawy7X$nGBs|JnvYZZFQ@~F2LkmY!!HK{c-%!218&SAI z{@#<_`h-lk!CF71>c0R>@tZzG8O>JivJz7W4VhUPK|Ny!{<9ftv5OTS&njz}2U4+& z6{xWlrPK01I*Bu|-3O=_)c>gKhXOt{beCg2OM(C2u_ZivEFY=pO~6h!s@ zGm*+3>Tx5vL%5xgo$FX8D>_gTtL5OG-keR#^!*UBnBnRaIyHUhOzdD4SCc)iLCcp@ z9X!f997Qq*pfB3Z`f%CUk!?sxF#eu1$pL2JpT@M zU_PIdiKV#s$6J*9GYRk?pSvELx|bCai7rcHnd{JJAPS&{dyUmK%BUyCcQ9(95rXbgm6uk#wXa zhd%ICJ~{1=1T14F?l?1MgZN1ppHQ6sUN6>COU$nDS}PiI2l-u2mUDscPGcSVa+l=h z{K;T%RGwoNwjdk5jAI?j(lz>m6&{R!H$p1B`@RBQzQ{b?5vGbf%mm%1{+1sWh4Jjx zTqY?xDjsG$k8KS>ERxYnyp0N zO|dfTh}(m>r^ZAqCzP`E@51rfo$)Pe;V>J?E|%tR1HGRtYH@{xdO}rZUrGtX@ezkP zVNsKa<0n&CO^87f)OmbvUw%7@C)|skwL`8Q^hWxkEvKmE45OCcf{EG|M0=yjiDnXs z#9|HF6M2mjtayP~>d3pXV}*H^Z`eFgYhZM!K{sn7U1D#f@0H-9ta>w6s3NQ7CIahB zwDVIb!1Z>bi?xVB1~D~IiYbD%u#%qV4wIFCxR)Nt#T}{;OQ9_xJ%d*XxLXpW?1AfKz5KKZF=uxT%`@gM0tjwgECL9F*L?`VtVJBdvFhtHVx zC+=&FteixqXY#u&rh_)&qmO|CP@gHaZtPtGQR;Sjy=}12EvabkBIZ88T2L86YtJJa zsaUm#+~Y6Sx;u5DX~f${@elt}JF_C+uUY?jbQzD~TQ;$tTllQntn)2wia^hx3$}MI zQtVI6e+Wzd0=?@`PFsRq2*Zxrk!m0IEs3kagG;6TE>CbAFSH0*JdfTS;pch&%xyGB zt5zY2+lk%!Fi)@v$+TfZ?~rwPCp~)bDI%V=F;<~8^70q|SLj)EV{hwVJN#G;ssiZx z4kTj+Pv}68pRhYV^gaGYjyCZ0oAJfHSdU!Xp^oQ%ge{;e!rt~^rJCU{-1zuuSb|0T zECK&$!RG&m?Q4rf{NS_OuzwY}^UX+J0q(V!P*boI2Ts6~@1;U^g*>D#misGxsyAdb zrHGM-Fsm6vEnxuhM^z+mCbn$~PkN8tEkNY38%^y_oKXWG_?Xo!&oe#e`AgvcUSg4! zV}%p(edpP&By77M5uiU7PA7Qxb0qRuoo6bBc2SE)CQFbBS0gTKfIZb?FT0^#ZtOZd ze%P~f=v4uFE%)#^aoGD|*vVwRe@VuWir%&3-NRX@)$Bn()@~l}@uI>UMlN=+4u#>p z*pBaeOJ6z^J3RwWf0Wg&&P?bw^wh~u7P4a(knF1W;>jT}|O zZ>?wV+p?Ptv4&l_yPjT+CnC@=LpYPTXe<_@58rKP1*)>bmAn-bJo_f>#s>6dDu4U1 zdQ0*8ckwlGJi&e>+L!0+i8SxzS&p&RUWxI>T3$a8g`~uwLq%At`8=KXw_$%G*tPfo zJ@Qf!o4<|q9n8v^dG!OXwh;ZCiEp=J6KWD6l%aq2ANN(0NVYN4A>D|uv&ng*$!Q+) z%7)B+L=i)EM%umI+=JM*5(Ge|=W`<=Pl_C>Y{2QqlPfRp{*Nk8lW?>nABlF&;{EGhwMs|*J-)pcN zQ?PKqU~=t&>@Q`vp5TQ-u>#b2_>@Du%ZUg4hCaFQPGiZg=JSasnMqIQ{{xY+YwT!w zw7-M;naccY;=xEF)s5`s6#T<5q$LsS+MIiyh8Eh1nhqhIS;$%zd$0(zBe4*-;}a=l5IRg7*lLFu_fb)bhdK;Z}3_Nh+ae4`%dIhW7ykW ztc4#dor^E8rsg2qgSbBpG1wOFq61M~Tl~ar{BAP8?T8HS#%k@O8jzv1rK>5?(;m*< zCex{3iQgKCR=pwG4`IqEU75huPt)%_iRYV(Hfl8kiNErIg?@!vLOvo%j8K=vW|8+Apr-ON46Y8Y9W1U;gQ?ROOS>@DZ0;za;J;M_tIwz-xNsKEfql z*9!|?hz`*XY}R+YWHIiz0-rY&Ki!_l&O0?+4a=#;F1e^;kLIaku^XLuXI|poMcC~s z{LUBqs-dJ)b}z^56@749G(RnUeQBCGiAHug6c+45zw*Urf7 zD1KL(x#vm9li|Ec@{TNIAQDxST3cCq zG#Oa=zN}dq(%a}y2j4qoJP8TS&y-_zCYVh~hIbmT6FQ)1u5vF6xx!=o;z+zu0&CWu zdsK)_<5>0mSfs_=;|=t?E|%^wcIh`>i8+=(8OnaHrAG@RSdj&+*j{XJ33To;k?>5` z_$xAB7fWtKkIoT2f;z+%{59{e+Qa^QYIF8{EmfI1?0XG%qV}IiB;}7xNko3TxaJks zGnUUDNGu+O-!I5qc`{X~?Zos(YHJ6uU#F4nKOzz*Fy%>zlrEuNS*h=q&qKA2D9qX{4cf;$B^~r_B zDuS--k<-2GZCAebvsw>{Z5QL|_7WLHbN$&^qXkS*9^?er9;GmA-<@?2VhsY=-S+6l zGS;>edXs=}%0qO$gZCH&jc^UEOvg9p;fnt;wf*}~rRxfJ9l`Urr$R6U|K5VRr)@~= zE^1*FshJI=_A`jP-;VV!$xrHF8S`SL9Qf>Dc4Yv%bq?FT;7?|$AwK*I4G!my>SOi1 za`ugNOT(6@DYb~YQ}GiPy1--bp!xBn%c;h7=eO0c8?D%_7U=#}>TKJTm-M?_)J$&T zi(`@4rg?FlKHZoKhTj`B`gIV(;ng@TP;nnQRJD#8w zwHGlYlYpZ&7Ey0w$~G%&O<^EQ+1fe({IGaMRMA$1@}CcyB<#5 z`jX$CL;7LwrIXzQ>r)14$jhB>CgNSkGYud{bs{^RdFoi!JqSHGg=X#Ks$2NmjKnWt zPnxrekLeS5_oEeGoJz*-WFb2TS+VU{x|ev8THNUbEWu3VS4D@`k=+;l(?M9uo`2`l zb$p^72^oPNwWbmmrQT8o;-gPcubz*E$&HQl&d~1Qo|^EAwM24NxxyFZl*kKvHW-UD z4{LZ3zc~=wQwgbFj1Bc-&ON{~_a~CoP?fF0p0(lm2cs#a@D(|D^eEQBTjzEo8=KjO zXZX}t_>hm>&r`gJ*J>|AR=zOvH&K#MgrC#jVJJBRna{GX(+|> zw#L%+;j_Ke%=d7eVaUN~)?hnV-GRMXNnD&l zvVX#58J^L1A12;X~GYzMOOKV&nUtiL4R_a;JFz*TOdKcBd_{an*q6MIXX8;9)X zuu@ihRVY;ee_t}S6JA3?e!cS;D)kW$(LfL}$!GGRbSjV)k%poCX@HIF ziiIq~J$5ATKS-zL5Np<$2&O!%Se8{*h>3ya$3yjHCHtc3z4^r#ymBD~6^-u-1NjMsBQZ6YTABY@$hi| zw~A<|8&4ICX0=9oyz|Vn(8NzXyM&j|&F419|6C+nJ;$Dp$KNo0L&d_zP7Os0YhpoG zW6g(S!w2GbYqI+PZ|Oe3tg5ay0Hc(l4Kpx|^xi>=6cLo(L2(3B5T!{1Bw)h?jEYK7 zA(3hWAu4KOVu7KAZpDItNN=N&Hh{oT1cna(yRQFppL^$)bM{{4Ti;r{oHMDI;3irP zf#es-f43H9(quTfZo^k4+3F|jy}enZfqsX}A=71nmsEwbWag?Kd0Ffo(fKGu-LJLt z_@}vkJ7}$I!nf^7J4IFTjOsjgs;_~tsrc=JJDm2mrngAd_ndbzKU)b_j=V%B)i+LM3W>{}L=Y@mlxq+5=AXN#Q-GhI`yW$uzo z|Kyk7Ct7Gs^LA|0-t$e~{mAPQ?JdV6i;S+Out9&aPd2BRBS!D0O$(V|g-9ETNk8Mw z?R;8|x8K58lliAFmT5|^#t?J|J%(ec?mX}WpY)?y6`9~VT)Ts2<1kYuF3Mzyb&&Z2 z&X{CQ_YZPjjG-5a$6D-u8DGbp@BDXC(bEM-^R5ckz@L>Tq)i@!{Qf>N3Y|xHKOoq z@2a!hMEHN7Rbq{)h9fJA*O+x*$`+nm3cEoREucgZ$W=)Q%lrxW^LZ(e4b zjFHJ+OVy;y@XtHs{0QgAl?8Di{%0In+K{3>&zxt|RTyxH*|+D6=c2;s zBF-LV-(To)REC<(KQHmwdTlSkcrnA6BMZd5UohV5tT9s_+d|{RSmh^U?zqzGKKNTLvJv(+_8vg{_epnNWpyiG`#-o4P!gu= z(zgQ7#_ClWI*%3U2kG|>t_uCG>ZOb-F|XHjcOZGSf-zAHS zD=c0TPDhbspmE=W^c|+JqAXR5jHz@u<%neGZ}rG#&veGz#jTIdm+_5w6LtS0zCZJy(Ls76|g|3SSd;oI4XxyoUxmH{wW$A~PIp1oA_ z16A?;#6euGm&vxP$iGi}duUM+6Sm`*V7Y?W>?rt0ibY=>xwv-V&=&73?JIT;()d%;G?0Ux^;*S_DEn(Y;>T+uT>iBoBSjzQHEfH9N zPkPXyF7|b=M0nlfm+G*Tu9eQDtV7Ob>XMiBVn$w-7A{gq|W{^A)U&ocJubPe8 zZv67H$}6I>91o1V>oN`Jh! zRpjP6>b&at5(K9~{{=0b_Dzlmh}|M{@z*Mr%=P%Ezh^{DSu)gP(aJ_p_LFLD9F0=R z-k1)}Y4e!cVE`H9+Q6cTSf~JfvG!cl4#~56UM}w~S4TdyBcmJE0(ghRY{FHg}nx-amPc;_{194 z$Kt42Vl+F+yvYEF804&UvG|1djp#oHrtd3ye z*&*(d!7>P0SIlH_ki-F#WoPH}W-bAu) zBDx}r?30PtC#u_Gtb7N_N73OXy={hv4^$IBBt~rC%Q8#o{a@%?puU*m?>xWlhnT2o za=eRt(vE+|V7(fw+=6vS@_c<(I)Q_)nMJvo<#V8IvHIu@xpcnFJl%}QWZJy}+cQOV zB}c_w7f#6SF*_M`Y-4Sv^I2(}P+L~)Y<2QeXT9S1IpQEoB&?7JZlGmPx?W|qA_*(* z^8Hq=e~IyCkz%*=KBLoq@w1*Kn`^y-Ir1!Hx5#W+zC9xk`41Q*vgc3_3+431EHKY= zwe~*5c~fEFEjee7`t0w1nawJ18b7?r9=(i>Gt5psqMz7ZIFYaCs!jX&W~f?l2(4d` zyF%mF^t2LJe6FPhZ1DygJgD7;`uOZdQMhDO~=-y&AsQ~p=8KO;(!JV+u!1qODu%@uuSLBW2^G3eCM!uE2w}CVO-m&-r;dM9ftC-)n~RAEI{$UTKIwQsH_dzwM*z3O0;A z8l%nFWvEOBvClNtU20~ii~9KypVw*gc`G!t#li-t_^nPThqH!Yh_wsrI>99sWgvJC^Ee6$`I7=kX(yUxmA0y?c%A3)n+E zS)HEWoc(JseZq0;JU6O~ws_5^&vw!rciu{^T*b0GoP7j}t~l~XpG(m;orJaJozli~ zr~ZHLrw%J8sr)uOyAn&5!F`okJx#>b#1(n{mX0U)X#ZkDwreWc;$k*M#XAy5)F9s} z(X&&m#VSb}E2L|qGH+FfirYo~ofxK{Uw^CJYLca-{8>OPb67h^#dKLxloxkLSmOj{ zJa4AGpB$KEEK-;pQFF#PA(zJUSvK358(^l4@kmJai}x|VAESglqGXT1v)HznY!>6I zTzMzAF78a$;~aJC7vg9>pDlv7pS61<>?Y&7-}Y%O<%{Opc+`B!9JyhP*`wdn?n2BU($Y1nW_ReR zy*xibp8i-ZHAx?_*N5t&Ct<7hhG4i(qS zM|<>i#5g;J=hMhtQxDTU`s*uZ6Z**R)78j#ip|@wc0D=24JPPG)3__qZ+EPScd>35 z8KIqXlA$cd|`C*H*wuzS&iT1bPzgw_z8CL&Pe=GF$ z1+LkI-}cdFJH*C*(oV)&E+^fEy~n}M6yMKv&SlZ^vmUZt`E*xerfCI+ z+)URC^zWwPeuU4O!D(4@yt`zUTC5bK`}2t&7LeXSTTYSGP?qZkwdO2q+ z#(vi7!c?sNwA>YV9qaKJeq4&-V+J6H+&l2hR{3O;<5t1-6L@)`47galMlM{XO8Cb4 z{}i2PF;)eb`J4n<_`f8!?x41RS{*di`w_+k6QJiS9KS{jvvJ3A95Y_l>gJwX4Xqv| zTe+%AmM{IblXbJ?xUgH63SmC!9(4Qx|4*bazdQl+PeR76@KgZG4q>xiaMMMPx5{O| zlg(N~=}0!X9Sd~uIqt=Cug`&wYNF#I_^##1sCDo6=_8hnaZ5GG>J} zdk|jaiEQ)K#jwjES-+|yyF03xs6NboX*?R0>>d_eibIn8a>b6}UwO8jbH3w?REQYG z!=K53U9C`-7bmZ(D87Np7-Q{|yKYtG{z!)QqB}1u^@79aMCK4N8!L`;<=kC3YmPOU z{o?0ua{MQ-^n?6zN=pT?#x<{vSw42$#oj z9TaVm4G*&1n~B-I8RRXfCV3_?^Y?(rI4DxwC(Ppz1eP|E>WQCXW~aQ-)&TnwUbeEH z35V0k`7bl>!|-GkQMd^Y*QQ}UyP6jJ6gzUZvHeNUTyo^%$qlTzmap%J#+vG_{ARcQ zCoeW)mySkPW8f@SARd5~46ncQ?Feic>-odje-woO1(rUsx909!`F?L7P49^W0i^WLF`tHRnAT%h`FYES_s5+DN!_*_oRrenR~&W^n?XT(;VU5+$G$?z*X#qQ2Std}FM*6`;$ zd=**174}*`!N1#C{R@6rjt9$_Ln+2D#~~nFbRFc^sAZ1%wynpFShOk&RHb8S2(QY^ z%TqJ01qPw-6l?M$;8PkPKZL()sutU<@(a@H;U{h{4J*;bSL&^Zs=os@@K z=(&SFqe{9=uePd{yz2X?WQya8n`n}un)^gP`Xie}6){8&9M^#@qti8d$By!o&NxZ` za;k@&GD>5N_AuFQluu(mx)M1aQYXzM+w)%khO_$dZmh{(#q8bawE*j7VzrnRSpw&8 z%N_4xy{9~0vJYak98;7$r{$fG9C6W^asRN8{H*B9HijRq-}8FBEJEhtpp~kZAJp34 z^W7;vJPakvaL_ZJaj({YX?FoVzVcWoepd2--0|su;yU&{{o;%jB7YN4=T~#?^-I)I zQ{|LQzhskQ7aXL~wLAW=ggZ{N$|h~kl(Xh(|3%0D2U3?f`&~@^M@! z`ma7W&^&TZ%yVuc>uUNQ((f_$-RajXvJ?_SaTlqWnJ?~&h)LR9=ZuOxT|?xogp>Uk z;gZZ9wM5*9?`3`b?3l&uI707(jcy(?GFeFH`MzCAlkdqhhrKds7vFp-D?e$LWCTl% zv&u68!%tJ6JaO%M&pdEamED{3+G$L?kp*Miwo{(SkTE8zS?9|B_ozR{(rqIoXOZ(m zEk5Mf6|h|pqoncX8d~L$GXvAD#f>rlmtXOnWoi%jdnWid}Zmir}{W6{`|Do$SDEStmHmVwn!(UXq z2QW((+(o@m%t$L{_~L$HYauN#u?u!m*fQAcnyh%hciXkFjaB0Qn_oIVMRXp(RP|Y@ zI6L*jw&`-mVbAQbls82%6Xi9O4U(?*DLTtj6{D*j0--; ze3g9@_topiCvk_bWd7+dqRX+#FYFn6He<{i8jGa~(PY6ccu zZg1ZlvP_fBBFFxuCbH{a4bT=t$5^SkY*mb`C0Tu_Z1yM{9}+i5?SdIWnsI7`3|VrZ z>^qR$W9VH%Ume+EAja>izo+#RJAK~M!h`Hl-x2xvzZw0`u;p%TC8-VrWpN$TW zsR!WfBXF|`B6~RVU2?ug&+X>Tdue@eB0pSUmAdl%5PmH0U94XekbevNPX`NlKCZ!7 zFBW%Wj7jW0P=2dHikrO-BbV=A{K2CQ|8&<=%ntN(+zzpyD=KQr%y}HS7YhWdT}t4) zwLarM;MZ#kHgpg4{*Dj&j0`b literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/readme.txt b/modules/windows/oodialog/wav/readme.txt new file mode 100644 index 0000000..bfc128b --- /dev/null +++ b/modules/windows/oodialog/wav/readme.txt @@ -0,0 +1,50 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +Because of restrictions on the redistribution of sample code, not all of the sound +files used in the samples are included in this directory. + +The following ".WAV" files of the Windows directory are used by the samples: + + CHIMES.WAV + CHORD.WAV + DING.WAV + TADA.WAV + +The files do not need to be copied into this directory, since the sample application +will locate them in the Windows directory automatically. +All of the samples will also run without any ".WAV" files. diff --git a/modules/windows/oodialog/wav/rhino.wav b/modules/windows/oodialog/wav/rhino.wav new file mode 100644 index 0000000000000000000000000000000000000000..d30bd4e44ba1a7304a85d5405f2d2b023c4db026 GIT binary patch literal 62322 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%0AlCwLB7mZdL#Y`Cia82ZUDyEtzW!R2lUdAC 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/sealion.wav b/modules/windows/oodialog/wav/sealion.wav new file mode 100644 index 0000000000000000000000000000000000000000..2a3ef696af743494670d52de6711475d455bad7f GIT binary patch literal 77240 zcmY(s*>WUFmS9&c!UsO{3n+Z&N6Z6TWFBT@s;gO*nUNU_BCszGcfj|3UjYXkfCC7` zk`a*^S(&wVRZo%9oDmt}m+_pdhODLma5qy^y}Mq$s(Q`vPyg{B|MAcN`#=2RH~-<+ z|Hszh>Hqq_{NfkC_y>Oew_pDv{{G`6}h&8#Z<_!bwI+sXk`T}23jx&7He|DN&!sLZQqN!Ht}BI79=$EGNhcOi~f7X-w z5+t=`K8P1!!WxL=ul2|zx4cV(z#7Q14@pj^d~xEnaHK3q5Pnu_4Qr=5Sv_G&VnC;| zFhmoS#dSjPGZ2a7LZ|_YvtGBCB%&%P1(?nIl!7bBvV|v)1<`85TV;WR5s1=f!H-JUS1Be&wuU?!P_juHSd2X9v4K%%zdubpX;Gj9cDLi0W(tKtBh z5YfVW?S8LCg`R|TS`g9AgTC7gxP5fg?s0IhjiClc&`6$y(@^bF(&;OwF#WhIF4<}M zWp7Nh2?0=&orL5m*I~a%7)(jbNh)zqad;_L7)vw=0v;&zh?cUwoxPOIPQ_gmd&tFPn`MKkMmo@1@OUaQl}!>6(ZAasBR zRH<_(5h#@|l~Fn0oU7CjAFAVAj)B%go3xhY_@r3*E0IU(fv45&)8J8T-0Y#`P`1`& zuZVVP<&j^C+MRyLS<<+Ozw`xSnU!9$2oVyr|hO9es0^kqTZumC})PQyh=K3Z@doKvxBKeaVnfd*=+M*;kC10nk> zpm4E5;g?(OXvaCNXd!MdJc4nl<`8Fi5ebR<;m06G0MZscj(qJ7y2YGhC1fcNNgqKKLj5%(TZ z*~D^7sg&TwrR5pS=tmNyLD;9FQ8}CyO~!q(xVwdB+f_!(vD~> zKXhPepiw5#V2EPq`ngkhHzXOgq6UoGtkul=R40ZTDnjlfCjgOCeuGp=;nXXwHi^4a^`*T2+P`!BWhGh5TlNb6(g*NEqiH0s{kgT##aDRPHIXE z4s_`w@Q4+O`H`WQhF~ob5u+NXiCk&&g37oyOq;4mbV(b{IGSj&Qlh+qtAHNJgQw_H z(3IJqGzHAK=@~|iccmDhYBiuHd8pjX=4lQBD$v(tLPyf-F1ee?5POg-U+HFuNXp`t z#wXKp$PA?%@MBpt;dVw{@a-+@#C@wkf+(z%%HpmjC1i{I@K=kBmZBC)ib(wSh{|yb zuv`a)u&Pg#5lsx_ac~wS%D%utHCmp)X#5D#=Dkic-|j6L7cxf@jci9lsRVrTB8;Xn zj`XQ3w(wj+=g-jvu<;#SiS`kVRB#87fnS*1@;oa@CuJt>s07;4xY# zRrpA(1;dh%N~oZ8(g9tRh6*fp;HCeECy-hRj&JU9H#Gz-M~qPR2yR&E-yLcuwbfu1 zMe1OW5)TrkiiXkIX`5*#q?A#Z%-ajGhp8qck}u)_AcdR+Bi>HeBBfH)fx+P2n-UuI zSe4tlfRL>>#S=%c7grWgDi^}wFBp4dI3$`{{ai&siN+(EiU?pKGT;T=`1%=LD$9V= zI7kZp$`6MhLhzhJRZxVmlK7%4NL}b%HBrM>$uu|(e*v{N4rwGf*36E$!mzpGjc!K3-T6#$<2YHAxVU>5zK%cb=4A@ar zfPCX_%50J>qCSJtQv9IMNu?$NvSV+#t--u_SjYy6ANl z4G>mu+-Z+`opGhztB#~A3r6KaZ)lN##gLs;H2|2EBjHIo-;x>iDT=ycqK-9`Zs^{7 z-VSX^Jf%@RK?
    '
    +       Leave                               /* exit loop              */
    +     End /* if pos */
    +  End /* do CKWEB */
    +End
    +Return
    +
    +COMMON:              /* Control blocks needed by multiple routines   */
    +CVT      = C2d(Storage(10,4))                /* point to CVT         */
    +CVTFLAG2 = Storage(D2x(CVT+377),1)           /* CVT flag byte 2      */
    +CVTEXT2  = C2d(Storage(D2x(CVT + 328),4))    /* point to CVTEXT2     */
    +PRODNAME = Storage(D2x(CVT - 40),7)          /* point to mvs version */
    +If Substr(PRODNAME,3,1) >= 3 then do         /* HBB3310 ESA V3 & >   */
    +  CVTOSLV0   = Storage(D2x(CVT + 1264),1)    /* Byte 0 of CVTOSLVL   */
    +  CVTOSLV1   = Storage(D2x(CVT + 1265),1)    /* Byte 1 of CVTOSLVL   */
    +  CVTOSLV2   = Storage(D2x(CVT + 1266),1)    /* Byte 2 of CVTOSLVL   */
    +  CVTOSLV3   = Storage(D2x(CVT + 1267),1)    /* Byte 3 of CVTOSLVL   */
    +  CVTOSLV4   = Storage(D2x(CVT + 1268),1)    /* Byte 4 of CVTOSLVL   */
    +  CVTOSLV5   = Storage(D2x(CVT + 1269),1)    /* Byte 5 of CVTOSLVL   */
    +  CVTOSLV6   = Storage(D2x(CVT + 1270),1)    /* Byte 6 of CVTOSLVL   */
    +  CVTOSLV7   = Storage(D2x(CVT + 1271),1)    /* Byte 7 of CVTOSLVL   */
    +  CVTOSLV8   = Storage(D2x(CVT + 1272),1)    /* Byte 8 of CVTOSLVL   */
    +  CVTOSLV9   = Storage(D2x(CVT + 1273),1)    /* Byte 9 of CVTOSLVL   */
    +End
    +If Bitand(CVTOSLV0,'08'x) = '08'x then ,     /* HBB4410 ESA V4 & >   */
    +  ECVT     = C2d(Storage(D2x(CVT + 140),4))  /* point to CVTECVT     */
    +FMIDNUM  = Storage(D2x(CVT - 32),7)          /* point to fmid        */
    +JESCT    = C2d(Storage(D2x(CVT + 296),4))    /* point to JESCT       */
    +JESCTEXT = C2d(Storage(D2x(JESCT +100),4))   /* point to JESPEXT     */
    +JESPJESN = Storage(D2x(JESCT + 28),4)        /* name of primary JES  */
    +CVTSNAME = Storage(D2x(CVT + 340),8)         /* point to system name */
    +GRSNAME  = Strip(CVTSNAME,'T')               /* del trailing blanks  */
    +CSD      = C2d(Storage(D2x(CVT + 660),4))    /* point to CSD         */
    +SMCA     = Storage(D2x(CVT + 196),4)         /* point to SMCA        */
    +SMCA     = Bitand(SMCA,'7FFFFFFF'x)          /* zero high order bit  */
    +SMCA     = C2d(SMCA)                         /* convert to decimal   */
    +ASMVT    = C2d(Storage(D2x(CVT + 704),4))    /* point to ASMVT       */
    +CVTSCPIN = D2x(CVT+832)                      /* point to SCPINFO     */
    +If Bitand(CVTOSLV5,'08'x) = '08'x then do    /* z/OS 1.10 and above  */
    +  ECVTSCPIN = D2x(ECVT+876)                  /* point to cur SCPINFO */
    +  SCCB      = C2d(Storage(ECVTSCPIN,4))      /* Service Call Cntl Blk*/
    +End
    +Else SCCB   = C2d(Storage(CVTSCPIN,4))       /* Service Call Cntl Blk*/
    +RCE      = C2d(Storage(D2x(CVT + 1168),4))   /* point to RCE         */
    +MODEL    = C2d(Storage(D2x(CVT - 6),2))      /* point to cpu model   */
    +/*********************************************************************/
    +/*  The CPU model is stored in packed decimal format with no sign,   */
    +/*  so to make the model printable, it needs to be converted back    */
    +/*  to hex.                                                          */
    +/*********************************************************************/
    +MODEL    = D2x(MODEL)                        /* convert back to hex  */
    +PCCAVT    = C2d(Storage(D2x(CVT + 764),4))   /* point to PCCA vect tb*/
    +If Bitand(CVTOSLV1,'01'x) = '01'x then do    /* OS/390 R2 and above  */
    +  ECVTIPA  = C2d(Storage(D2x(ECVT + 392),4)) /* point to IPA         */
    +  IPASCAT  = Storage(D2x(ECVTIPA + 224),63)  /* SYSCAT  card image   */
    +End
    +zARCH = 1                                    /* default ARCHLVL      */
    +If Bitand(CVTOSLV2,'01'x) = '01'x then do    /* OS/390 R10 and above */
    +  FLCARCH  = Storage('A3',1)                 /* FLCARCH in PSA       */
    +  If C2d(FLCARCH) <> 0 then zARCH=2          /* non-zero is z/Arch.  */
    +End
    +Return
    +
    +IPL:                 /* IPL information sub-routine                  */
    +Queue ' '
    +/*********************************************************************/
    +/*  The IPL date is stored in packed decimal format - so to make     */
    +/*  the date printable, it needs to be converted back to hex and     */
    +/*  the packed sign needs to be removed.                             */
    +/*********************************************************************/
    +/*  Converting binary fields to time of day format is described      */
    +/*  in the MVS SMF manual.                                           */
    +/*********************************************************************/
    +IPLTIME  = C2d(Storage(D2x(SMCA + 336),4))   /* IPL Time - binary    */
    +IPLDATE  = C2d(Storage(D2x(SMCA + 340),4))   /* IPL Date - 0CYYDDDF  */
    +If IPLDATE  >= 16777231 then do              /*          is C = 1 ?  */
    +  IPLDATE  = D2x(IPLDATE)                    /* convert back to hex  */
    +  IPLDATE  = Substr(IPLDATE,2,5)             /* keep YYDDD           */
    +  IPLDATE  = '20'IPLDATE                     /* use 21st century date*/
    +End
    +Else do
    +  IPLDATE  = D2x(IPLDATE)                    /* convert back to hex  */
    +  IPLDATE  = Left(IPLDATE,5)                 /* keep YYDDD           */
    +  IPLDATE  = '19'IPLDATE                     /* use 20th century date*/
    +End
    +IPLYYYY  = Substr(IPLDATE,1,4)               /* YYYY portion of date */
    +IPLDDD   = Substr(IPLDATE,5,3)               /* DDD  portion of date */
    +Call RDATE IPLYYYY IPLDDD                    /* call RDATE subroutine*/
    +IPLDAY   = Word(RESULT,3)                    /* weekday from RDATE   */
    +MMI      = Substr(RESULT,1,2)                /* MM from MM/DD/YYYY   */
    +DDI      = Substr(RESULT,4,2)                /* DD from MM/DD/YYYY   */
    +YYYYI    = Substr(RESULT,7,4)                /* YYYY from MM/DD/YYYY */
    +If DATEFMT = 'USA' then ,                    /* USA format date?     */
    +  IPLDATE  = Substr(RESULT,1,10)             /* date as MM/DD/YYYY   */
    +If DATEFMT = 'EUR' then ,                    /* EUR format date?     */
    +  IPLDATE  = DDI'/'MMI'/'YYYYI               /* date as DD/MM/YYYY   */
    +If DATEFMT = 'ISO' then ,                    /* ISO format date?     */
    +  IPLDATE  = YYYYI'-'MMI'-'DDI               /* date as YYYY-MM-DD   */
    +IPLJUL   = Substr(RESULT,7,8)                /* date as YYYY.DDD     */
    +IPLNNNNN = Substr(RESULT,16,5)               /* date as NNNNN        */
    +IPLHH    = Right(IPLTIME%100%3600,2,'0')     /* IPL hour             */
    +IPLMM    = Right(IPLTIME%100//3600%60,2,'0') /* IPL minute           */
    +IPLSS    = Right(IPLTIME%100//60,2,'0')      /* IPL seconds          */
    +IPLTIME  = IPLHH':'IPLMM':'IPLSS             /* time in HH:MM:SS     */
    +/*                                                                   */
    +ASMFLAG2 = Storage(D2x(ASMVT + 1),1)         /* point to ASMFLAG2    */
    +If Bitand(ASMFLAG2,'08'x) = '08'x then ,     /* Check ASMQUICK bit   */
    +  IPLCLPA    = 'without CLPA'                /* bit on  - no CLPA    */
    +Else IPLCLPA = 'with CLPA'                   /* bit off - CLPA       */
    +RESUCB   = C2d(Storage(D2x(JESCT + 4),4))    /* point to SYSRES UCB  */
    +IPLVOL   = Storage(D2x(RESUCB + 28),6)       /* point to IPL volume  */
    +If Bitand(CVTOSLV1,'20'x) <> '20'x then ,    /* Below HBB5510 ESA V5 */
    +  IPLADDR  = Storage(D2x(RESUCB + 13),3)     /* point to IPL address */
    +Else do
    +  CVTSYSAD = C2d(Storage(D2x(CVT + 48),4))   /* point to UCB address */
    +  IPLADDR  = Storage(D2x(CVTSYSAD + 4),2)    /* point to IPL UCB     */
    +  IPLADDR  = C2x(IPLADDR)                    /* convert to EBCDIC    */
    +End
    +SMFNAME  = Storage(D2x(SMCA + 16),4)         /* point to SMF name    */
    +SMFNAME  = Strip(SMFNAME,'T')                /* del trailing blanks  */
    +AMCBS    = C2d(Storage(D2x(CVT + 256),4))    /* point to AMCBS       */
    +If Bitand(CVTOSLV2,'80'x) <> '80'x then do   /*Use CAXWA B4 OS/390 R4*/
    +  ACB      = C2d(Storage(D2x(AMCBS + 8),4))  /* point to ACB         */
    +  CAXWA    = C2d(Storage(D2x(ACB + 64),4))   /* point to CAXWA       */
    +  MCATDSN  = Storage(D2x(CAXWA + 52),44)     /* master catalog dsn   */
    +  MCATDSN  = Strip(MCATDSN,'T')              /* remove trailing blnks*/
    +  MCATUCB  = C2d(Storage(D2x(CAXWA + 28),4)) /* point to mcat UCB    */
    +  MCATVOL  = Storage(D2x(MCATUCB + 28),6)    /* master catalog VOLSER*/
    +End
    +Else do                                      /* OS/390 R4 and above  */
    +  MCATDSN  = Strip(Substr(IPASCAT,11,44))    /* master catalog dsn   */
    +  MCATVOL  = Substr(IPASCAT,1,6)             /* master catalog VOLSER*/
    +  IPASCANL = Storage(d2x(ECVTIPA+231),1)     /* mcat alias level     */
    +  IPASCTYP = Storage(d2x(ECVTIPA+230),1)     /* mcat catalog type    */
    +  AMCBSFLG = Storage(D2x(AMCBS + 96),1)      /* AMCBS flags          */
    +  AMCBSALV = C2d(Storage(D2x(AMCBS + 155),1)) /* AMCBS - alias level */
    +  If IPASCANL = ' ' then IPASCANL = 1  /* SYSCAT col 17 blank / dflt */
    +  If IPASCTYP = ' ' then IPASCTYP = 1  /* SYSCAT col 16 blank / dflt */
    +  CTYP.0   = 'VSAM'
    +  CTYP.1   = 'ICF. SYS%-SYS1 conversion was not active at IPL time'
    +  CTYP.2   = 'ICF. SYS%-SYS1 conversion was active at IPL time'
    +End
    +Queue 'The last IPL was 'IPLDAY IPLDATE '('IPLJUL')' ,
    +      'at 'IPLTIME' ('CURNNNNN - IPLNNNNN' days ago).'
    +Queue 'The IPL was done 'IPLCLPA'.'
    +Queue 'The system IPL address was 'IPLADDR' ('IPLVOL').'
    +If Bitand(CVTOSLV0,'08'x) = '08'x then do    /* HBB4410 ESA V4 1 & > */
    +  ECVTSPLX = Storage(D2x(ECVT+8),8)          /* point to SYSPLEX name*/
    +  ECVTLOAD = Storage(D2x(ECVT+160),8)        /* point to LOAD PARM   */
    +  IPLPARM  = Strip(ECVTLOAD,'T')             /* del trailing blanks  */
    +  SEPPARM  = Substr(IPLPARM,1,4) Substr(IPLPARM,5,2),
    +             Substr(IPLPARM,7,1) Substr(IPLPARM,8,1)
    +  SEPPARM  = Strip(SEPPARM,'T')              /* del trailing blanks  */
    +  Queue 'The IPL LOAD PARM used was 'IPLPARM' ('SEPPARM').'
    +  If Bitand(CVTOSLV1,'20'x) = '20'x then do  /* HBB5510 ESA V5 & >   */
    +    CVTIXAVL = C2d(Storage(D2x(CVT+124),4))      /* point to IOCM    */
    +    IOCIOVTP = C2d(Storage(D2x(CVTIXAVL+208),4)) /* IOS Vector Table */
    +    CDA      = C2d(Storage(D2x(IOCIOVTP+24),4))  /* point to CDA     */
    +  End
    +  CVTTZ      = Storage(D2x(CVT + 304),4)     /* point to cvttz       */
    +  CKTZBYTE   = Storage(D2x(CVT + 304),1)     /* need to chk 1st byte */
    +  If bitand(CKTZBYTE,'80'x) = '80'x then ,   /* chk for negative     */
    +    CVTTZ    = C2d(CVTTZ,4)                  /* negative offset C2d  */
    +  Else CVTTZ = C2d(CVTTZ)                    /* postitive offset C2d */
    +  CVTTZ      = CVTTZ * 1.048576 / 3600       /* convert to hours     */
    +  If Format(CVTTZ,3,1) = Format(CVTTZ,3,0) , /* don't use decimal if */
    +   then CVTTZ = Strip(Format(CVTTZ,3,0))     /* not needed           */
    +  Else  CVTTZ = Strip(Format(CVTTZ,3,1))     /* display 1 decimal    */
    +  Queue 'The local time offset from GMT time is' CVTTZ 'hours.'
    +  If Bitand(CVTOSLV1,'10'x) = '10'x then do  /* HBB5520 ESA V5.2 & > */
    +    ECVTHDNM = Storage(D2x(ECVT+336),8)      /* point to hardware nam*/
    +    ECVTLPNM = Storage(D2x(ECVT+344),8)      /* point to LPAR name   */
    +    If Bitand(CVTOSLV2,'01'x) = '01'x then do  /* OS/390 R10 & above */
    +      MIFID    = C2d(Storage(D2X(CDA+252),1))  /* MIF ID in decimal  */
    +      MIFID    = D2x(MIFID)                    /* MIF ID in hex      */
    +      If Bitand(CVTOSLV3,'04'x) = '04'x then do /* z/OS 1.4 and above*/
    +        IOCCSSID = C2d(Storage(d2x(CVTIXAVL+275),1))
    +        IOCCSSID = D2x(IOCCSSID)                /* CSS ID in hex     */
    +      End
    +      If zARCH = 2 then ,                    /* z/Architechture      */
    +        Queue 'The system is running in z/Architecture mode' ,
    +               '(ARCHLVL = 2).'
    +      Else ,                                 /* ESA/390 mode         */
    +        Queue 'The system is running in ESA/390 mode (ARCHLVL = 1).'
    +    End /* If Bitand(CVTOSLV2,'01'x) = '01'x */
    +    If ECVTHDNM <> ' ' & ECVTLPNM <> ' ' then do
    +      CSDPLPN  = C2d(Storage(D2x(CSD + 252),1))    /* point to LPAR #*/
    +   /* CSDPLPN not valid for z990 (T-REX) or z890 for LPAR number     */
    +      CPOFF = 0  /* init offset to next PCCA entry                   */
    +      PCCA  = 0  /* init PCCA to 0                                   */
    +      Do until PCCA <> 0   /* do until we find a valid PCCA          */
    +        PCCA = C2d(Storage(D2x(PCCAVT + CPOFF),4)) /* point to PCCA  */
    +        If PCCA <> 0 then do
    +          LPAR_#  = X2d(Storage(D2x(PCCA + 6),2))  /* LPAR # in hex  */
    +          LPAR_#  = D2x(LPAR_#)                    /* display as hex */
    +        End /* if PCCA <> 0 */
    +        Else CPOFF = CPOFF + 4  /* bump up offset for next PCCA      */
    +      End /* do until PCCA <> 0 */
    +      If Bitand(CVTOSLV2,'01'x) = '01'x then do    /* OS/390 R10 & > */
    +        Queue 'The Processor name is' Strip(ECVTHDNM)'.' ,
    +               'The LPAR name is' Strip(ECVTLPNM)'.'
    +        If Bitand(CVTOSLV3,'04'x) = '04'x then  /* z/OS 1.4 and above*/
    +          Queue ' ' Strip(ECVTLPNM) 'is (HMC defined) LPAR ID =' ,
    +                LPAR_#', MIF ID =' mifid 'and CSS ID = 'IOCCSSID'.'
    +        Else ,
    +          Queue ' ' Strip(ECVTLPNM) 'is (HMC defined) LPAR ID =' ,
    +                LPAR_# 'and MIF ID =' mifid'.'
    +        Queue ' ' Strip(ECVTLPNM) 'is PR/SM partition number' ,
    +                   CSDPLPN' (internal value from the CSD).'
    +      End /* If Bitand(CVTOSLV2,'01'x) = '01'x */
    +      Else ,
    +        Queue 'The Processor name is' Strip(ECVTHDNM)'.' ,
    +               'The LPAR name is' Strip(ECVTLPNM)' (LPAR #'CSDPLPN').'
    +    End  /* If ECVTHDNM <> ' ' & ECVTLPNM <> ' '   */
    +    Else if ECVTHDNM <> ' ' then ,
    +      Queue 'The Processor name is' Strip(ECVTHDNM)'.'
    +    If Bitand(CVTOSLV1,'20'x) = '20'x ,   /* HBB5510 ESA V5 & above  */
    +       & ECVTSPLX <> 'LOCAL' then do      /* and not a local sysplex */
    +      JESDSNID = X2d(Storage(D2x(JESCTEXT+120),2)) /*ID for temp dsns*/
    +      Queue 'The sysplex name is' Strip(ECVTSPLX)'. This was system' ,
    +            'number' Format(JESDSNID) 'added to the sysplex.'
    +    End /* If Bitand(CVTOSLV1,'20'x) = '20'x */
    +    Else queue 'The sysplex name is' Strip(ECVTSPLX)'.'
    +  End  /* If Bitand(CVTOSLV1,'10'x) = '10'x */
    +End
    +Queue 'The GRS system id (SYSNAME) is 'GRSNAME'.'
    +If Bitand(CVTOSLV1,'10'x) = '10'x then do  /* HBB5520 ESA V5.2 & > */
    +  ECVTGMOD   = C2d(Storage(D2x(ECVT + 266),1)) /* GRS mode         */
    +  GMOD.0     = "NONE"  /* Stem for GRS mode: ECVTGNON EQU 0        */
    +  GMOD.1     = "RING"  /* Stem for GRS mode: ECVTGRNG EQU 1        */
    +  GMOD.2     = "STAR"  /* Stem for GRS mode: ECVTGSTA EQU 2        */
    +  Queue '  The GRS mode is' GMOD.ECVTGMOD' (NONE, RING or STAR).'
    +End
    +Queue 'The SMF system id (SID) is 'SMFNAME'.'
    +If Bitand(CVTOSLV1,'20'x) <> '20'x then do   /* Below HBB5510 ESA V5 */
    +  IOCON    = Storage(D2x(CVTEXT2 + 6),2)       /* HCD IODFxx or MVSCP*/
    +                                               /* IOCONFIG ID=xx     */
    +  Queue 'The currently active IOCONFIG or HCD IODF is 'IOCON'.'
    +End
    +Else do
    +  IODF     = Storage(D2X(CDA+32),44)           /* point to IODF name */
    +  IODF     = Strip(IODF,'T')                   /* del trailing blanks*/
    +  CONFIGID = Storage(D2X(CDA+92),8)            /* point to CONFIG    */
    +  EDT      = Storage(D2X(CDA+104),2)           /* point to EDT       */
    +  IOPROC   = Storage(D2X(CDA+124),8)           /* point to IODF Proc */
    +  IODATE   = Storage(D2X(CDA+156),8)           /* point to IODF date */
    +  IOTIME   = Storage(D2X(CDA+164),8)           /* point to IODF time */
    +  IODESC   = Storage(D2X(CDA+172),16)          /* point to IODF desc */
    +  Queue 'The currently active IODF data set is 'IODF'.'
    +  Queue '  Configuration ID =' CONFIGID ' EDT ID =' EDT
    +  If Substr(IOPROC,1,1) <> '00'x  & ,
    +     Substr(IOPROC,1,1) <> '40'x then do       /* is token there?    */
    +    Queue '  TOKEN: Processor  Date      Time      Description'
    +    Queue '         'IOPROC'   'IODATE'  'IOTIME'  'IODESC
    +  End
    +End
    +Queue 'The Master Catalog is 'MCATDSN' on 'MCATVOL'.'
    +If Bitand(CVTOSLV2,'80'x) = '80'x then do    /* OS/390 R4 and above  */
    + Queue '  The catalog alias level was 'IPASCANL' at IPL time.'
    + Queue '    The catalog alias level is currently' AMCBSALV'.'
    + Queue '  The catalog type is 'CTYP.IPASCTYP'.'
    + If Bitand(AMCBSFLG,'40'x) = '40'x then ,
    +   Queue '    SYS%-SYS1 conversion is currently active.'
    + Else ,
    +   Queue '    SYS%-SYS1 conversion is not currently active.'
    +End
    +/*If OPTION = 'IPL' then interpret call 'VERSION' */ /* incl version*/
    +Return
    +
    +VERSION:             /* Version information sub-routine              */
    +Queue ' '
    +Call SUB 'FINDJES'   /* call SUB routine with FINDJES option         */
    +If JESPJESN = 'JES3' then do                 /* Is this JES3?        */
    +  If ENV = 'OMVS' then do  /* running under Unix System Services     */
    +    JES3FMID = Storage(D2x(JESSSVT+644),8)      /* JES3 FMID         */
    +    Select  /* determine JES3 version from FMID  */
    +      When JES3FMID = 'HJS5521' then JESLEV = 'SP 5.2.1'
    +      When JES3FMID = 'HJS6601' then JESLEV = 'OS 1.1.0'
    +      When JES3FMID = 'HJS6604' then JESLEV = 'OS 2.4.0'
    +      When JES3FMID = 'HJS6606' then JESLEV = 'OS 2.6.0'
    +      When JES3FMID = 'HJS6608' then JESLEV = 'OS 2.8.0'
    +      When JES3FMID = 'HJS6609' then JESLEV = 'OS 2.9.0'
    +      When JES3FMID = 'HJS7703' then JESLEV = 'OS 2.10.0'
    +      When JES3FMID = 'HJS7705' then JESLEV = 'z 1.2.0'
    +      When JES3FMID = 'HJS7707' then JESLEV = 'z 1.4.0'
    +      When JES3FMID = 'HJS7708' then JESLEV = 'z 1.5.0'
    +      When JES3FMID = 'HJS7720' then JESLEV = 'z 1.7.0'
    +      When JES3FMID = 'HJS7730' then JESLEV = 'z 1.8.0'
    +      When JES3FMID = 'HJS7740' then JESLEV = 'z 1.9.0'
    +      When JES3FMID = 'HJS7750' then JESLEV = 'z 1.10.0'
    +      When JES3FMID = 'HJS7760' then JESLEV = 'z 1.11.0'
    +      When JES3FMID = 'HJS7770' then JESLEV = 'z 1.12.0'
    +      When JES3FMID = 'HJS7780' then JESLEV = 'z 1.13.0'
    +      When JES3FMID = 'HJS7790' then JESLEV = 'z 2.1.0'
    +      When JES3FMID = 'HJS77A0' then JESLEV = 'z 2.2.0'
    +      When JES3FMID = 'HJS77B0' then JESLEV = 'z 2.3.0'
    +      When JES3FMID = 'HJS77C0' then JESLEV = 'z 2.4.0'
    +      Otherwise JESLEV = JES3FMID /* if not in tbl, use FMID as ver  */
    +    End /* select */
    +    JESNODE  = '*not_avail*'                 /* can't do under USS   */
    +  End /* if env = 'omvs' */
    +  Else do /* if not running under Unix System Services, use TSO VARs */
    +    JESLEV   = SYSVAR('SYSJES')              /* TSO/E VAR for JESLVL */
    +    JESNODE  = SYSVAR('SYSNODE')             /* TSO/E VAR for JESNODE*/
    +  End
    +End
    +Else do  /* JES2 */
    +  JESLEV   = Strip(Storage(D2x(JESSUSE),8))  /* JES2 Version         */
    +  /* offset in $HCCT - CCTNDENM */
    +  Select
    +    When Substr(JESLEV,1,8) == 'z/OS 2.4' then, /* z/OS 2.4          */
    +      JESNODE  = Strip(Storage(D2x(JESSUS2+696),8)) /* JES2 NODE     */
    +    When Substr(JESLEV,1,8) == 'z/OS 2.3' | ,   /* z/OS 2.3          */
    +      Substr(JESLEV,1,8) == 'z/OS 2.2'  then,   /* z/OS 2.2          */
    +      JESNODE  = Strip(Storage(D2x(JESSUS2+664),8)) /* JES2 NODE     */
    +    When Substr(JESLEV,1,8) == 'z/OS 2.1' | ,   /* z/OS 2.1          */
    +      Substr(JESLEV,1,8) == 'z/OS1.13'    | ,   /* z/OS 1.13         */
    +      Substr(JESLEV,1,8) == 'z/OS1.12'    | ,   /* z/OS 1.12         */
    +      Substr(JESLEV,1,8) == 'z/OS1.11'  then,   /* z/OS 1.11         */
    +      JESNODE  = Strip(Storage(D2x(JESSUS2+656),8)) /* JES2 NODE     */
    +    When Substr(JESLEV,1,8) == 'z/OS1.10' | ,  /* z/OS 1.10          */
    +      Substr(JESLEV,1,8) == 'z/OS 1.9' then,    /* z/OS 1.9          */
    +      JESNODE  = Strip(Storage(D2x(JESSUS2+708),8)) /* JES2 NODE     */
    +    When Substr(JESLEV,1,8) == 'z/OS 1.8' then, /* z/OS 1.8          */
    +      JESNODE  = Strip(Storage(D2x(JESSUS2+620),8)) /* JES2 NODE     */
    +    When Substr(JESLEV,1,8) == 'z/OS 1.7' then, /* z/OS 1.7          */
    +      JESNODE  = Strip(Storage(D2x(JESSUS2+616),8)) /* JES2 NODE     */
    +    When Substr(JESLEV,1,8) == 'z/OS 1.5' | , /* z/OS 1.5 & 1.6      */
    +      Substr(JESLEV,1,8) == 'z/OS 1.4' then   /* z/OS 1.4            */
    +      JESNODE  = Strip(Storage(D2x(JESSUS2+532),8)) /* JES2 NODE     */
    +    When Substr(JESLEV,1,7) == 'OS 2.10' | ,  /* OS/390 2.10 and     */
    +      Substr(JESLEV,1,8) == 'z/OS 1.2' then,  /* z/OS 1.2            */
    +      JESNODE  = Strip(Storage(D2x(JESSUS2+452),8)) /* JES2 NODE     */
    +    When Substr(JESLEV,1,6) == 'OS 1.1' | , /* OS/390 1.1  or        */
    +      Substr(JESLEV,1,4) == 'SP 5' then ,    /* ESA V5 JES2          */
    +      JESNODE  = Strip(Storage(D2x(JESSUS2+336),8)) /*   JES2 NODE   */
    +    When Substr(JESLEV,1,5) == 'OS 1.' | ,   /* OS/390 1.2           */
    +      Substr(JESLEV,1,5) == 'OS 2.' then,    /*  through OS/390 2.9  */
    +      JESNODE  = Strip(Storage(D2x(JESSUS2+372),8)) /* JES2 NODE     */
    +    Otherwise ,                              /* Lower than ESA V5    */
    +      If ENV = 'OMVS' then JESNODE = '*not_avail*'
    +      else JESNODE  = SYSVAR('SYSNODE')      /* TSO/E VAR for JESNODE*/
    +  End  /* select */
    +End /* else do */
    +/*                                                                   */
    +CVTVERID = Storage(D2x(CVT - 24),16)         /* "user" software vers.*/
    +CVTRAC   = C2d(Storage(D2x(CVT + 992),4))    /* point to RACF CVT    */
    +RCVT     = CVTRAC                            /* use RCVT name        */
    +RCVTID   = Storage(D2x(RCVT),4)              /* point to RCVTID      */
    +                                             /* RCVT, ACF2, or RTSS  */
    +SECNAM = RCVTID                              /* ACF2 SECNAME = RCVTID*/
    +If RCVTID = 'RCVT' then SECNAM = 'RACF'      /* RCVT is RACF         */
    +If RCVTID = 'RTSS' then SECNAM = 'Top Secret'  /* RTSS is Top Secret */
    +RACFVRM  = Storage(D2x(RCVT + 616),4)        /* RACF Ver/Rel/Mod     */
    +RACFVER  = Substr(RACFVRM,1,1)               /* RACF Version         */
    +RACFREL  = Substr(RACFVRM,2,2)               /* RACF Release         */
    +If Bitand(CVTOSLV2,'01'x) <> '01'x then ,    /* below OS/390 R10     */
    +  RACFREL  = Format(RACFREL)                 /* Remove leading 0     */
    +RACFMOD  = Substr(RACFVRM,4,1)               /* RACF MOD level       */
    +RACFLEV  = RACFVER || '.' || RACFREL || '.' || RACFMOD
    +If RCVTID = 'RCVT' | RCVTID = 'RTSS' then ,
    + RCVTDSN = Strip(Storage(D2x(RCVT + 56),44))    /* RACF prim dsn or  */
    +                                                /* TSS Security File */
    +If SECNAM = 'ACF2' then do
    +  SSCVT    = C2d(Storage(D2x(JESCT+24),4))   /* point to SSCVT       */
    +  Do while SSCVT <> 0
    +    SSCTSNAM = Storage(D2x(SSCVT+8),4)       /* subsystem name       */
    +    If SSCTSNAM = 'ACF2' then do
    +      ACCVT    = C2d(Storage(D2x(SSCVT + 20),4)) /* ACF2 CVT         */
    +      ACCPFXP  = C2d(Storage(D2x(ACCVT - 4),4))  /* ACCVT prefix     */
    +      ACCPIDL  = C2d(Storage(D2x(ACCPFXP + 8),2))  /* Len ident area */
    +      LEN_ID   = ACCPIDL-4 /* don't count ACCPIDL and ACCPIDO in len */
    +      ACCPIDS  = Strip(Storage(D2x(ACCPFXP + 12),LEN_ID)) /*sys ident*/
    +      ACF2DSNS = C2d(Storage(D2x(ACCVT + 252) ,4)) /* ACF2 DSNs      */
    +      ACF2DNUM = C2d(Storage(D2x(ACF2DSNS + 16),2)) /* # OF DSNs     */
    +      Leave
    +    End
    +  SSCVT    = C2d(Storage(D2x(SSCVT+4),4))    /* next sscvt or zero   */
    +  End  /*  Do while SSCVT <> 0 */
    +End
    +/*                                                                   */
    +CVTDFA   = C2d(Storage(D2x(CVT + 1216),4))   /* point to DFP ID table*/
    +DFAPROD  = C2d(Storage(D2x(CVTDFA +16),1))   /* point to product byte*/
    +If DFAPROD = 0 then do                       /* DFP not DF/SMS       */
    +  DFAREL   = C2x(Storage(D2x(CVTDFA+2),2))   /* point to DFP release */
    +  DFPVER   = Substr(DFAREL,1,1)              /* DFP Version          */
    +  DFPREL   = Substr(DFAREL,2,1)              /* DFP Release          */
    +  DFPMOD   = Substr(DFAREL,3,1)              /* DFP Mod Lvl          */
    +  DFPRD    = 'DFP'                           /* product is DFP       */
    +  DFLEV    = DFPVER || '.' || DFPREL || '.' || DFPMOD
    +End
    +Else do                                      /* DFSMS not DFP        */
    +  DFARELS  = C2x(Storage(D2x(CVTDFA+16),4))  /* point to DF/SMS rel  */
    +  DFAVER   = X2d(Substr(DFARELS,3,2))        /* DF/SMS Version       */
    +  DFAREL   = X2d(Substr(DFARELS,5,2))        /* DF/SMS Release       */
    +  DFAMOD   = X2d(Substr(DFARELS,7,2))        /* DF/SMS Mod Lvl       */
    +  DFPRD    = 'DFSMS'                         /* product is DF/SMS    */
    +  DFLEV    = DFAVER || '.' || DFAREL || '.' || DFAMOD
    +  If DFAPROD = 2 then DFLEV = 'OS/390' DFLEV
    +  If DFAPROD = 3 then do
    +    DFLEV    = 'z/OS' DFLEV
    +    /* Next section of code doesn't work because CRT is in key 5 */
    +       /*
    +    CVTCBSP  = C2d(Storage(D2x(CVT + 256),4))      /* point to AMCBS */
    +    CRT      = C2d(Storage(D2x(CVTCBSP + 124),4))  /* point to CRT   */
    +    CRTFMID  = Storage(D2x(CRT + 472),7)           /* DFSMS FMID     */
    +       */
    +  End /* if DFAPROD = 3 */
    +  JESSMSIB = C2d(Storage(D2x(JESCTEXT+84),4)) /* point to SMS SSIB   */
    +  IGDSSIVT = C2d(Storage(D2x(JESSMSIB+32),4))  /* SMS vector table   */
    +  IGDSMS   = Storage(D2x(IGDSSIVT+132),2)      /* IGDSMSxx suffix    */
    +  SMSACDS  = Strip(Storage(D2x(IGDSSIVT+44),44))   /* ACDS           */
    +  SMSCMDS  = Strip(Storage(D2x(IGDSSIVT+88),44))   /* COMMDS         */
    +End
    +/*                                                                   */
    +CVTTVT   = C2d(Storage(D2x(CVT + 156),4))    /* point to TSO vect tbl*/
    +TSVTLVER = Storage(D2x(CVTTVT+100),1)        /* point to TSO Version */
    +TSVTLREL = Storage(D2x(CVTTVT+101),2)        /* point to TSO Release */
    +TSVTLREL = Format(TSVTLREL)                  /* Remove leading 0     */
    +TSVTLMOD = Storage(D2x(CVTTVT+103),1)        /* point to TSO Mod Lvl */
    +TSOLEV   = TSVTLVER || '.' || TSVTLREL || '.' || TSVTLMOD
    +/*                                                                   */
    +CHKVTACT = Storage(D2x(CVTEXT2+64),1)        /* VTAM active flag     */
    +If bitand(CHKVTACT,'80'x) = '80'x then do      /* vtam is active     */
    +  CVTATCVT = C2d(Storage(D2x(CVTEXT2 + 65),3)) /* point to VTAM AVT  */
    +  ISTATCVT = C2d(Storage(D2x(CVTATCVT + 0),4)) /* point to VTAM CVT  */
    +  ATCVTLVL = Storage(D2x(ISTATCVT + 0),8)      /* VTAM Rel Lvl VOVRP */
    +  VTAMVER  = Substr(ATCVTLVL,3,1)              /* VTAM Version   V   */
    +  VTAMREL  = Substr(ATCVTLVL,4,1)              /* VTAM Release    R  */
    +  VTAMMOD  = Substr(ATCVTLVL,5,1)              /* VTAM Mod Lvl     P */
    +  If VTAMMOD = ' ' then VTAMLEV =  VTAMVER || '.' || VTAMREL
    +    else VTAMLEV =  VTAMVER || '.' || VTAMREL || '.' || VTAMMOD
    +/*                                                                   */
    +  ATCNETID = Strip(Storage(D2x(ISTATCVT + 2080),8))  /* VTAM NETID   */
    +  ATCNQNAM = Strip(Storage(D2x(ISTATCVT + 2412),17)) /* VTAM SSCPNAME*/
    +  VTAM_ACTIVE = 'YES'
    +End /* if bitand (vtam is active) */
    +Else VTAM_ACTIVE = 'NO'
    +If Bitand(CVTOSLV1,'80'x) = '80'x then do    /* HBB4430 ESA V4.3 & > */
    +  ECVTTCP     = D2x(ECVT + 176)              /* TCPIP                */
    +  TSAB        = C2d(Storage(ECVTTCP,4))      /* point to TSAB        */
    +  TSABLEN     = C2d(Storage(D2x(TSAB+4),2))  /* Length of TSAB       */
    +  TSEBNUM     = (TSABLEN - 64) / 128         /* Number of TSEBs      */
    +  TCPANUM     = 0                            /* counter of act TSEBs */
    +  TCP_ACTIVE  = 'NO'                         /* Init active flag     */
    +  Do SCNTSEBS = 1 to TSEBNUM                 /* Scan TSEB loop       */
    +    TSEB = TSAB + 64 + (SCNTSEBS-1)*128
    +    TCPASID = C2x(Storage(D2x(TSEB + 56),2)) /* asid or zero         */
    +    If TCPASID <> 0 then do                  /* active asid          */
    +      TCP_ACTIVE = 'YES'
    +      TCPANUM = TCPANUM + 1                /* add 1 to active count  */
    +      TCPSTATUS           =     Storage(D2x(TSEB +  8),1)
    +      TCPNAME.TCPANUM     =     Storage(D2x(TSEB + 16),8)
    +      TCPNUM.TCPANUM      = C2x(Storage(D2x(TSEB + 24),1))
    +      TCPVER.TCPANUM      = C2x(Storage(D2x(TSEB + 26),2))
    +      TCPASID.TCPANUM     = TCPASID '('Right(X2d(TCPASID),4)')'
    +      Select
    +        When Bitand(TCPSTATUS,'80'x) = '80'x then TCPST = 'Active'
    +        When Bitand(TCPSTATUS,'40'x) = '40'x then TCPST = 'Terminating'
    +        When Bitand(TCPSTATUS,'20'x) = '20'x then TCPST = 'Down'
    +        When Bitand(TCPSTATUS,'10'x) = '10'x then TCPST = 'Stopped'
    +        Otherwise say 'Bad TCPSTATUS! Contact Mark Zelden' TCPSTATUS
    +      End /*  select  */
    +      TCPST.TCPANUM     = TCPST
    +    End /* If TCPASID <> 0 */
    +  End /* Do SCNTSEBS = 1 to TSEBNUM */
    +End /* If Bitand(CVTOSLV1,'80'x) = '80'x */
    +If Bitand(CVTOSLV1,'02'x) <> '02'x then ,    /* Below OS/390 R1      */
    +  Queue 'The MVS version is 'PRODNAME' - FMID 'FMIDNUM'.'
    +Else do
    +  PRODNAM2 = Storage(D2x(ECVT+496),16)       /* point to product name*/
    +  PRODNAM2 = Strip(PRODNAM2,'T')             /* del trailing blanks  */
    +  VER      = Storage(D2x(ECVT+512),2)        /* point to version     */
    +  REL      = Storage(D2x(ECVT+514),2)        /* point to release     */
    +  MOD      = Storage(D2x(ECVT+516),2)        /* point to mod level   */
    +  VRM      = VER'.'REL'.'MOD
    +  Queue 'The OS version is 'PRODNAM2 VRM' - FMID' ,
    +         FMIDNUM' ('PRODNAME').'
    +End
    +If CVTVERID <> ' ' then ,
    +  Queue 'The "user" system software version is' Strip(CVTVERID,'T')'.'
    +Queue 'The primary job entry subsystem is 'JESPJESN'.'
    +Queue 'The 'JESPJESN 'level is 'JESLEV'.' ,
    +      'The 'JESPJESN 'node name is 'JESNODE'.'
    +If SECNAM <> 'RACF' | RACFVRM < '2608' then do
    +  Queue 'The security software is 'SECNAM'.'
    +  If SECNAM = 'ACF2' then do
    +    Queue 'The ACF2 level is' ACCPIDS'.'
    +    Queue '  There are 'ACF2DNUM' ACF2 data sets in use:'
    +    Do ADSNS = 1 to ACF2DNUM
    +      ADSOFF   = ACF2DSNS + 24 + (ADSNS-1)*64
    +      ACF2TYPE = Storage(D2x(ADSOFF) , 8)
    +      ACF2DSN  = Storage(D2x(ADSOFF + 16),44)
    +      Queue '   ' ACF2TYPE '-' ACF2DSN
    +    End
    +  End /* if secname = 'ACF2' */
    +  If Bitand(CVTOSLV6,'40'x) = '40'x then nop /* z/OS 2.2 and above */
    +    Else Queue '  The RACF level is 'RACFLEV'.' /*dont show racflev*/
    +  If SECNAM = 'Top Secret' then ,
    +   Queue '  The TSS Security File data set is' RCVTDSN'.'
    +  If SECNAM = 'RACF' then ,
    +   Queue '  The RACF primary data set is' RCVTDSN'.'
    +End
    +Else do
    +  /* RACF system */
    +  RCVTDSDT  = C2d(Storage(D2x(RCVT + 224),4))  /* point to RACFDSDT*/
    +  DSDTNUM   = C2d(Storage(D2x(RCVTDSDT+4),4))  /* num RACF dsns    */
    +  DSDTPRIM  = Storage(D2x(RCVTDSDT+177),44)    /* point to prim ds */
    +  DSDTPRIM  = Strip(DSDTPRIM,'T')              /* del trail blanks */
    +  DSDTBACK  = Storage(D2x(RCVTDSDT+353),44)    /* point to back ds */
    +  DSDTBACK  = Strip(DSDTBACK,'T')              /* del trail blanks */
    +  If Bitand(CVTOSLV6,'40'x) = '40'x then do /* z/OS 2.2 and above  */
    +    Queue 'The security software is' Word(PRODNAM2,1) ,
    +          'Security Server (RACF).'
    +    Queue 'The RACF level is' PRODNAM2 VRM || '.'
    +  End
    +  Else do
    +    Queue 'The security software is' Word(PRODNAM2,1) ,
    +          'Security Server (RACF).' ,
    +          'The FMID is HRF' || RACFVRM || '.'
    +  End
    +  If DSDTNUM = 1 then do
    +    Queue '  The RACF primary data set is' DSDTPRIM'.'
    +    Queue '  The RACF backup  data set is' DSDTBACK'.'
    +  End
    +  Else do
    +    Queue '  RACF is using a split database. There are' DSDTNUM ,
    +          'pairs of RACF data sets:'
    +    RDTOFF = 0                            /* init cur offset to 0 */
    +    DSDTENTY_SIZE = 352                   /* dsdtenty size        */
    +    Do RDSNS = 1 to DSDTNUM
    +      DSDTPRIM  = Storage(D2x(RCVTDSDT+177+RDTOFF),44) /* prim dsn */
    +      DSDTPRIM  = Strip(DSDTPRIM,'T')                  /* del blnks*/
    +      DSDTBACK  = Storage(D2x(RCVTDSDT+353+RDTOFF),44) /* bkup dsn */
    +      DSDTBACK  = Strip(DSDTBACK,'T')                  /* del blnks*/
    +      RDTOFF = RDTOFF + DSDTENTY_SIZE            /* next tbl entry */
    +      Queue '    Primary #'RDSNS' - ' DSDTPRIM
    +      Queue '    Backup  #'RDSNS' - ' DSDTBACK
    +    End  /* do RDSNS = 1 to DSDTNUM */
    +  End
    +End /* else do */
    +Queue 'The' DFPRD 'level is' DFLEV'.'
    +If DFPRD = 'DFSMS' then do
    +  Queue '  The SMS parmlib member is IGDSMS'igdsms'.'
    +  Queue '  The SMS ACDS data set name is' SMSACDS'.'
    +  Queue '  The SMS COMMDS data set name is' SMSCMDS'.'
    +End
    +Queue 'The TSO level is 'TSOLEV'.'
    +If SYSISPF = 'ACTIVE' then do                /* is ISPF active?      */
    +  Address ISPEXEC "VGET ZISPFOS"             /* yes, is it OS?390?   */
    +  If RC = 0 then do                          /* yes, get OS/390 var  */
    +    ISPFLEV = Strip(Substr(ZISPFOS,10,15))   /* only need version    */
    +    Address ISPEXEC "VGET ZENVIR"            /* ispf internal rel var*/
    +    ISPFLEVI = Substr(ZENVIR,1,8)            /* internal ISPF release*/
    +    Queue 'The ISPF level is 'ISPFLEV' ('ISPFLEVI').'
    +  End  /* if RC */
    +  Else do                          /* not OS/390 - use old variables */
    +    Address ISPEXEC "VGET ZPDFREL"           /* get pdf release info */
    +    ISPFLEV  = Substr(ZENVIR,6,3)            /* ISPF level           */
    +    PDFLEV   = Substr(ZPDFREL,5,3)           /* PDF  level           */
    +    Queue 'The ISPF level is 'ISPFLEV'. The PDF level is' PDFLEV'.'
    +  End /* else do */
    +End  /* if SYSISPF */
    +If VTAM_ACTIVE = 'YES' then do
    +  Queue 'The VTAM level is 'VTAMLEV'.'
    +  Queue '  The NETID is' ATCNETID'. The SSCPNAME is' ATCNQNAM'.'
    +End /* if VTAM_ACTIVE = YES */
    +Else Queue 'The VTAM level is not available - VTAM is not active.'
    +If Bitand(CVTOSLV1,'80'x) = '80'x then do    /* HBB4430 ESA V4.3 & > */
    +  If TCP_ACTIVE = 'YES' then do
    +    Queue 'The TCP/IP stack is active. ',
    +          'There are 'TCPANUM' active TSEBs out of 'TSEBNUM'.'
    +    Queue '  SI Proc       Vers   ASID ( dec)   Status'
    +    Queue '  -- --------   ----   ---- ------   ------'
    +    Do LSI = 1 to TCPANUM
    +      Queue '  'Right(TCPNUM.LSI,2)' 'TCPNAME.LSI'   'TCPVER.LSI'  ',
    +            TCPASID.LSI'   'TCPST.LSI
    +    End
    +  End /* if TCP_ACTIVE = YES */
    +  Else Queue 'The TCP level is not available - TCP is not active.'
    +End /*  If Bitand(CVTOSLV1,'80'x) = '80'x   */
    +Return
    +
    +STOR:                /* Storage information sub-routine              */
    +Queue ' '
    +CVTRLSTG = C2d(Storage(D2x(CVT + 856),4))    /* point to store at IPL*/
    +CVTRLSTG = CVTRLSTG/1024                     /* convert to Megabytes */
    +If zARCH <> 2 then do                        /* not valid in 64-bit  */
    +  CVTEORM  = C2d(Storage(D2x(CVT + 312),4))  /* potential real high  */
    +  CVTEORM  = (CVTEORM+1)/1024/1024           /* convert to Megabytes */
    +  ESTOR    = C2d(Storage(D2x(RCE + 160),4))  /* point to ESTOR frames*/
    +  ESTOR    = ESTOR*4/1024                    /* convert to Megabytes */
    +End
    +  /**********************************************************/
    +  /* At z/OS 2.1 CVTRLSTG was not always correct. The code  */
    +  /* below gets the value from the RSM Internal Table       */
    +  /* field 'RITTOTALONLINESTORAGEATIPL'.                    */
    +  /* The RIT is documented in the MVS Data Areas manual     */
    +  /*  - This was a bug fixed by APAR OA48094                */
    +  /**********************************************************/
    + /*
    +If Bitand(CVTOSLV6,'80'x) = '80'x then do    /* z/OS 2.1  and above  */
    +CVTPVTP  = C2d(Storage(D2x(CVT+356),4))      /* point page vect tbl  */
    +PVTRIT   = C2x(Storage(D2x(CVTPVTP+4),4))    /* RSM internal tbl OCO */
    +RITOLSTG = X2d(C2x(Storage(D2x(X2d(PVTRIT)+X2d(128)),8)))
    +RITOLSTG = RITOLSTG/1024/1024                /* convert to Megabytes */
    +CVTRLSTG = RITOLSTG            /* change the name for code below     */
    +End
    +  */
    +If Bitand(CVTOSLV0,'08'x) = '08'x then do    /* HBB4410 ESA V4 & >   */
    +  ECVTEORM  = C2d(Storage(d2x(ECVT+600),8))  /* potential real high  */
    +  RECONFIG  = (ECVTEORM-CVTRLSTG*1024*1024+1)/(1024*1024) /* amt of  */
    +                                             /* reconfigurable stor  */
    +End
    +If Bitand(CVTOSLV5,'40'x) = '40'x then do    /* z/OS 1.7 and above   */
    +  RCECADSUsed = C2d(Storage(D2x(RCE + 572),2)) /* CADS current use   */
    +  RCECADSHW   = C2d(Storage(D2x(RCE + 574),2)) /* CADS high water    */
    +End
    +Call STORAGE_GDA_LDA
    +If Bitand(CVTOSLV2,'01'x) = '01'x then do    /* OS/390 R10 and above */
    +  SCCBSAI  = C2d(Storage(D2x(SCCB + 10),1))  /* real stor incr. in M */
    +  If SCCBSAI =  0 then do                    /* If 0, use SCCBSAIX   */
    +    SCCBSAIX = C2d(Storage(D2x(SCCB + 100),4)) /* real stor incr in M*/
    +    SCCBSAI  = SCCBSAIX                      /* using SCCBSAI later  */
    +  End
    +  SCCBSAR  = C2d(Storage(D2x(SCCB + 8),2))   /* # of. incr installed */
    +End
    +If zARCH <> 2 then do       /* not valid in 64-bit */
    +  Queue 'The real storage size at IPL time was 'Format(CVTRLSTG,,0)'M.'
    +  Queue 'The potential real storage size is' ,
    +         Format(CVTEORM,,0)'M.'
    +  If ESTOR > 0 then
    +    Queue 'The expanded storage size is 'ESTOR'M.'
    +  Else
    +    Queue 'The system has no expanded storage.'
    +End /* If zARCH <> 2 */
    +Else Queue 'The real storage online at IPL time' ,
    +           'was 'Format(CVTRLSTG,,0)'M.'
    +If Bitand(CVTOSLV2,'01'x) = '01'x then ,     /* OS/390 R10 and above */
    +  If SCCBSAI <> 0 then ,
    +    Queue 'The real storage increment size is 'SCCBSAI'M with' ,
    +           SCCBSAR 'increments installed.'
    +If Bitand(CVTOSLV0,'08'x) = '08'x then do    /* HBB4410 ESA V4 & >   */
    +  Queue 'The potential real storage size is' ,
    +         (ECVTEORM+1)/(1024*1024)'M.'
    +  Queue 'The reconfigurable storage size is 'reconfig'MB.'
    +End
    +Queue 'The private area size <16M is 'GDAPVTSZ'K.'
    +Queue 'The private area size >16M is 'GDAEPVTS'M.'
    +Queue 'The CSA size <16M is 'GDACSASZ'K.'
    +Queue 'The CSA size >16M is 'GDAECSAS'K.'
    +Queue 'The SQA size <16M is 'GDASQASZ'K.'
    +Queue 'The SQA size >16M is 'GDAESQAS'K.'
    +Queue 'The maximum V=R region size is 'GDAVRSZ'K.'
    +Queue 'The default V=R region size is 'GDAVREGS'K.'
    +Queue 'The maximum V=V region size is 'LDASIZEA'K.'
    +If Bitand(CVTOSLV5,'40'x) = '40'x then do    /* z/OS 1.7 and above   */
    +  Queue 'The current number of CADS (MAXCADs)' ,
    +        'in use is 'RCECADSUsed'.'
    +  Queue 'The maximum number of CADS (MAXCADs)' ,
    +        'used since IPL is 'RCECADSHW'.'
    +End
    +Return
    +
    +CPU:                 /* CPU information sub-routine                  */
    +Queue ' '
    +If Bitand(CVTOSLV3,'01'x) = '01'x then ,  /* z/OS 1.6 & above >16 CPs*/
    +  NUMCPU   = C2d(Storage(D2x(CSD + 212),4))  /* point to # of CPUS   */
    +Else,
    +  NUMCPU   = C2d(Storage(D2x(CSD + 10),2))   /* point to # of CPUS   */
    +SCCBNCPS = C2d(Storage(d2x(SCCB + 16),2))    /* Max No. of CPUs      */
    +/*                                                                   */
    +Queue 'The CPU model number is 'MODEL'.'
    +Queue 'The number of online CPUs is 'NUMCPU'.' ,
    +      'The maximum number of CPUs is 'SCCBNCPS'.'
    +If Bitand(CVTOSLV3,'20'x) = '20'x & ,        /* z/OS 1.1 and above   */
    +   Bitand(CVTOSLV3,'01'x) <> '01'x then do   /* but below z/OS 1.6   */
    +  CSDICPUS = C2d(Storage(D2x(CSD+161),1))    /* CPUs online @ IPL    */
    +  Queue '  The number of CPUs online at IPL time was 'CSDICPUS'.'
    +End
    +If Bitand(CVTOSLV3,'01'x) = '01'x then do    /* z/OS 1.6 and above   */
    +  CSDICPUS = C2d(Storage(D2x(CSD+161),1))    /* CPUs online @ IPL    */
    +  CSDIIFAS = C2d(Storage(D2x(CSD+162),1))    /* zAAPs online @ IPL   */
    +  Queue '  The number of GPs online at IPL time was 'CSDICPUS'.'
    +  If CSDIIFAS <> 0 then ,
    +  Queue '  The number of zAAPs online at IPL time was 'CSDIIFAS'.'
    +  If Bitand(CVTOSLV4,'02'x) = '02'x then do /* zIIP (SUP) support    */
    +    CSDISUPS = C2d(Storage(D2x(CSD+163),1))  /* zIIPs online @ IPL   */
    +    If CSDISUPS <> 0 then ,
    +    Queue '  The number of zIIPs online at IPL time was 'CSDISUPS'.'
    +  End
    +End
    +/*                                                                   */
    +CPNUM     = 0
    +FOUNDCPUS = 0
    +FOUNDZAPS = 0
    +FOUNDZIPS = 0
    +Do until FOUNDCPUS = NUMCPU
    +PCCA = C2d(Storage(D2x(PCCAVT + CPNUM*4),4)) /* point to PCCA        */
    +  If PCCA <> 0 then do
    +    CPUVER   = Storage(D2x(PCCA + 4),2)      /* point to VERSION     */
    +    CPUID    = Storage(D2x(PCCA + 6),10)     /* point to CPUID       */
    +    IDSHORT  = Substr(CPUID,2,5)
    +    PCCAATTR = Storage(D2x(PCCA + 376),1)    /* attribute byte       */
    +    PCCARCFF = Storage(D2x(PCCA + 379),1)    /* reconfig flag        */
    +    CP_TYP   = ''                            /* init to null for now */
    +    If Bitand(PCCAATTR,'01'x) = '01'x then do  /* check PCCAIFA      */
    +       CP_TYP = '(zAAP)'                       /* zAAP / IFA CP      */
    +       FOUNDZAPS = FOUNDZAPS + 1
    +    End
    +    If Bitand(PCCAATTR,'04'x) = '04'x then do  /* check PCCAzIIP     */
    +       CP_TYP = '(zIIP)'                       /* zIIP processor     */
    +       FOUNDZIPS = FOUNDZIPS + 1
    +    End
    +    If Bitand(PCCARCFF,'80'x) = '80'x then ,   /* check PCCACWLM     */
    +       CP_TYP = '(WLM)'                        /* WLM controlled CP  */
    +    CPNUM_M = D2x(CPNUM)                       /* display in hex     */
    +    If Bitand(CVTOSLV3,'01'x) = '01'x then ,   /* z/OS 1.6 & above   */
    +      CPNUM_M = Right(CPNUM_M,2,'0')           /* display as 2 digits*/
    +    Queue 'The CPU serial number for CPU 'CPNUM_M' is ' || ,
    +     CPUID' ('IDSHORT'), version code' CPUVER'.' CP_TYP
    +    FOUNDCPUS = FOUNDCPUS + 1
    +  End
    +CPNUM = CPNUM + 1
    +End  /* do until  */
    +/**************************************************/
    +/* SUs/SEC and MIPS calculations                  */
    +/* SYS1.NUCLEUS(IEAVNP10) CSECT IRARMCPU          */
    +/**************************************************/
    +RMCT     = C2d(Storage(D2x(CVT+604),4))      /* point to RMCT        */
    +SU       = C2d(Storage(D2x(RMCT+64),4))      /* CPU Rate Adjustment  */
    +SUSEC    = Format((16000000/SU),7,2)         /* SUs per second       */
    +MIPSCP   = NUMCPU-FOUNDZAPS-FOUNDZIPS        /* Don't include special*/
    +                                             /* processors for MIPs  */
    +MIPS     = Format((SUSEC/48.5) * MIPSCP,6,2) /* SRM MIPS calculation */
    +                                             /* (48.5) borrowed from */
    +                                             /* Thierry Falissard    */
    +Queue 'The service units per second per online CPU is' Strip(SUSEC)'.'
    +Queue 'The approximate total MIPS (SUs/SEC / 48.5 * # general CPUs)' ,
    +      'is' Strip(MIPS)'.'
    +  /*
    +RMCTCCT  = C2d(Storage(D2x(RMCT+4),4))       /* cpu mgmt control tbl */
    +CCVUTILP = C2d(Storage(D2x(RMCTCCT+102),2))  /* CPU Utilization      */
    +Queue 'The approximate CPU utilization is' CCVUTILP'%.'
    +       */
    +If Bitand(CVTOSLV3,'20'x) = '20'x then do    /* z/OS 1.1 and above   */
    +                                             /* w/APAR OW55509       */
    +  RCT      = C2d(Storage(D2x(RMCT+228),4))   /* Resource Control Tbl */
    +  RCTLACS  = C2d(Storage(D2x(RCT+196),4))    /* 4 hr MSU average     */
    +  RCTIMGWU = C2d(Storage(D2x(RCT+28),4))     /* Image defined MSUs   */
    +  RCTCECWU = C2d(Storage(D2x(RCT+32),4))     /* CEC MSU Capacity     */
    +  If RCTCECWU <> 0 then do
    +    Queue 'The MSU capacity for this CEC is' RCTCECWU'.'
    +    Queue 'The defined MSU capacity for this LPAR is' RCTIMGWU'.'
    +  End
    +  If RCTLACS <> 0 then do
    +    Queue 'The 4 hour MSU average usage is' RCTLACS'.'
    +    If RCTLACS >= RCTIMGWU & RCTIMGWU <> RCTCECWU then ,
    +      Queue ' ** This LPAR is currently being "soft capped". **'
    +  End
    +End
    +/*                                                                   */
    +If Bitand(CVTOSLV5,'20'x) = '20'x then do    /* z/OS 1.8 and above   */
    +  IEAVESVT = C2d(Storage(D2x(CVT + 868),4))  /* supv. vect tbl IHASVT*/
    +  SVTAFFB  = Storage(D2x(IEAVESVT + 12),1)   /* aff-dispatch byte    */
    +  If Bitand(SVTAFFB,'80'x) = '80'x then ,
    +    Queue 'The HiperDispatch feature is active on this LPAR.'
    +  Else Queue 'The HiperDispatch feature is not active on this LPAR.'
    +  CPCRPERC = C2d(Storage(D2x(IEAVESVT+1008),4)) /* CPCR Percent      */
    +  If CPCRPERC <> 0 then
    +    Queue 'The CP Credits feature is active on this CPC/LPAR' ,
    +          'at' CPCRPERC'%.'
    +End
    +/**************************************************/
    +/* Central Processing Complex Node Descriptor     */
    +/**************************************************/
    +If Bitand(CVTOSLV1,'20'x) = '20'x then do      /* HBB5510 ESA V5 & > */
    +  CVTHID   = C2d(Storage(D2x(CVT + 1068),4))   /* point to SHID      */
    +  CPCND_FLAGS = Storage(D2x(CVTHID+22),1)      /* pnt to CPCND FLAGS */
    +  If CPCND_FLAGS <> 0 then do                  /* Is there a CPC?    */
    +    CPCND_VALID = Bitand(CPCND_FLAGS,'E0'x)    /* Valid flags        */
    +    CPCND_INVALID = Bitand('40'x)              /* Invalid flag       */
    +    If CPCND_VALID <> CPCND_INVALID then do    /* Is it valid?       */
    +      CPCND_TYPE  = Storage(D2x(CVTHID+26),6)  /* Type               */
    +      CPCND_MODEL = Storage(D2x(CVTHID+32),3)  /* Model              */
    +      CPCND_MAN   = Storage(D2x(CVTHID+35),3)  /* Manufacturer       */
    +      CPCND_PLANT = Storage(D2x(CVTHID+38),2)  /* Plant of manufact. */
    +      CPCND_SEQNO = Storage(D2x(CVTHID+40),12) /* Sequence number    */
    +      CPC_ID      = C2x(Storage(D2x(CVTHID+55),1))  /* CPC ID        */
    +      Queue ' '
    +   /* Queue 'Central Processing Complex (CPC) Node Descriptor:' */
    +      Queue 'Central Processing Complex (CPC) Information:'
    +      Queue '  CPC ND =',
    +       CPCND_TYPE'.'CPCND_MODEL'.'CPCND_MAN'.'CPCND_PLANT'.'CPCND_SEQNO
    +      If Bitand(CVTOSLV3,'10'x) = '10'x then do    /*z/OS 1.2 & above*/
    +        Call GET_CPCSI /* Get CPC SI (STSI) information sub-routine  */
    +        Queue '  CPC SI ='  CPCSI_TYPE'.'CPCSI_MODEL'.'  || ,
    +               CPCSI_MAN'.'CPCSI_PLANT'.'CPCSI_CPUID
    +        Queue '           Model:' CPCSI_MODELID
    +      End /* If Bitand(CVTOSLV3,'10'x) = '10'x */
    +      Queue '  CPC ID =' CPC_ID
    +      Queue '  Type('CPCND_TYPE') Model('CPCND_MODEL')',
    +            'Manufacturer('CPCND_MAN') Plant('CPCND_PLANT')',
    +            'Seq Num('CPCND_SEQNO')'
    +      If Bitand(CVTOSLV3,'20'x) = '20'x then do    /*z/OS 1.1 & above*/
    +        RMCTX1M  = Storage(D2x(RMCT+500),4)        /* Microcode addr */
    +                                                   /*   in RMCTX1    */
    +        If RMCTX1M  <> '7FFFF000'x then do         /* skip VM/FLEX/ES*/
    +          RMCTX1M  = C2d(RMCTX1M)                  /* change to dec. */
    +          MCL      = Storage(D2x(RMCTX1M + 40),8)  /* Microcode lvl  */
    +          MCLDRV   = Substr(MCL,1,4)               /* Driver only..  */
    +          If Datatype(MCLDRV,'Number') = 1 then ,  /* if all numeric */
    +             MCLDRV = Format(MCLDRV)               /* rmv leading 0s */
    +          Queue '  The Microcode level of this CPC is' MCL || ,
    +                ' (Driver' MCLDRV').'
    +        End /* If RMCTX1M  <> '7FFFF000'x */
    +      End /* If Bitand(CVTOSLV3,'20'x) = '20'x */
    +    End /* if CPCND_VALID <> CPCND_INVALID */
    +    Else do
    +      If Bitand(CVTOSLV3,'10'x) = '10'x then do    /*z/OS 1.2 & above*/
    +        Call GET_CPCSI /* Get CPC SI (STSI) information sub-routine  */
    +        Queue ' '
    +        Queue 'Central Processing Complex (CPC) Information:'
    +        Queue '  CPC SI ='  CPCSI_TYPE'.'CPCSI_MODEL'.'  || ,
    +               CPCSI_MAN'.'CPCSI_PLANT'.'CPCSI_CPUID
    +        Queue '           Model:' CPCSI_MODELID
    +      End /* if Bitand(CVTOSLV3,'10'x) = '10'x */
    +    End /* else do */
    +  End  /* if CPCND_FLAGS <>0  */
    +End
    +Return
    +
    +IPA:                 /* IPA information sub-routine                  */
    +Queue ' '
    +/*********************************************************************/
    +/* IPL parms from the IPA                                            */
    +/*********************************************************************/
    +If Bitand(CVTOSLV1,'01'x) = '01'x then do    /* OS/390 R2 and above  */
    +  IPAICTOD = Storage(D2x(ECVTIPA + 8),8)     /* point to IPL TOD     */
    +  IPALPARM = Storage(D2x(ECVTIPA + 16),8)    /* point to LOAD PARM   */
    +  IPALPDSN = Storage(D2x(ECVTIPA + 48),44)   /* load parm dsn name   */
    +  IPALPDDV = Storage(D2x(ECVTIPA + 92),4)    /* load parm dev number */
    +  IPAHWNAM = Storage(D2x(ECVTIPA + 24),8)    /* point to HWNAME      */
    +  IPAHWNAM = Strip(IPAHWNAM,'T')             /* del trailing blanks  */
    +  IPALPNAM = Storage(D2x(ECVTIPA + 32),8)    /* point to LPARNAME    */
    +  IPALPNAM = Strip(IPALPNAM,'T')             /* del trailing blanks  */
    +  IPAVMNAM = Storage(D2x(ECVTIPA + 40),8)    /* point to VMUSERID    */
    +  /**************************/
    +  /* PARMS in LOADxx        */
    +  /**************************/
    +  IPANUCID = Storage(D2x(ECVTIPA + 23),1)    /* NUCLEUS ID           */
    +  IPAIODF  = Storage(D2x(ECVTIPA + 96),63)   /* IODF    card image   */
    +  IPASPARM = Storage(D2x(ECVTIPA + 160),63)  /* SYSPARM card image   */
    +  /*IPASCAT= Storage(D2x(ECVTIPA + 224),63)*//* SYSCAT  card image   */
    +  IPASYM   = Storage(D2x(ECVTIPA + 288),63)  /* IEASYM  card image   */
    +  IPAPLEX  = Storage(D2x(ECVTIPA + 352),63)  /* SYSPLEX card image   */
    +  If Bitand(CVTOSLV2,'01'x) = '01'x then do  /* OS/390 R10 and above */
    +    IPAPLNUMX = Storage(D2x(ECVTIPA + 2134),2) /* number of parmlibs */
    +    IPAPLNUM  = IPAPLNUMX
    +  End
    +  Else ,                                     /* OS/390 R10 and above */
    +    IPAPLNUM = Storage(D2x(ECVTIPA + 2148),2) /* number of parmlibs  */
    +  IPAPLNUM = C2d(IPAPLNUM)                   /* convert to decimal   */
    +  POFF = 0
    +  Do P = 1 to IPAPLNUM
    +    IPAPLIB.P = Storage(D2x(ECVTIPA+416+POFF),63) /* PARMLIB cards   */
    +    IPAPLFLG.P = Storage(D2x(ECVTIPA+479+POFF),1)  /* flag bits      */
    +    If Bitand(IPAPLFLG.P,'20'x) = '20'x then ,   /* volser from cat? */
    +      IPAPLIB.P = Overlay('      ',IPAPLIB.P,46) /* no, clear it     */
    +    POFF = POFF + 64
    +  End
    +  IPANLID  = Storage(D2x(ECVTIPA + 2144),2)  /* NUCLSTxx member used */
    +  IPANUCW  = Storage(D2x(ECVTIPA + 2146),1)  /* load wait state char */
    +  IPAICTOD = C2x(IPAICTOD)   /* make "readable" for REXXTOD call     */
    +  Call REXXTOD IPAICTOD      /* convert TOD to YYYY.DDD HH:MM:SS.ttt */
    +  TOD_RESY = Substr(RESULT,1,4)      /* year portion from REXXTOD    */
    +  TOD_RESD = Substr(RESULT,6,3)      /* day  portion from REXXTOD    */
    +  TOD_REST = Substr(RESULT,10,8)     /* time portion from REXXTOD    */
    +  Call RDATE TOD_RESY TOD_RESD /* call RDATE- format for ISO/USA/EUR */
    +  MMIPA    = Substr(RESULT,1,2)              /* MM from MM/DD/YYYY   */
    +  DDIPA    = Substr(RESULT,4,2)              /* DD from MM/DD/YYYY   */
    +  YYYYIPA  = Substr(RESULT,7,4)              /* YYYY from MM/DD/YYYY */
    +  If DATEFMT = 'USA' then ,                  /* USA format date?     */
    +    IPAIDATE = Substr(RESULT,1,10)           /* date as MM/DD/YYYY   */
    +  If DATEFMT = 'EUR' then ,                  /* EUR format date?     */
    +    IPAIDATE = DDIPA'/'MMIPA'/'YYYYIPA       /* date as DD/MM/YYYY   */
    +  If DATEFMT = 'ISO' then ,                  /* ISO format date?     */
    +    IPAIDATE = YYYYIPA'-'MMIPA'-'DDIPA       /* date as YYYY-MM-DD   */
    +  Queue 'Initialization information from the IPA:'
    +  Queue '  IPL TIME (GMT):' IPAIDATE ,
    +           '('TOD_RESY'.'TOD_RESD') at' TOD_REST
    +  Queue '  IPLPARM =' IPALPARM   '(merged)'
    +  Queue '  IPL load parameter data set name: 'IPALPDSN
    +  Queue '  IPL load parameter data set device address: 'IPALPDDV
    +  Queue '  HWNAME='IPAHWNAM '  LPARNAME='IPALPNAM ,
    +        '  VMUSERID='IPAVMNAM
    +  Queue '  '                    /* add blank line for readability   */
    +  Queue '  LOADxx parameters from the IPA' ,
    +        '(LOAD' || Substr(IPALPARM,5,2) || '):'
    +  Queue '    *---+----1----+----2----+----3----+----4' || ,
    +            '----+----5----+----6----+----7--'
    +  If Bitand(CVTOSLV2,'01'x) = '01'x then do    /* OS/390 R10 & above */
    +    IPAARCHL = Storage(D2x(ECVTIPA + 2143),1)  /* ARCHLVL (1 or 2)   */
    +    Queue '    ARCHLVL  'IPAARCHL
    +  End
    +  If IPASYM   <> '' then queue '    IEASYM   'IPASYM
    +  If IPAIODF  <> '' then queue '    IODF     'IPAIODF
    +  If IPANUCID <> '' then queue '    NUCLEUS  'IPANUCID
    +  If IPANLID  <> '' then queue '    NUCLST   'IPANLID' 'IPANUCW
    +  Do P = 1 to IPAPLNUM
    +    Queue '    PARMLIB  'IPAPLIB.P
    +  End
    +  If IPASCAT  <> '' then queue '    SYSCAT   'IPASCAT
    +  If IPASPARM <> '' then queue '    SYSPARM  'IPASPARM
    +  If IPAPLEX  <> '' then queue '    SYSPLEX  'IPAPLEX
    +  /**************************/
    +  /* PARMS in IEASYSxx      */
    +  /**************************/
    +  Queue '  '                    /* add blank line for readability   */
    +  Queue '  IEASYSxx parameters from the IPA:          ',
    +        '                     (Source)'
    +  Call BUILD_IPAPDETB    /* Build table for init parms               */
    +  TOTPRMS = 0            /* tot num of specified or defaulted parms  */
    +  Do I = 1 to IPAPDETB.0
    +    Call EXTRACT_SYSPARMS IPAPDETB.I   /* extract parms from the IPA */
    +  End
    + /********************************************************************/
    + /* Uncommment a sample below to test IPA PAGE parm "split" code:    */
    + /*  PRMLINE.32 = 'SWAP SWAP=(SYS1.SWAP.TEST) IEASYSXX'              */
    + /*  PRMLINE.32 = 'NONVIO NONVIO=(SYS1.PAGE.TEST) IEASYSXX'          */
    + /*  PRMLINE.32 = 'NONVIO NONVIO=(SYS1.PAGE1,SYS1.PAGE2) IEASYSXX'   */
    + /*  PRMLINE.32 = 'NONVIO ' || ,                                     */
    + /*  'NONVIO=(SYS1.PAGE1,SYS1.PAGE2,SYS1.PAGE3,SYS1.PAGE4) IEASYSXX' */
    + /********************************************************************/
    +  Call SORT_IPA                       /* sort IPA parms              */
    +  Call SPLIT_IPA_PAGE                 /* split page/swap dsn parms   */
    +  Do I = 1 to TOT_IPALINES            /* add ipa parms               */
    +    If I = TOT_IPALINES then ,        /*   to stack and              */
    +      IPALINE.I = Translate(IPALINE.I,' ',',') /* remove comma       */
    +    Queue IPALINE.I                   /*           from last parm    */
    +  End
    +End
    +Return
    +
    +SYMBOLS:             /* System Symbols information sub-routine       */
    +Queue ' '
    +/*********************************************************************/
    +/* Find System Symbols  - ASASYMBP MACRO                             */
    +/*  ECVT+X'128' = ECVTSYMT                                           */
    +/*  2nd half word = # of symbols , after that each entry is 4 words  */
    +/*  1st word = offset to symbol name                                 */
    +/*  2nd word = length of symbol name                                 */
    +/*  3rd word = offset to symbol value                                */
    +/*  4th word = length of symbol value                                */
    +/*********************************************************************/
    +If Bitand(CVTOSLV1,'10'x) = '10'x then do    /* HBB5520 ESA V5.2 & > */
    +  ECVTSYMT = C2d(Storage(D2x(ECVT + 296),4)) /* point to ECVTSYMT    */
    +  NUMSYMBS = C2d(Storage(D2x(ECVTSYMT + 2),2))  /* number of symbols */
    +  Queue 'Static System Symbol Values:'
    +  Do I = 1 to NUMSYMBS
    +    SOFF = I*16-16
    +    NAMOFF  = C2d(Storage(D2x(ECVTSYMT+4+SOFF),4))  /*offset to name */
    +    NAMLEN  = C2d(Storage(D2x(ECVTSYMT+8+SOFF),4))  /*length of name */
    +    VALOFF  = C2d(Storage(D2x(ECVTSYMT+12+SOFF),4)) /*offset to value*/
    +    VALLEN  = C2d(Storage(D2x(ECVTSYMT+16+SOFF),4)) /*length of value*/
    +    SYMNAME = Storage(D2x(ECVTSYMT+4+NAMOFF),NAMLEN) /*symbol name   */
    +    If VALLEN = 0 then VALNAME = ''                 /* null value    */
    +    Else ,
    +    VALNAME = Storage(D2x(ECVTSYMT+4+VALOFF),VALLEN) /* symbol value */
    +      If Bitand(CVTOSLV6,'40'x) = '40'x then ,   /* z/OS 2.2 and >   */
    +      Queue ' ' Left(SYMNAME,18,' ') '=' VALNAME /* max 16 + & + .   */
    +      Else ,
    +      Queue ' ' Left(SYMNAME,10,' ') '=' VALNAME /* max 8 + & + .    */
    +  End  /* do NUMSYMBS */
    +End
    +Return
    +
    +VMAP:                /* Virtual Storage Map sub-routine              */
    +Arg VMAPOPT
    +If option <> 'ALL' then,
    +  Call STORAGE_GDA_LDA                       /* GDA/LDA stor routine */
    +SYSEND  = X2d(LDASTRTS) + (LDASIZS*1024) - 1 /* end of system area   */
    +SYSEND  = D2x(SYSEND)                        /* display in hex       */
    +If GDAVRSZ = 0 then do                       /* no v=r               */
    +  VRSTRT = 'N/A     '
    +  VREND  = 'N/A     '
    +  VVSTRT = LDASTRTA                          /* start of v=v         */
    +  VVEND  =  X2d(LDASTRTA) + (LDASIZEA*1024) - 1 /* end of v=v        */
    +  VVEND  =  D2x(VVEND)                       /* display in hex       */
    +End
    +Else do
    +  VRSTRT =  LDASTRTA                         /* start of v=r         */
    +  VREND  =  X2d(LDASTRTA) + (GDAVRSZ*1024) - 1 /* end of v=r         */
    +  VREND  =  D2X(VREND)                       /* display in hex       */
    +  VVSTRT =  LDASTRTA                         /* start of v=v         */
    +  VVEND  =  X2d(LDASTRTA) + (LDASIZEA*1024) - 1 /* end of v=v        */
    +  VVEND  =  D2x(VVEND)                       /* display in hex       */
    +End
    +GDACSA   = C2d(Storage(D2x(CVTGDA + 108),4)) /* start of CSA addr    */
    +GDACSAH  = D2x(GDACSA)                       /* display in hex       */
    +CSAEND   = (GDACSASZ*1024) + GDACSA - 1      /* end of CSA           */
    +CSAEND   = D2x(CSAEND)                       /* display in hex       */
    +CVTSMEXT = C2d(Storage(D2x(CVT +1196),4))    /* point to stg map ext.*/
    +CVTMLPAS = C2d(Storage(D2x(CVTSMEXT+ 8),4))  /* start of MLPA addr   */
    +CVTMLPAS = D2x(CVTMLPAS)                     /* display in hex       */
    +If CVTMLPAS <> 0 then do
    +  CVTMLPAE = C2d(Storage(D2x(CVTSMEXT+12),4))  /* end of MLPA addr   */
    +  CVTMLPAE = D2x(CVTMLPAE)                     /* display in hex     */
    +  MLPASZ   = X2d(CVTMLPAE) - X2d(CVTMLPAS) + 1 /* size of MLPA       */
    +  MLPASZ   = MLPASZ/1024                       /* convert to Kbytes  */
    +End
    +Else do /* no MLPA */
    +  CVTMLPAS = 'N/A     '
    +  CVTMLPAE = 'N/A     '
    +  MLPASZ   = 0
    +End
    +CVTFLPAS = C2d(Storage(D2x(CVTSMEXT+16),4))  /* start of FLPA addr   */
    +CVTFLPAS = D2x(CVTFLPAS)                     /* display in hex       */
    +If CVTFLPAS <> 0 then do
    +  CVTFLPAE = C2d(Storage(D2x(CVTSMEXT+20),4))  /* end of FLPA addr   */
    +  CVTFLPAE = D2x(CVTFLPAE)                     /* display in hex     */
    +  FLPASZ   = X2d(CVTFLPAE) - X2d(CVTFLPAS) + 1 /* size of FLPA       */
    +  FLPASZ   = FLPASZ/1024                       /* convert to Kbytes  */
    +End
    +Else do /* no FLPA */
    +  CVTFLPAS = 'N/A     '
    +  CVTFLPAE = 'N/A     '
    +  FLPASZ   = 0
    +End
    +CVTPLPAS = C2d(Storage(D2x(CVTSMEXT+24),4))  /* start of PLPA addr   */
    +CVTPLPAS = D2x(CVTPLPAS)                     /* display in hex       */
    +CVTPLPAE = C2d(Storage(D2x(CVTSMEXT+28),4))  /* end of PLPA addr     */
    +CVTPLPAE = D2x(CVTPLPAE)                     /* display in hex       */
    +PLPASZ   = X2d(CVTPLPAE) - X2d(CVTPLPAS) + 1 /* size of PLPA         */
    +PLPASZ   = PLPASZ/1024                       /* convert to Kbytes    */
    +GDASQA   = C2d(Storage(D2x(CVTGDA + 144),4)) /* start of SQA addr    */
    +GDASQAH  = D2x(GDASQA)                       /* display in hex       */
    +SQAEND   = (GDASQASZ*1024) + GDASQA - 1      /* end of SQA           */
    +SQAEND   = D2x(SQAEND)                       /* display in hex       */
    +CVTRWNS  = C2d(Storage(D2x(CVTSMEXT+32),4))  /* start of R/W nucleus */
    +CVTRWNS  = D2x(CVTRWNS)                      /* display in hex       */
    +CVTRWNE  = C2d(Storage(D2x(CVTSMEXT+36),4))  /* end of R/W nucleus   */
    +CVTRWNE  = D2x(CVTRWNE)                      /* display in hex       */
    +RWNUCSZ  = X2d(CVTRWNE)  - X2d(CVTRWNS)  + 1 /* size of R/W nucleus  */
    +RWNUCSZ  = Format(RWNUCSZ/1024,,0)           /* convert to Kbytes    */
    +CVTRONS  = C2d(Storage(D2x(CVTSMEXT+40),4))  /* start of R/O nucleus */
    +CVTRONS  = D2x(CVTRONS)                      /* display in hex       */
    +CVTRONE  = C2d(Storage(D2x(CVTSMEXT+44),4))  /* end of R/O nucleus   */
    +CVTRONE  = D2x(CVTRONE)                      /* display in hex       */
    +RONUCSZ  = X2d(CVTRONE)  - X2d(CVTRONS)  + 1 /* size of R/O nucleus  */
    +RONUCSZ  = Format(RONUCSZ/1024,,0)           /* convert to Kbytes    */
    +RONUCSZB = X2d('FFFFFF') - X2d(CVTRONS) + 1  /* size of R/O nuc <16M */
    +RONUCSZB = Format(RONUCSZB/1024,,0)          /* convert to Kbytes    */
    +RONUCSZA = X2d(CVTRONE) - X2d('1000000') + 1 /* size of R/O nuc >16M */
    +RONUCSZA = Format(RONUCSZA/1024,,0)          /* convert to Kbytes    */
    +CVTERWNS = C2d(Storage(D2x(CVTSMEXT+48),4))  /* start of E-R/W nuc   */
    +CVTERWNS = D2x(CVTERWNS)                     /* display in hex       */
    +CVTERWNE = C2d(Storage(D2x(CVTSMEXT+52),4))  /* end of E-R/W nuc     */
    +CVTERWNE = D2x(CVTERWNE)                     /* display in hex       */
    +ERWNUCSZ = X2d(CVTERWNE) - X2d(CVTERWNS) + 1 /* size of E-R/W nuc    */
    +ERWNUCSZ = ERWNUCSZ/1024                     /* convert to Kbytes    */
    +GDAESQA  = C2d(Storage(D2x(CVTGDA + 152),4)) /* start of ESQA addr   */
    +GDAESQAH = D2x(GDAESQA)                      /* display in hex       */
    +ESQAEND  = (GDAESQAS*1024) + GDAESQA - 1     /* end of ESQA          */
    +ESQAEND  = D2x(ESQAEND)                      /* display in hex       */
    +CVTEPLPS = C2d(Storage(D2x(CVTSMEXT+56),4))  /* start of EPLPA addr  */
    +CVTEPLPS = D2x(CVTEPLPS)                     /* display in hex       */
    +CVTEPLPE = C2d(Storage(D2x(CVTSMEXT+60),4))  /* end of EPLPA addr    */
    +CVTEPLPE = D2x(CVTEPLPE)                     /* display in hex       */
    +EPLPASZ  = X2d(CVTEPLPE) - X2d(CVTEPLPS) + 1 /* size of EPLPA        */
    +EPLPASZ  = EPLPASZ/1024                      /* convert to Kbytes    */
    +CVTEFLPS = C2d(Storage(D2x(CVTSMEXT+64),4))  /* start of EFLPA addr  */
    +CVTEFLPS = D2x(CVTEFLPS)                     /* display in hex       */
    +If CVTEFLPS <> 0 then do
    +  CVTEFLPE = C2d(Storage(D2x(CVTSMEXT+68),4))  /* end of EFLPA addr  */
    +  CVTEFLPE = D2x(CVTEFLPE)                     /* display in hex     */
    +  EFLPASZ  = X2d(CVTEFLPE) - X2d(CVTEFLPS) + 1 /* size of EFLPA      */
    +  EFLPASZ  = EFLPASZ/1024                      /* convert to Kbytes  */
    +End
    +Else do /* no EFLPA */
    +  CVTEFLPS = 'N/A     '
    +  CVTEFLPE = 'N/A     '
    +  EFLPASZ  = 0
    +End
    +CVTEMLPS = C2d(Storage(D2x(CVTSMEXT+72),4))  /* start of EMLPA addr  */
    +CVTEMLPS = D2x(CVTEMLPS)                     /* display in hex       */
    +If CVTEMLPS <> 0 then do
    +  CVTEMLPE = C2d(Storage(D2x(CVTSMEXT+76),4))  /* end of EMLPA addr  */
    +  CVTEMLPE = D2x(CVTEMLPE)                     /* display in hex     */
    +  EMLPASZ  = X2d(CVTEMLPE) - X2d(CVTEMLPS) + 1 /* size of EMLPA      */
    +  EMLPASZ  = EMLPASZ/1024                      /* convert to Kbytes  */
    +End
    +Else do /* no EMLPA */
    +  CVTEMLPS = 'N/A     '
    +  CVTEMLPE = 'N/A     '
    +  EMLPASZ  = 0
    +End
    +GDAECSA  = C2d(Storage(D2x(CVTGDA + 124),4)) /* start of ECSA addr   */
    +GDAECSAH = D2x(GDAECSA)                      /* display in hex       */
    +ECSAEND  = (GDAECSAS*1024) + GDAECSA - 1     /* end of ECSA          */
    +ECSAEND  = D2x(ECSAEND)                      /* display in hex       */
    +GDAEPVT  = C2d(Storage(D2x(CVTGDA + 168),4)) /* start of EPVT addr   */
    +GDAEPVTH = D2x(GDAEPVT)                      /* display in hex       */
    +EPVTEND  = (GDAEPVTS*1024*1024) + GDAEPVT - 1 /* end of EPVT         */
    +EPVTEND  = D2x(EPVTEND)                      /* display in hex       */
    +If VMAPOPT <> 'NODISP' then do         /* no display of vmap desired */
    +Queue ' '
    +Queue 'Virtual Storage Map:'
    +Queue '          '
    +If VMAP = 'HIGHFIRST' then do
    +If Bitand(CVTOSLV2,'01'x) = '01'x then ,     /* OS/390 R10 and above */
    + Queue '     Storage Area     Start      End           Size' ,
    +       '     Used     Conv      HWM'
    +Else ,
    + Queue '     Storage Area     Start      End           Size' ,
    +       '     Used     Conv'
    +Queue '          '
    +Queue '     Ext. Private    '     Right(GDAEPVTH,8,'0') ' ' ,
    +   Right(EPVTEND,8,'0')           Right(GDAEPVTS,8,' ')'M'
    +If Bitand(CVTOSLV2,'01'x) = '01'x then ,     /* OS/390 R10 and above */
    +Queue '         Ext. CSA    '     Right(GDAECSAH,8,'0') ' ' ,
    +   Right(ECSAEND,8,'0')           Right(GDAECSAS,8,' ')'K' ,
    +   Right(GDA_ECSA_ALLOC,8,' ')'K         ' ,
    +   Right(GDAECSAHWM,7,' ')'K'
    +Else ,
    +Queue '         Ext. CSA    '     Right(GDAECSAH,8,'0') ' ' ,
    +   Right(ECSAEND,8,'0')           Right(GDAECSAS,8,' ')'K' ,
    +   Right(GDA_ECSA_ALLOC,8,' ')'K'
    +Queue '        Ext. MLPA    '     Right(CVTEMLPS,8,'0') ' ' ,
    +   Right(CVTEMLPE,8,'0')          Right(EMLPASZ,8,' ')'K'
    +Queue '        Ext. FLPA    '     Right(CVTEFLPS,8,'0') ' ' ,
    +   Right(CVTEFLPE,8,'0')          Right(EFLPASZ,8,' ')'K'
    +Queue '        Ext. PLPA    '     Right(CVTEPLPS,8,'0') ' ' ,
    +   Right(CVTEPLPE,8,'0')          Right(EPLPASZ,8,' ')'K'
    +If Bitand(CVTOSLV2,'01'x) = '01'x then ,     /* OS/390 R10 and above */
    +Queue '         Ext. SQA    '     Right(GDAESQAH,8,'0') ' ' ,
    +   Right(ESQAEND,8,'0')           Right(GDAESQAS,8,' ')'K' ,
    +   Right(GDA_ESQA_ALLOC,8,' ')'K' Right(GDA_ECSA_CONV,7,' ')'K',
    +   Right(GDAESQAHWM,7,' ')'K'
    +Else ,
    +Queue '         Ext. SQA    '     Right(GDAESQAH,8,'0') ' ' ,
    +   Right(ESQAEND,8,'0')           Right(GDAESQAS,8,' ')'K' ,
    +   Right(GDA_ESQA_ALLOC,8,' ')'K' Right(GDA_ECSA_CONV,7,' ')'K'
    +Queue ' Ext. R/W Nucleus    '     Right(CVTERWNS,8,'0') ' ' ,
    +   Right(CVTERWNE,8,'0')          Right(ERWNUCSZ,8,' ')'K'
    +Queue ' Ext. R/O Nucleus    '     Right('1000000',8,'0') ' ' ,
    +   Right(CVTRONE,8,'0')           Right(RONUCSZA,8,' ')'K' ,
    +   '(Total' RONUCSZ'K)'
    +Queue '             16M line -----------------------------'
    +Queue '      R/O Nucleus    '     Right(CVTRONS,8,'0') ' ' ,
    +   Right('FFFFFF',8,'0')          Right(RONUCSZB,8,' ')'K',
    +   '(Spans 16M line)'
    +Queue '      R/W Nucleus    '     Right(CVTRWNS,8,'0') ' ' ,
    +   Right(CVTRWNE,8,'0')           Right(RWNUCSZ,8,' ')'K'
    +If Bitand(CVTOSLV2,'01'x) = '01'x then ,     /* OS/390 R10 and above */
    +Queue '              SQA    '     Right(GDASQAH,8,'0') ' ' ,
    +   Right(SQAEND,8,'0')            Right(GDASQASZ,8,' ')'K' ,
    +   Right(GDA_SQA_ALLOC,8,' ')'K'  Right(GDA_CSA_CONV,7,' ')'K' ,
    +   Right(GDASQAHWM,7,' ')'K'
    +Else ,
    +Queue '              SQA    '     Right(GDASQAH,8,'0') ' ' ,
    +   Right(SQAEND,8,'0')            Right(GDASQASZ,8,' ')'K' ,
    +   Right(GDA_SQA_ALLOC,8,' ')'K'  Right(GDA_CSA_CONV,7,' ')'K'
    +Queue '             PLPA    '     Right(CVTPLPAS,8,'0') ' ' ,
    +   Right(CVTPLPAE,8,'0')          Right(PLPASZ,8,' ')'K'
    +Queue '             FLPA    '     Right(CVTFLPAS,8,'0') ' ' ,
    +   Right(CVTFLPAE,8,'0')          Right(FLPASZ,8,' ')'K'
    +Queue '             MLPA    '     Right(CVTMLPAS,8,'0') ' ' ,
    +   Right(CVTMLPAE,8,'0')          Right(MLPASZ,8,' ')'K'
    +If Bitand(CVTOSLV2,'01'x) = '01'x then ,     /* OS/390 R10 and above */
    +Queue '              CSA    '     Right(GDACSAH,8,'0') ' ' ,
    +   Right(CSAEND,8,'0')            Right(GDACSASZ,8,' ')'K' ,
    +   Right(GDA_CSA_ALLOC,8,' ')'K         ' ,
    +   Right(GDACSAHWM,7,' ')'K'
    +Else ,
    +Queue '              CSA    '     Right(GDACSAH,8,'0') ' ' ,
    +   Right(CSAEND,8,'0')            Right(GDACSASZ,8,' ')'K' ,
    +   Right(GDA_CSA_ALLOC,8,' ')'K'
    +Queue '      Private V=V    '     Right(VVSTRT,8,'0') ' ' ,
    +   Right(VVEND,8,'0')             Right(LDASIZEA,8,' ')'K'
    +Queue '      Private V=R    '     Right(VRSTRT,8,'0') ' ' ,
    +   Right(VREND,8,'0')             Right(GDAVRSZ,8,' ')'K'
    +Queue '           System    '     Right(LDASTRTS,8,'0') ' ' ,
    +   Right(SYSEND,8,'0')            Right(LDASIZS,8,' ')'K'
    +If zARCH = 2 then ,
    +  Queue '              PSA     00000000   00001FFF        8K'
    +Else ,
    +  Queue '              PSA     00000000   00000FFF        4K'
    +End  /* if VMAP = 'HIGHFIRST'  */
    +Else do  /* VMAP <> 'HIGHFIRST'  */
    +If Bitand(CVTOSLV2,'01'x) = '01'x then ,     /* OS/390 R10 and above */
    + Queue '     Storage Area     Start      End           Size' ,
    +       '     Used     Conv      HWM'
    +Else ,
    + Queue '     Storage Area     Start      End           Size' ,
    +       '     Used     Conv'
    +Queue '          '
    +If zARCH = 2 then ,
    +  Queue '              PSA     00000000   00001FFF        8K'
    +Else ,
    +  Queue '              PSA     00000000   00000FFF        4K'
    +Queue '           System    '     Right(LDASTRTS,8,'0') ' ' ,
    +   Right(SYSEND,8,'0')            Right(LDASIZS,8,' ')'K'
    +Queue '      Private V=R    '     Right(VRSTRT,8,'0') ' ' ,
    +   Right(VREND,8,'0')             Right(GDAVRSZ,8,' ')'K'
    +Queue '      Private V=V    '     Right(VVSTRT,8,'0') ' ' ,
    +   Right(VVEND,8,'0')             Right(LDASIZEA,8,' ')'K'
    +If Bitand(CVTOSLV2,'01'x) = '01'x then ,     /* OS/390 R10 and above */
    +Queue '              CSA    '     Right(GDACSAH,8,'0') ' ' ,
    +   Right(CSAEND,8,'0')            Right(GDACSASZ,8,' ')'K' ,
    +   Right(GDA_CSA_ALLOC,8,' ')'K         ' ,
    +   Right(GDACSAHWM,7,' ')'K'
    +Else ,
    +Queue '              CSA    '     Right(GDACSAH,8,'0') ' ' ,
    +   Right(CSAEND,8,'0')            Right(GDACSASZ,8,' ')'K' ,
    +   Right(GDA_CSA_ALLOC,8,' ')'K'
    +Queue '             MLPA    '     Right(CVTMLPAS,8,'0') ' ' ,
    +   Right(CVTMLPAE,8,'0')          Right(MLPASZ,8,' ')'K'
    +Queue '             FLPA    '     Right(CVTFLPAS,8,'0') ' ' ,
    +   Right(CVTFLPAE,8,'0')          Right(FLPASZ,8,' ')'K'
    +Queue '             PLPA    '     Right(CVTPLPAS,8,'0') ' ' ,
    +   Right(CVTPLPAE,8,'0')          Right(PLPASZ,8,' ')'K'
    +If Bitand(CVTOSLV2,'01'x) = '01'x then ,     /* OS/390 R10 and above */
    +Queue '              SQA    '     Right(GDASQAH,8,'0') ' ' ,
    +   Right(SQAEND,8,'0')            Right(GDASQASZ,8,' ')'K' ,
    +   Right(GDA_SQA_ALLOC,8,' ')'K'  Right(GDA_CSA_CONV,7,' ')'K' ,
    +   Right(GDASQAHWM,7,' ')'K'
    +Else ,
    +Queue '              SQA    '     Right(GDASQAH,8,'0') ' ' ,
    +   Right(SQAEND,8,'0')            Right(GDASQASZ,8,' ')'K' ,
    +   Right(GDA_SQA_ALLOC,8,' ')'K'  Right(GDA_CSA_CONV,7,' ')'K'
    +Queue '      R/W Nucleus    '     Right(CVTRWNS,8,'0') ' ' ,
    +   Right(CVTRWNE,8,'0')           Right(RWNUCSZ,8,' ')'K'
    +Queue '      R/O Nucleus    '     Right(CVTRONS,8,'0') ' ' ,
    +   Right('FFFFFF',8,'0')          Right(RONUCSZB,8,' ')'K',
    +   '(Spans 16M line)'
    +Queue '             16M line -----------------------------'
    +Queue ' Ext. R/O Nucleus    '     Right('1000000',8,'0') ' ' ,
    +   Right(CVTRONE,8,'0')           Right(RONUCSZA,8,' ')'K' ,
    +   '(Total' RONUCSZ'K)'
    +Queue ' Ext. R/W Nucleus    '     Right(CVTERWNS,8,'0') ' ' ,
    +   Right(CVTERWNE,8,'0')          Right(ERWNUCSZ,8,' ')'K'
    +If Bitand(CVTOSLV2,'01'x) = '01'x then ,     /* OS/390 R10 and above */
    +Queue '         Ext. SQA    '     Right(GDAESQAH,8,'0') ' ' ,
    +   Right(ESQAEND,8,'0')           Right(GDAESQAS,8,' ')'K' ,
    +   Right(GDA_ESQA_ALLOC,8,' ')'K' Right(GDA_ECSA_CONV,7,' ')'K',
    +   Right(GDAESQAHWM,7,' ')'K'
    +Else ,
    +Queue '         Ext. SQA    '     Right(GDAESQAH,8,'0') ' ' ,
    +   Right(ESQAEND,8,'0')           Right(GDAESQAS,8,' ')'K' ,
    +   Right(GDA_ESQA_ALLOC,8,' ')'K' Right(GDA_ECSA_CONV,7,' ')'K'
    +Queue '        Ext. PLPA    '     Right(CVTEPLPS,8,'0') ' ' ,
    +   Right(CVTEPLPE,8,'0')          Right(EPLPASZ,8,' ')'K'
    +Queue '        Ext. FLPA    '     Right(CVTEFLPS,8,'0') ' ' ,
    +   Right(CVTEFLPE,8,'0')          Right(EFLPASZ,8,' ')'K'
    +Queue '        Ext. MLPA    '     Right(CVTEMLPS,8,'0') ' ' ,
    +   Right(CVTEMLPE,8,'0')          Right(EMLPASZ,8,' ')'K'
    +If Bitand(CVTOSLV2,'01'x) = '01'x then ,     /* OS/390 R10 and above */
    +Queue '         Ext. CSA    '     Right(GDAECSAH,8,'0') ' ' ,
    +   Right(ECSAEND,8,'0')           Right(GDAECSAS,8,' ')'K' ,
    +   Right(GDA_ECSA_ALLOC,8,' ')'K         ' ,
    +   Right(GDAECSAHWM,7,' ')'K'
    +Else ,
    +Queue '         Ext. CSA    '     Right(GDAECSAH,8,'0') ' ' ,
    +   Right(ECSAEND,8,'0')           Right(GDAECSAS,8,' ')'K' ,
    +   Right(GDA_ECSA_ALLOC,8,' ')'K'
    +Queue '     Ext. Private    '     Right(GDAEPVTH,8,'0') ' ' ,
    +   Right(EPVTEND,8,'0')           Right(GDAEPVTS,8,' ')'M'
    +End  /* else do (VMAP <> 'HIGHFIRST')  */
    +
    +If bitand(CVTOSLV3,'02'x) = '02'x then do   /* z/OS 1.5 and above?   */
    +                            /* Yes, get HVSHARE info from the RCE    */
    +  RCELVSHRSTRT   = C2d(Storage(D2x(RCE + 544),8))  /* low virt addr  */
    +                                                   /* for 64-bit shr */
    +  RCELVSHRSTRT_D = C2x(Storage(D2x(RCE + 544),8))  /* make readable  */
    +  VSHRSTRT_D     = Substr(RCELVSHRSTRT_D,1,8) ,    /*  address range */
    +                   Substr(RCELVSHRSTRT_D,9,8)      /*   display      */
    +  RCELVHPRSTRT   = C2d(Storage(D2x(RCE + 552),8))  /* low virt addr  */
    +                                                   /* for 64-bit prv */
    +  RCELVHPRSTRT_D = C2d(Storage(D2x(RCE + 552),8)) -1 /*make readable */
    +  RCELVHPRSTRT_D = Right(D2x(RCELVHPRSTRT_D),16,'0') /* address      */
    +  VHPRSTRT_D     = Substr(RCELVHPRSTRT_D,1,8) ,    /*   range        */
    +                   Substr(RCELVHPRSTRT_D,9,8)      /*   display      */
    +  TOTAL_VHSHR    = RCELVHPRSTRT - RCELVSHRSTRT     /* total shared   */
    +  TOTAL_VHSHR    = TOTAL_VHSHR/1024/1024           /* change to MB   */
    +  TOTAL_VHSHR    = FORMAT_MEMSIZE(TOTAL_VHSHR)     /* format size    */
    +
    +  RCELVSHRSTRT   = RCELVSHRSTRT/1024/1024          /* change to MB   */
    +  RCELVSHRSTRT   = FORMAT_MEMSIZE(RCELVSHRSTRT)    /* format size    */
    +
    +  RCELVHPRSTRT   = RCELVHPRSTRT/1024/1024          /* change to MB   */
    +  RCELVHPRSTRT   = FORMAT_MEMSIZE(RCELVHPRSTRT)    /* format size    */
    +
    +  RCELVSHRPAGES  = C2d(Storage(D2x(RCE + 584),8))  /* shr pages      */
    +  RCELVSHRPAGES  = (RCELVSHRPAGES*4)/1024          /* change to MB   */
    +  RCELVSHRPAGES  = FORMAT_MEMSIZE(RCELVSHRPAGES)   /* format size    */
    +
    +  RCELVSHRGBYTES = C2d(Storage(D2x(RCE + 592),8))  /* shr bytes HWM  */
    +  RCELVSHRGBYTES = RCELVSHRGBYTES/1024/1024        /* change to MB   */
    +  RCELVSHRGBYTES = FORMAT_MEMSIZE(RCELVSHRGBYTES)  /* format size    */
    +
    +  Queue '   '
    +  Queue '  64-Bit Shared Virtual Storage (HVSHARE):'
    +  Queue '   '
    +  Queue '    Shared storage total:' TOTAL_VHSHR
    +  Queue '    Shared storage range:' RCELVSHRSTRT'-'RCELVHPRSTRT ,
    +        '('VSHRSTRT_D' - 'VHPRSTRT_D')'
    +  Queue '    Shared storage allocated:' RCELVSHRPAGES
    +  Queue '    Shared storage allocated HWM:' RCELVSHRGBYTES
    +
    +End /* If bitand(CVTOSLV3,'02'x) = '02'x  */
    +
    +If bitand(CVTOSLV5,'08'x) = '08'x then do   /* z/OS 1.10 and above   */
    +                            /* Yes, get HVCOMMON info from the RCE   */
    +  RCEHVCommonStrt = C2d(Storage(D2x(RCE + 872),8)) /*low virt addr */
    +                                                   /*for 64-bit cmn*/
    +  CommonStrt_D   = C2x(Storage(D2x(RCE + 872),8))  /*make readable */
    +  CommonStrt_D   = Substr(CommonStrt_D,1,8) ,      /* address range*/
    +                   Substr(CommonStrt_D,9,8)        /*  display     */
    +
    +  RCEHVCommonEnd = C2d(Storage(D2x(RCE + 880),8))  /*high virt addr*/
    +                                                   /*for 64-bit cmn*/
    +  RCEHVCommonEnd = RCEHVCommonEnd + 1              /* Add 1 to addr*/
    +  CommonEnd_D    = C2x(Storage(D2x(RCE + 880),8))  /*make readable */
    +  CommonEnd_D    = Substr(CommonEnd_D,1,8) ,       /* address range*/
    +                   Substr(CommonEnd_D,9,8)         /*  display     */
    +
    +  TOTAL_VHCOMN   = RCEHVCommonEnd-RCEHVCommonStrt  /* total common */
    +  TOTAL_VHCOMN   = TOTAL_VHCOMN/1024/1024          /* change to MB */
    +  TOTAL_VHCOMN   = FORMAT_MEMSIZE(TOTAL_VHCOMN)    /* format size  */
    +
    +  RCEHVCommonStrt = RCEHVCommonStrt/1024/1024      /* chg to MB    */
    +  RCEHVCommonStrt = FORMAT_MEMSIZE(RCEHVCommonStrt) /* format size */
    +
    +  RCEHVCommonEnd = RCEHVCommonEnd/1024/1024        /* chg to MB    */
    +  RCEHVCommonEnd = FORMAT_MEMSIZE(RCEHVCommonEnd)  /* format  size */
    +
    +  RCEHVCommonPAGES = C2d(Storage(D2x(RCE + 888),8)) /* comn pages  */
    +  RCEHVCommonPAGES = (RCEHVCommonPAGES*4)/1024      /* chg to MB   */
    +  RCEHVCommonPAGES = FORMAT_MEMSIZE(RCEHVCommonPAGES) /*format size*/
    +
    +  RCEHVCommonHWMBytes = C2d(Storage(D2x(RCE + 896),8)) /* comn HWM */
    +  RCEHVCommonHWMBytes = RCEHVCommonHWMBytes/1024/1024  /*chg to MB */
    +  RCEHVCommonHWMBytes = FORMAT_MEMSIZE(RCEHVCommonHWMBytes) /* fmt */
    +
    +  Queue '   '
    +  Queue '  64-Bit Common Virtual Storage (HVCOMMON):'
    +  Queue '   '
    +  Queue '    Common storage total:' TOTAL_VHCOMN
    +  Queue '    Common storage range:' RCEHVCommonStrt'-'RCEHVCommonEnd ,
    +        '('CommonStrt_D' - 'CommonEnd_D')'
    +  Queue '    Common storage allocated:' RCEHVCommonPAGES
    +  Queue '    Common storage allocated HWM:' RCEHVCommonHWMBytes
    +End /* If bitand(CVTOSLV5,'08'x) = '08'x  */
    +If Bitand(CVTOSLV5,'10'x) = '10'x &     ,   /* z/OS 1.9 and above &  */
    +   Bitand(CVTFLAG2,'01'x) = '01'x then do   /*  CVTEDAT on (z10 >)?  */
    +  LARGEMEM = 1                              /* set LARGEMEM avail flg*/
    +  RCEReconLFASize  = C2d(Storage(D2x(RCE + 760),8)) /* recon lfarea  */
    +  RCENonReconLFASize = C2d(Storage(D2x(RCE + 768),8)) /*  LFAREA     */
    + /* Comment out or delete the next 2 lines of code if you want the   */
    + /* large memory displays even if you specified or defaulted to      */
    + /* LFAREA=0M (z/OS 1.9 & above) and have the hardware support.      */
    +  If RCEReconLFASize = 0 & RCENonReconLFASize = 0 then ,  /* both 0? */
    +   LARGEMEM = 0
    +  If Bitand(CVTOSLV6,'80'x) = '80'x then do /* z/OS 2.1 and above    */
    +    PL = 1                                  /* pageable1m + 2.1 & >  */
    +    /*****************/
    +    /* 2G frame code */
    +    /*****************/
    +    RCE2GMemoryObjects          = ,
    +     C2d(Storage(D2x(RCE + 1256),8))    /* Number of 2G objects      */
    +    RCE2GNonReconLFASize        = ,
    +     C2d(Storage(D2x(RCE + 1272),8))    /* 2G frame area in 2G units */
    +    RCE2GNonReconLFAUsed        = ,
    +     C2d(Storage(D2x(RCE + 1280),8))    /* used 2G frames            */
    +    RCE2GHWM                    = ,
    +     C2d(Storage(D2x(RCE + 1288),4))    /* 2G used frames HWM        */
    +    If RCE2GNonReconLFASize <> 0 then LARGEMEM = 1  /* lfarea used   */
    +  End
    +    Else PL = 0                             /* no pageable1m         */
    +End /* If Bitand(CVTOSLV5,'10'x) */
    +   Else LARGEMEM = 0                        /* < z/OS 1.9/no hw supt */
    +If LARGEMEM = 1 then do                      /* z/OS 1.10 & above  */
    +  RCELargeMemoryObjects = ,
    +   C2d(Storage(D2x(RCE + 744),8))             /*tot large mem objs */
    +  RCELargePagesBackedinReal = ,
    +   C2d(Storage(D2x(RCE + 752),8))             /* tot lrg obj pages */
    +  RCELFAvailGroups          = ,
    +   C2d(Storage(D2x(RCE + 796),4))             /* avial lrg frames  */
    +  RCEReconLFAUsed             = ,
    +   C2d(Storage(D2x(RCE + 776),8))    /* # recon 1M frames alloc    */
    +  RCENonReconLFAUsed          = ,
    +   C2d(Storage(D2x(RCE + 784),8))    /* # nonrecon 1M frames alloc */
    +
    +  LFASize = RCEReconLFASize + RCENonReconLFASize     /* LFAREA size*/
    +  LFA_Used    = RCEReconLFAUsed + RCENonReconLFAUsed /* used LFAREA*/
    +  LFA_Alloc1M = RCELargePagesBackedinReal            /* 1M alloc   */
    +  LFA_Alloc4K = LFA_Used - LFA_Alloc1M               /* 4K alloc   */
    +
    +  If PL = 1 then do            /* z/OS 2.1 / pageable1m support    */
    +    RCELargeUsed4K              = ,
    +     C2d(Storage(D2x(RCE + 1032),4))      /* 4K used for 1M req    */
    +    LFA_Alloc4K = RCELargeUsed4K     /* chg var name for old code  */
    +    RceLargeAllocatedPL         = ,
    +     C2d(Storage(D2x(RCE + 1244),4))      /* # used pageable1m     */
    +    RceLargeUsedPLHWM           = ,
    +     C2d(Storage(D2x(RCE + 1252),4))      /* pageable1m HWM        */
    +  End
    +
    +  LFASize     = FORMAT_MEMSIZE(LFASize)          /* format size    */
    +  LFA_Avail   = FORMAT_MEMSIZE(RCELFAvailGroups) /* format size    */
    +  LFA_Alloc1M = FORMAT_MEMSIZE(LFA_Alloc1M)      /* format size    */
    +  LFA_Alloc4K = FORMAT_MEMSIZE(LFA_Alloc4K)      /* format size    */
    +
    +  If PL = 1 then do            /* z/OS 2.1 + pageable1m support    */
    +    RceLargeAllocatedPL = FORMAT_MEMSIZE(RceLargeAllocatedPL)
    +    RceLargeUsedPLHWM   = FORMAT_MEMSIZE(RceLargeUsedPLHWM)
    +    /*****************/
    +    /* 2G frame code */
    +    /*****************/
    +    LFA2G_Size  = FORMAT_MEMSIZE(RCE2GNonReconLFASize*2048)
    +    LFA2G_Used  = FORMAT_MEMSIZE(RCE2GNonReconLFAUsed*2048)
    +    LFA2G_avail = ((RCE2GNonReconLFASize-RCE2GNonReconLFAUsed)*2048)
    +    LFA2G_avail = FORMAT_MEMSIZE(LFA2G_avail)
    +    LFA2G_Max   = RCE2GHWM*2048
    +    LFA2G_Max   = FORMAT_MEMSIZE(LFA2G_Max)
    +  End
    +
    +  If Bitand(CVTOSLV5,'04'x) = '04'x then do /* z/OS 1.12 and above */
    +    RceLargeUsed1MHWM           = ,
    +     C2d(Storage(D2x(RCE + 804),4)) /*large pg HWM alloc behalf 1M */
    +    RceLargeUsed4KHWM           = ,
    +     C2d(Storage(D2x(RCE + 808),4)) /*large pg HWM alloc behalf 4K */
    +    LFA_Max1M = FORMAT_MEMSIZE(RceLargeUsed1MHWM)  /* format size  */
    +    LFA_Max4K = FORMAT_MEMSIZE(RceLargeUsed4KHWM)  /* format size  */
    +  End
    +
    +  Queue '   '
    +  Queue '  64-Bit Large Memory Virtual Storage (LFAREA):'
    +  Queue '   '
    +  If PL = 1 then do            /* z/OS 2.1 / pageable1m support    */
    +    Queue '    Large memory area (LFAREA)    :' LFASize ',' LFA2G_Size
    +    Queue '    Large memory storage available:' LFA_Avail ',' ,
    +               LFA2G_avail
    +  End
    +  Else do
    +    Queue '    Large memory area (LFAREA)    :' LFASize
    +    Queue '    Large memory storage available:' LFA_Avail
    +  End
    +  Queue '    Large memory storage allocated (1M):' LFA_Alloc1M
    +  Queue '    Large memory storage allocated (4K):' LFA_Alloc4K
    +  If Bitand(CVTOSLV5,'04'x) = '04'x then do /* z/OS 1.12 and above */
    +    Queue '    Large memory storage allocated HWM (1M):' LFA_Max1M
    +    Queue '    Large memory storage allocated HWM (4K):' LFA_Max4K
    +  End
    +  If PL = 1 then do            /* z/OS 2.1 / pageable1m support    */
    +    Queue '    Large memory storage allocated (PAGEABLE1M):' ,
    +     RceLargeAllocatedPL
    +    Queue '    Large memory storage allocated HWM (PAGEABLE1M):' ,
    +     RceLargeUsedPLHWM
    +    Queue '    Large memory storage allocated (2G):' LFA2G_Used ,
    +          '/' RCE2GNonReconLFAUsed 'pages'
    +    Queue '    Large memory storage allocated HWM (2G):' LFA2G_Max ,
    +          '/' RCE2GHWM 'pages'
    +  End
    +  Queue '    Large memory objects allocated:' RCELargeMemoryObjects
    +  If PL = 1 then ,             /* z/OS 2.1 / pageable1m support    */
    +    Queue '    Large memory objects allocated (2G):' RCE2GMemoryObjects
    +End
    +End  /* If VMAPOPT <> 'NODISP' */
    +Return
    +
    +PAGE:                /* Page Data Sets information sub-routine       */
    +Queue ' '
    +Queue 'Page Data Set Usage:'
    +Queue '  Type     Full     Slots  Dev   Volser  Data Set Name'
    +ASMPART  = C2d(Storage(D2x(ASMVT + 8),4))  /* Pnt to Pag Act Ref Tbl */
    +PARTSIZE = C2d(Storage(D2x(ASMPART+4),4))  /* Tot number of entries  */
    +PARTDSNL = C2d(Storage(D2x(ASMPART+24),4)) /* Point to 1st pg dsn    */
    +PARTENTS = ASMPART+80                      /* Point to 1st parte     */
    +Do I = 1 to PARTSIZE
    +  If I > 1 then do
    +    PARTENTS = PARTENTS + 96
    +    PARTDSNL = PARTDSNL + 44
    +  End
    +  CHKINUSE = Storage(D2x(PARTENTS+9),1)    /* in use flag            */
    +  If Bitand(CHKINUSE,'80'x) = '80'x then iterate /* not in use       */
    +  PGDSN    = Storage(D2x(PARTDSNL),44)     /* page data set name     */
    +  PGDSN    = Strip(PGDSN,'T')              /* remove trailing blanks */
    +  PARETYPE = Storage(D2x(PARTENTS+8),1)    /* type flag              */
    +  Select
    +    When Bitand(PARETYPE,'80'x) = '80'x then PGTYPE = ' PLPA    '
    +    When Bitand(PARETYPE,'40'x) = '40'x then PGTYPE = ' COMMON  '
    +    When Bitand(PARETYPE,'20'x) = '20'x then PGTYPE = ' DUPLEX  '
    +    When Bitand(PARETYPE,'10'x) = '10'x then PGTYPE = ' LOCAL   '
    +    Otherwise PGTYPE = '??????'
    +  End  /* Select */
    +  If PGTYPE = ' LOCAL   ' then do
    +    PAREFLG1  = Storage(D2x(PARTENTS+9),1)    /* PARTE flags         */
    +    If Bitand(PAREFLG1,'10'x) = '10'x then PGTYPE = ' LOCAL NV'
    +  End
    +  PAREUCBP = C2d(Storage(D2x(PARTENTS+44),4)) /* point to UCB        */
    +  PGUCB    = C2x(Storage(D2x(PAREUCBP+4),2))  /* UCB address         */
    +  PGVOL    = Storage(D2x(PAREUCBP+28),6)      /* UCB volser          */
    +  PARESZSL = C2d(Storage(D2x(PARTENTS+16),4)) /* total slots         */
    +  PARESZSL = Right(PARESZSL,9,' ')            /* ensure 9 digits     */
    +  PARESLTA = C2d(Storage(D2x(PARTENTS+20),4)) /* avail. slots        */
    +  PGFULL   = ((PARESZSL-PARESLTA) / PARESZSL) * 100 /* percent full  */
    +  PGFULL   = Format(PGFULL,3,2)               /* force 2 decimals    */
    +  PGFULL   = Left(PGFULL,3)                   /* keep intiger only   */
    +  Queue  ' 'PGTYPE' 'PGFULL'% 'PARESZSL'  'PGUCB' ' ,
    +         PGVOL'  'PGDSN
    +End  /* do I=1 to partsize */
    +/*********************************************************************/
    +/* SCM - Storage Class Memory                                        */
    +/* ASMVX - SYS1.MODGEN(ILRASMVX) pointed to in SYS1.MODGEN(ILRASMVT) */
    +/*********************************************************************/
    + /*If Bitand(CVTOSLV5,'01'x) = '01'x then do */ /* z/OS 1.13 and > */
    +If Bitand(CVTOSLV6,'80'x) = '80'x then do    /* z/OS 2.1  and above  */
    +  SCMSTATUS = 'NOT-USED'                     /* set dflt to not used */
    +  ASMVX = C2d(Storage(D2x(ASMVT + 1236),4))  /* point to ASM tbl ext */
    +  SCMBLKSAVAIL = C2d(Storage(D2x(ASMVX + 8),8))   /* SCM blks avail  */
    +  SCMNVBC      = C2d(Storage(D2x(ASMVX + 16),8))  /* SCM blks used   */
    +  SCMERRS      = C2d(Storage(D2x(ASMVX + 24),8))  /* bad SCM blks    */
    +  If (SCMBLKSAVAIL > 0) then do              /* SCM is used          */
    +    SCMSTATUS = 'IN-USE  '                   /* status is IN-USE     */
    +    SCMPCTUSED = Trunc(SCMNVBC*100/SCMBLKSAVAIL)  /* percent used    */
    +    SCMPCTUSED = Format(SCMPCTUSED,3,2)      /* format for display   */
    +    SCMPCTUSED = Left(SCMPCTUSED,3)          /* format for display   */
    +    Call FORMAT_COMMAS SCMBLKSAVAIL          /* format with commas   */
    +    SCMBLKSAVAIL = FORMATTED_WHOLENUM        /* save number          */
    +    Call FORMAT_COMMAS SCMNVBC               /* format with commas   */
    +    SCMNVBC      = FORMATTED_WHOLENUM        /* save number          */
    +    Call FORMAT_COMMAS SCMERRS               /* format with commas   */
    +    SCMERRS      = FORMATTED_WHOLENUM        /* save number          */
    +    SCMBLKSAVAIL = Right(SCMBLKSAVAIL,16)    /* format for display   */
    +    SCMNVBC      = Right(SCMNVBC,16)         /* format for display   */
    +    SCMERRS      = Right(SCMERRS,16)         /* format for display   */
    +  End
    +  Queue ' '
    +  Queue 'Storage Class Memory:'
    +  Queue '  STATUS      FULL               SIZE             USED' ,
    +        '        IN-ERROR'
    +  If SCMSTATUS = 'NOT-USED' then Queue ' ' SCMSTATUS
    +  Else do
    +    Queue ' ' SCMSTATUS '  ' SCMPCTUSED || '%  '  ,
    +          SCMBLKSAVAIL SCMNVBC SCMERRS
    +  End
    +End
    +Return
    +
    +SMF:                 /* SMF Data Set information sub-routine         */
    +Queue ' '
    +Queue 'SMF Data Set Usage:'
    +Queue '  Name                      Volser   Size(Blks)  %Full  Status'
    +SMCAMISC = Storage(D2x(SMCA + 1),1)          /* misc. indicators     */
    +If bitand(SMCAMISC,'80'x) <> '80'x then do   /* smf active ??        */
    +  Queue '  *** SMF recording not being used ***'
    +  Return
    +End
    +SMCAFRDS = C2d(Storage(D2x(SMCA + 244),4))   /* point to first RDS   */
    +SMCALRDS = C2d(Storage(D2x(SMCA + 248),4))   /* point to last RDS    */
    +SMCASMCX = C2d(Storage(D2x(SMCA + 376),4))   /* point to SMCX        */
    +SMCXLSBT = Storage(D2x(SMCASMCX + 88),1)     /* logstream bits       */
    +If Bitand(SMCXLSBT,'80'x) = '80'x then do    /* logstream recording? */
    +  If SMCAFRDS = SMCALRDS then do
    +    Queue '  ***       SMF LOGSTREAM recording is active       ***'
    +    Queue '  *** LOGSTREAM information not available via REXX  ***'
    +  Return
    +  End
    +  Else do
    +    Queue '  ***       SMF LOGSTREAM recording is active       ***'
    +    Queue '  *** LOGSTREAM information not available via REXX  ***'
    +    Queue '  ***     SMF data sets listed below not in use     ***'
    +  End
    +End /* If Bitand(SMCXLSBT,'80'x) */
    +If SMCAFRDS = SMCALRDS then do
    +  Queue '  ***    No SMF data sets available     ***'
    +  Return
    +End
    +Do until SMCAFRDS = SMCALRDS    /* end loop when next rds ptr = last */
    +  RDSNAME  =  Strip(Storage(D2x(SMCAFRDS + 16),44))  /* smf dsn      */
    +  RDSVOLID = Storage(D2x(SMCAFRDS + 60),6)           /* smf volser   */
    +  RDSCAPTY = C2d(Storage(D2x(SMCAFRDS + 76),4))      /* size in blks */
    +  RDSNXTBL = C2d(Storage(D2x(SMCAFRDS + 80),4))      /* next avl blk */
    +  /* RDSPCT  = (RDSNXTBL / RDSCAPTY) * 100 */ /* not how mvs does it */
    +  RDSPCT   = Trunc((RDSNXTBL / RDSCAPTY) * 100) /* same as mvs disp. */
    +  RDSFLG1  = Storage(D2x(SMCAFRDS + 12),1)     /* staus flags        */
    +  Select
    +    When Bitand(RDSFLG1,'10'x) = '10'x then RDSSTAT = 'FREE REQUIRED'
    +    When Bitand(RDSFLG1,'08'x) = '08'x then RDSSTAT = 'DUMP REQUIRED'
    +    When Bitand(RDSFLG1,'04'x) = '04'x then RDSSTAT = 'ALTERNATE'
    +    When Bitand(RDSFLG1,'02'x) = '02'x then RDSSTAT = 'CLOSE PENDING'
    +    When Bitand(RDSFLG1,'01'x) = '01'x then RDSSTAT = 'OPEN REQUIRED'
    +    When Bitand(RDSFLG1,'00'x) = '00'x then RDSSTAT = 'ACTIVE'
    +    Otherwise RDSSTAT = '??????'
    +  End  /* Select */
    +  If (RDSSTAT = 'ACTIVE' | RDSSTAT = 'DUMP REQUIRED') , /* display   */
    +    & RDSPCT = 0 then RDSPCT = 1    /* %full the same way mvs does   */
    +  SMCAFRDS = C2d(Storage(D2x(SMCAFRDS + 4),4)) /* point to next RDS  */
    +  If Length(RDSNAME) < 26 then do
    +    Queue ' ' Left(RDSNAME,25,' ') RDSVOLID  Right(RDSCAPTY,11,' ') ,
    +              ' 'Format(RDSPCT,5,0) ' ' RDSSTAT
    +  End
    +  Else do
    +    Queue ' ' RDSNAME
    +    Queue copies(' ',27) RDSVOLID  Right(RDSCAPTY,11,' ') ,
    +              ' 'Format(RDSPCT,5,0) ' ' RDSSTAT
    +  End
    +End
    +Return
    +
    +SUB:                 /* Subsystem information sub-routine            */
    +Arg SUBOPT
    +SSCVT    = C2d(Storage(D2x(JESCT+24),4))     /* point to SSCVT       */
    +SSCVT2   = SSCVT           /* save address for second loop           */
    +If SUBOPT <> 'FINDJES' then do
    +  Queue ' '
    +  Queue 'Subsystem Communications Vector Table:'
    +  Queue '  Name   Hex        SSCTADDR   SSCTSSVT' ,
    +        '  SSCTSUSE   SSCTSUS2   Status'
    +End /* if subopt */
    +Do until SSCVT = 0
    +  SSCTSNAM = Storage(D2x(SSCVT+8),4)         /* subsystem name       */
    +  SSCTSSVT = C2d(Storage(D2x(SSCVT+16),4))   /* subsys vect tbl ptr  */
    +  SSCTSUSE = C2d(Storage(D2x(SSCVT+20),4))   /* SSCTSUSE pointer     */
    +  SSCTSUS2 = C2d(Storage(D2x(SSCVT+28),4))   /* SSCTSUS2 pointer     */
    +  If SUBOPT = 'FINDJES' & SSCTSNAM = JESPJESN then do
    +     JESSSVT  = SSCTSSVT   /* save SSVTSSVT for "version" section    */
    +                           /* this points to JES3 Subsystem Vector   */
    +                           /* Table, mapped by IATYSVT               */
    +     JESSUSE  = SSCTSUSE   /* save SSCTSUSE for "version" section    */
    +                           /* this points to version for JES2        */
    +     JESSUS2  = SSCTSUS2   /* save SSCTSUS2 for "version" section    */
    +                           /* this points to $HCCT for JES2          */
    +     Leave  /* found JES info for version section, exit loop */
    +  End /* if subopt */
    +  SSCTSNAX = C2x(SSCTSNAM)    /* chg to EBCDIC for non-display chars */
    +  Call XLATE_NONDISP SSCTSNAM /* translate non display chars         */
    +  SSCTSNAM = RESULT           /* result from XLATE_NONDISP           */
    +  If SSCTSSVT = 0 then SSCT_STAT = 'Inactive'
    +    Else SSCT_STAT = 'Active'
    +  If SUBOPT <> 'FINDJES' then do
    +    Queue ' ' SSCTSNAM ' ' SSCTSNAX  ,
    +          ' ' Right(D2x(SSCVT),8,0)    ' ' Right(D2x(SSCTSSVT),8,0) ,
    +          ' ' Right(D2x(SSCTSUSE),8,0) ' ' Right(D2x(SSCTSUS2),8,0) ,
    +          ' ' SSCT_STAT ' '
    +  End /* if SUBOPT */
    + /*SSCTSSID = C2d(Storage(D2x(SSCVT+13),1)) */ /* subsys identifier  */
    + /*If bitand(SSCTSSID,'02'x) = '02'x then JESPJESN = 'JES2' */
    + /*If bitand(SSCTSSID,'03'x) = '03'x then JESPJESN = 'JES3'*/
    +  SSCVT    = C2d(Storage(D2x(SSCVT+4),4))    /* next sscvt or zero   */
    +End /* do until sscvt = 0 */
    +If SUBOPT <> 'FINDJES' then do
    +  Queue ' '
    +  Queue 'Supported Subsystem Function Codes:'
    +  Do until SSCVT2 = 0 /* 2nd loop for function codes                 */
    +    SSCTSNAM = Storage(D2x(SSCVT2+8),4)        /* subsystem name     */
    +    SSCTSSVT = C2d(Storage(D2x(SSCVT2+16),4)) /* subsys vect tbl ptr */
    +    SSCTSNAX = C2x(SSCTSNAM)  /* chg to EBCDIC for non-display chars */
    +    Call XLATE_NONDISP SSCTSNAM /* translate non display chars       */
    +    SSCTSNAM = RESULT           /* result from XLATE_NONDISP         */
    +    Queue ' ' SSCTSNAM '(X''' || SSCTSNAX || ''')'
    +    If SSCTSSVT <> 0 then do
    +      SSVTFCOD = SSCTSSVT + 4                  /* pt to funct. matrix*/
    +      SSFUNCTB = Storage(D2X(SSVTFCOD),255)    /* function matrix    */
    +      TOTFUNC = 0       /* counter for total functions per subsystem */
    +      Drop FUNC.        /* init stem to null for saved functions     */
    +      Do SUPFUNC = 1 TO 255
    +        If Substr(SSFUNCTB,SUPFUNC,1) <> '00'x then do /* supported? */
    +          TOTFUNC = TOTFUNC + 1 /* tot functions for this subsystem  */
    +          FUNC.TOTFUNC = SUPFUNC  /* save function in stem           */
    +        End
    +      End /* do supfunc */
    +      /***************************************************************/
    +      /* The following code is used to list the supported function   */
    +      /* codes by ranges. For example: 1-10,13,18-30,35,70,143-145   */
    +      /***************************************************************/
    +      If TOTFUNC >= 1 then do   /* begin loop to list function codes */
    +        ALLCODES = ''                   /* init var to nulls         */
    +        NEWRANGE = 'YES'                /* init newrange flag to YES */
    +        FIRSTRNG = 'YES'                /* init firstrng flag to YES */
    +        Do FCODES = 1 to TOTFUNC        /* loop though codes         */
    +          JUNK = TOTFUNC + 1            /* prevent NOVALUE cond.     */
    +          FUNC.JUNK = ''                /*  in func.chknext at end   */
    +          CHKNEXT = FCODES + 1          /* stem var to chk next code */
    +          If FUNC.FCODES + 1 = FUNC.CHKNEXT then do  /* next matches */
    +            If NEWRANGE = 'YES' & FIRSTRNG = 'YES' then do /* first  */
    +              ALLCODES =  ALLCODES || FUNC.FCODES || '-'   /* in new */
    +              NEWRANGE = 'NO'                    /* range - seperate */
    +              FIRSTRNG = 'NO'                    /* with a dash      */
    +              Iterate                            /* get next code    */
    +            End /* if newrange = 'yes' & firstrng = 'yes'            */
    +            If NEWRANGE = 'YES' & FIRSTRNG = 'NO' then do /* next    */
    +              ALLCODES =  ALLCODES || FUNC.FCODES  /* matches, but   */
    +              NEWRANGE = 'NO'   /* is not the first, don't add dash  */
    +              Iterate                            /* get next code    */
    +            End /* if newrange = 'yes' & firstrng = 'no'             */
    +            Else iterate  /* same range + not first - get next code  */
    +          End /* func.fcodes + 1 */
    +          If FCODES = TOTFUNC then , /* next doesn't match and this  */
    +            ALLCODES =  ALLCODES || FUNC.FCODES  /* is the last code */
    +          Else do /* next code doesn't match - seperate with comma   */
    +            ALLCODES =  ALLCODES || FUNC.FCODES || ','
    +            NEWRANGE = 'YES'         /* re-init newrange flag to YES */
    +            FIRSTRNG = 'YES'         /* re-init firstrng flag to YES */
    +          End
    +        End /* do fcodes = 1 to totfunc */
    +        /*************************************************************/
    +        /* The code below splits up the ranges to multiple lines if  */
    +        /* they won't all fit on a single line due to IPLINFO lrecl. */
    +        /*************************************************************/
    +        FUN_MAXL = 68      /* max length b4 need to split out codes  */
    +        If Length(ALLCODES) <= FUN_MAXL then ,  /* fits on one line  */
    +          Queue '    Codes:' ALLCODES
    +        Else do                            /* need to split up       */
    +          FUNSPLT = Pos(',',ALLCODES,FUN_MAXL-6)   /* split at comma */
    +          ALLCODES_1 = Substr(ALLCODES,1,FUNSPLT)  /* 1st part       */
    +          ALLCODES_2 = Strip(Substr(ALLCODES,FUNSPLT+1,FUN_MAXL))
    +          Queue '    Codes:' ALLCODES_1
    +          Queue '          ' ALLCODES_2
    +        End /* else do */
    +      End /* if totfunc >= 1 */
    +    End
    +    Else queue '    *Inactive*'
    +    SSCVT2   = C2d(Storage(D2x(SSCVT2+4),4))   /* next sscvt or zero */
    +  End /* do until sscvt2 = 0 */
    +End /* if subopt <> 'findjes' */
    +Return
    +
    +ASID:                /* ASVT Usage sub-routine                       */
    +Queue ' '
    +CVTASVT  = C2d(Storage(D2x(CVT+556),4))     /* point to ASVT         */
    +ASVTMAXU = C2d(Storage(D2x(CVTASVT+516),4)) /* max number of entries */
    +ASVTMAXI = C2d(Storage(D2x(CVTASVT+500),4)) /* MAXUSERS from ASVT    */
    +ASVTAAVT = C2d(Storage(D2x(CVTASVT+480),4)) /* free slots in ASVT    */
    +ASVTSTRT = C2d(Storage(D2x(CVTASVT+492),4)) /* RSVTSTRT from ASVT    */
    +ASVTAST  = C2d(Storage(D2x(CVTASVT+484),4)) /* free START/SASI       */
    +ASVTNONR = C2d(Storage(D2x(CVTASVT+496),4)) /* RSVNONR  from ASVT    */
    +ASVTANR  = C2d(Storage(D2x(CVTASVT+488),4)) /* free non-reusable     */
    +Queue 'ASID Usage Summary from the ASVT:'
    +Queue '  Maximum number of ASIDs:' Right(ASVTMAXU,5,' ')
    +Queue '                          '
    +Queue '    MAXUSER from IEASYSxx:' Right(ASVTMAXI,5,' ')
    +Queue '             In use ASIDs:' Right(ASVTMAXI-ASVTAAVT,5,' ')
    +Queue '          Available ASIDs:' Right(ASVTAAVT,5,' ')
    +Queue '                          '
    +Queue '    RSVSTRT from IEASYSxx:' Right(ASVTSTRT,5,' ')
    +Queue '           RSVSTRT in use:' Right(ASVTSTRT-ASVTAST,5,' ')
    +Queue '        RSVSTRT available:' Right(ASVTAST,5,' ')
    +Queue '                          '
    +Queue '    RSVNONR from IEASYSxx:' Right(ASVTNONR,5,' ')
    +Queue '           RSVNONR in use:' Right(ASVTNONR-ASVTANR,5,' ')
    +Queue '        RSVNONR available:' Right(ASVTANR,5,' ')
    +Return
    +
    +LPA:                 /* LPA List sub-routine                         */
    +CVTSMEXT = C2d(Storage(D2x(CVT + 1196),4))   /* point to stg map ext.*/
    +CVTEPLPS = C2d(Storage(D2x(CVTSMEXT+56),4))  /* start vaddr of ELPA  */
    +NUMLPA   = C2d(Storage(D2x(CVTEPLPS+4),4))   /* # LPA libs in table  */
    +LPAOFF   = 8                                 /* first ent in LPA tbl */
    +Queue '     '
    +Queue 'LPA Library List  ('NUMLPA' libraries):'
    +Queue '  POSITION    DSNAME'
    +Do I = 1 to NUMLPA
    +  LEN   = C2d(Storage(D2x(CVTEPLPS+LPAOFF),1)) /* length of entry    */
    +  LPDSN = Storage(D2x(CVTEPLPS+LPAOFF+1),LEN)  /* DSN of LPA library */
    +  LPAOFF = LPAOFF + 44 + 1                     /* next entry in table*/
    +  LPAPOS = Right(I,3)                        /* position in LPA list */
    +  RELLPPOS = Right('(+'I-1')',6)        /* relative position in list */
    +  Queue LPAPOS  RELLPPOS '  ' LPDSN
    +End
    +Return
    +
    +LNKLST:              /* LNKLST sub-routine                           */
    +If Bitand(CVTOSLV1,'01'x) <> '01'x then do    /* below OS/390 R2     */
    +  CVTLLTA  = C2d(Storage(D2x(CVT + 1244),4))  /* point to lnklst tbl */
    +  NUMLNK   = C2d(Storage(D2x(CVTLLTA+4),4))   /* # LNK libs in table */
    +  LLTAPFTB = CVTLLTA + 8 + (NUMLNK*45)        /* start of LLTAPFTB   */
    +  LNKOFF   = 8                                /*first ent in LBK tbl */
    +  LKAPFOFF = 0                                /*first ent in LLTAPFTB*/
    +  Queue '     '
    +  Queue 'LNKLST Library List  ('NUMLNK' Libraries):'
    +  Queue '  POSITION    APF    DSNAME'
    +  Do I = 1 to NUMLNK
    +    LEN = C2d(Storage(D2x(CVTLLTA+LNKOFF),1))     /* length of entry */
    +    LKDSN = Storage(D2x(CVTLLTA+LNKOFF+1),LEN)    /* DSN of LNK lib  */
    +    CHKAPF = Storage(D2x(LLTAPFTB+LKAPFOFF),1)    /* APF flag        */
    +    If  bitand(CHKAPF,'80'x) = '80'x then LKAPF = 'Y'  /* flag on    */
    +      else LKAPF = ' '                            /* APF flag off    */
    +    LNKOFF = LNKOFF + 44 + 1                      /*next entry in tbl*/
    +    LKAPFOFF = LKAPFOFF + 1               /* next entry in LLTAPFTB  */
    +    LNKPOS = Right(I,3)                           /*position in list */
    +    RELLKPOS = Right('(+'I-1')',6)      /* relative position in list */
    +    Queue LNKPOS  RELLKPOS '   ' LKAPF '   ' LKDSN
    +  End
    +End
    +Else do  /* OS/390 1.2 and above - PROGxx capable LNKLST             */
    +  ASCB     = C2d(Storage(224,4))               /* point to ASCB      */
    +  ASSB     = C2d(Storage(D2x(ASCB+336),4))     /* point to ASSB      */
    +  DLCB     = C2d(Storage(D2x(ASSB+236),4))     /* point to CSVDLCB   */
    +  DLCBFLGS = Storage(d2x(DLCB + 32),1)         /* DLCB flag bits     */
    +  SETNAME  = Storage(D2x(DLCB + 36),16)        /* LNKLST set name    */
    +  SETNAME  = Strip(SETNAME,'T')                /* del trailing blanks*/
    +  CVTLLTA  = C2d(Storage(D2x(DLCB + 16),4))    /* point to lnklst tbl*/
    +  LLTX     = C2d(Storage(D2x(DLCB + 20),4))    /* point to LLTX      */
    +  NUMLNK   = C2d(Storage(D2x(CVTLLTA+4),4))    /* # LNK libs in table*/
    +  LLTAPFTB = CVTLLTA + 8 + (NUMLNK*45)         /* start of LLTAPFTB  */
    +  LNKOFF   = 8                                 /*first ent in LLT tbl*/
    +  VOLOFF   = 8                                 /*first ent in LLTX   */
    +  LKAPFOFF = 0                                /*first ent in LLTAPFTB*/
    +  If Bitand(DLCBFLGS,'10'x) = '10'x then ,     /* bit for LNKAUTH    */
    +       LAUTH = 'LNKLST'                        /* LNKAUTH=LNKLST     */
    +  Else LAUTH = 'APFTAB'                        /* LNKAUTH=APFTAB     */
    +  Queue '     '
    +  Queue 'LNKLST Library List - Set:' SETNAME ,
    +        ' LNKAUTH='LAUTH '('NUMLNK' Libraries):'
    +  If LAUTH = 'LNKLST' then ,
    +    Queue '     (All LNKLST data sets marked APF=Y due to' ,
    +          'LNKAUTH=LNKLST)'
    +  Queue '  POSITION    APF   VOLUME    DSNAME'
    +  Do I = 1 to NUMLNK
    +    LEN = C2d(Storage(D2x(CVTLLTA+LNKOFF),1))     /* length of entry */
    +    LKDSN = Storage(D2x(CVTLLTA+LNKOFF+1),LEN)    /* DSN of LNK lib  */
    +    LNKVOL = Storage(D2x(LLTX+VOLOFF),6)          /* VOL of LNK lib  */
    +    CHKAPF = Storage(D2x(LLTAPFTB+LKAPFOFF),1)    /* APF flag        */
    +    If  bitand(CHKAPF,'80'x) = '80'x then LKAPF = 'Y'    /* flag on  */
    +      else LKAPF = ' '                            /* APF flag off    */
    +    LNKOFF   = LNKOFF + 44 + 1                    /*next entry in LLT*/
    +    VOLOFF   = VOLOFF + 8                         /*next vol in LLTX */
    +    LKAPFOFF = LKAPFOFF + 1               /* next entry in LLTAPFTB  */
    +    LNKPOS   = Right(I,3)                         /*position in list */
    +    RELLKPOS = Right('(+'I-1')',6)      /* relative position in list */
    +    Queue LNKPOS  RELLKPOS '   ' LKAPF '  ' LNKVOL '  ' LKDSN
    +  End
    +End
    +Return
    +
    +APF:                 /* APF List sub-routine                         */
    +CVTAUTHL = C2d(Storage(D2x(CVT + 484),4))    /* point to auth lib tbl*/
    +If CVTAUTHL <> C2d('7FFFF001'x) then do      /* dynamic list ?       */
    +  NUMAPF   = C2d(Storage(D2x(CVTAUTHL),2))   /* # APF libs in table  */
    +  APFOFF   = 2                               /* first ent in APF tbl */
    +  Queue '     '
    +  Queue 'APF Library List  ('NUMAPF' libraries):'
    +  Queue '  ENTRY   VOLUME    DSNAME'
    +  Do I = 1 to NUMAPF
    +    LEN = C2d(Storage(D2x(CVTAUTHL+APFOFF),1)) /* length of entry    */
    +    VOL = Storage(D2x(CVTAUTHL+APFOFF+1),6)    /* VOLSER of APF LIB  */
    +    DSN = Storage(D2x(CVTAUTHL+APFOFF+1+6),LEN-6)  /* DSN of apflib  */
    +    APFOFF = APFOFF + LEN +1
    +    APFPOS   = Right(I,4)                      /*position in APF list*/
    +    Queue '  'APFPOS '  ' VOL '  ' DSN
    +  End
    +End
    +Else Do
    +  ECVT     = C2d(Storage(D2x(CVT + 140),4))    /* point to CVTECVT   */
    +  ECVTCSVT = C2d(Storage(D2x(ECVT + 228),4))   /* point to CSV table */
    +  APFA = C2d(Storage(D2x(ECVTCSVT + 12),4))    /* APFA               */
    +  AFIRST = C2d(Storage(D2x(APFA + 8),4))       /* First entry        */
    +  ALAST  = C2d(Storage(D2x(APFA + 12),4))      /* Last  entry        */
    +  LASTONE = 0   /* flag for end of list     */
    +  NUMAPF = 1    /* tot # of entries in list */
    +  Do forever
    +    DSN.NUMAPF = Storage(D2x(AFIRST+24),44)    /* DSN of APF library */
    +    DSN.NUMAPF = Strip(DSN.NUMAPF,'T')         /* remove blanks      */
    +    CKSMS = Storage(D2x(AFIRST+4),1)           /* DSN of APF library */
    +    if  bitand(CKSMS,'80'x)  = '80'x           /*  SMS data set?     */
    +      then VOL.NUMAPF = '*SMS* '               /* SMS control dsn    */
    +    else VOL.NUMAPF = Storage(D2x(AFIRST+68),6)    /* VOL of APF lib */
    +    If Substr(DSN.NUMAPF,1,1) <> X2c('00')     /* check for deleted  */
    +      then NUMAPF = NUMAPF + 1                 /*   APF entry        */
    +    AFIRST = C2d(Storage(D2x(AFIRST + 8),4))   /* next  entry        */
    +    if LASTONE = 1 then leave
    +    If  AFIRST = ALAST then LASTONE = 1
    +  End
    +  Queue '     '
    +  Queue 'APF Library List  - Dynamic ('NUMAPF - 1' libraries):'
    +  Queue '  ENTRY   VOLUME    DSNAME'
    +  Do I = 1 to NUMAPF-1
    +    APFPOS   = Right(I,4)                      /*position in APF list*/
    +    Queue '  'APFPOS '  ' VOL.I '  ' DSN.I
    +  End
    +End
    +Return
    +
    +SVC:                 /* SVC information sub-routine                  */
    +/*********************************************************************/
    +/* See SYS1.MODGEN(IHASVC) for descriptions of SVC attributes        */
    +/*********************************************************************/
    +CVTABEND  = C2d(Storage(D2x(CVT+200),4))     /* point to CVTABEND    */
    +SCVT      = CVTABEND        /* this is the SCVT -  mapped by IHASCVT */
    +SCVTSVCT  = C2d(Storage(D2x(SCVT+132),4))    /* point to SVCTABLE    */
    +SCVTSVCR  = C2d(Storage(D2x(SCVT+136),4))    /* point to SVC UPD TBL */
    +Call FIND_NUC 'IGCERROR'     /* Find addr of IGCERROR in NUC MAP     */
    +IGCERROR_ADDR = RESULT       /* Save address of IGCERROR             */
    +Call FIND_NUC 'IGCRETRN'     /* Find addr of IGCRETRN in NUC MAP     */
    +IGCRETRN_ADDR = RESULT       /* Save address of IGCRETRN             */
    +Call FIND_NUC 'IGXERROR'     /* Find addr of IGXERROR in NUC MAP     */
    +IGXERROR_ADDR = RESULT       /* Save address of IGXERROR             */
    +Call VMAP 'NODISP'      /* call virt. stor map routine, "no display" */
    +/*********************************************************************/
    +/* The following code is needed to prevent errors in FIND_SVC_LOC    */
    +/* routine "Select" because the VMAP sub-routine sets the address    */
    +/* variables to "N/A" when MLPA/E-MLPA/FLPA/E-FLPA do not exist.     */
    +/*********************************************************************/
    +If CVTMLPAS = 'N/A' then CVTMLPAS = 0  /* MLPA   strt does not exist */
    +If CVTMLPAE = 'N/A' then CVTMLPAE = 0  /* MLPA   end  does not exist */
    +If CVTFLPAS = 'N/A' then CVTFLPAS = 0  /* FLPA   strt does not exist */
    +If CVTFLPAE = 'N/A' then CVTFLPAE = 0  /* FLPA   end  does not exist */
    +If CVTEFLPS = 'N/A' then CVTEFLPS = 0  /* E-FLPA strt does not exist */
    +If CVTEFLPE = 'N/A' then CVTEFLPE = 0  /* E-FLPA end  does not exist */
    +If CVTEMLPS = 'N/A' then CVTEMLPS = 0  /* E-MLPA strt does not exist */
    +If CVTEMLPE = 'N/A' then CVTEMLPE = 0  /* E-MLPA end  does not exist */
    +/*********************************************************************/
    +/* A little house keeping                                            */
    +/*********************************************************************/
    +SVCACT_TOT    = 0   /* total number of active std SVCs               */
    +SVCUNUSED_TOT = 0   /* total number of unused std SVCs               */
    +SVCAPF_TOT    = 0   /* total number of std SVCs requiring APF        */
    +SVCESR_T1_TOT = 0   /* total number of active Type 1 ESR SVCs        */
    +SVCESR_T2_TOT = 0   /* total number of active Type 2 ESR SVCs        */
    +SVCESR_T3_TOT = 0   /* total number of active Type 3/4 ESR SVCs      */
    +SVCESR_T6_TOT = 0   /* total number of active Type 6 ESR SVCs        */
    +/*********************************************************************/
    +/* Standard SVC table display loop                                   */
    +/*********************************************************************/
    +Queue '     '
    +Queue 'SVC Table:'
    +Queue '  Num Hex  EP-Addr  Location  AM TYP APF ESR ASF AR NP UP' ,
    +      'CNT Old-EPA  LOCKS'
    +Do SVCLST = 0 to 255
    +  SVCTENT  = Storage(D2x(SCVTSVCT+(SVCLST*8)),8)  /* SVC Table Entry */
    +  SVCTENTU = Storage(D2x(SCVTSVCR+(SVCLST*24)),24) /* SVC UP TBL ENT */
    +  SVCOLDA  = Substr(SVCTENTU,1,4)            /* OLD EP Address       */
    +  SVCOLDAR = C2x(SVCOLDA)                    /* OLD addr readable    */
    +  SVCOLDAR = Right(SVCOLDAR,8,'0')           /* ensure leading zeros */
    +  SVCURCNT = C2d(Substr(SVCTENTU,21,2))      /* SVC update count     */
    +  SVCAMODE = Substr(SVCTENT,1,1)             /* AMODE indicator      */
    +  SVCEPA   = Substr(SVCTENT,1,4)             /* Entry point addr     */
    +  SVCEPAR  = C2x(SVCEPA)                     /* EPA - readable       */
    +  SVCEPAR  = Right(SVCEPAR,8,'0')            /* ensure leading zeros */
    +  SVCATTR1 = Substr(SVCTENT,5,1)             /* SVC attributes       */
    +  SVCATTR3 = Substr(SVCTENT,6,1)             /* SVC attributes       */
    +  SVCLOCKS = Substr(SVCTENT,7,1)             /* Lock attributes      */
    +  /**************************/
    +  /* Save EPAs of ESR SVCs  */
    +  /**************************/
    +  If SVCLST = 109 then SVC109AD = SVCEPA
    +  If SVCLST = 116 then SVC116AD = SVCEPA
    +  If SVCLST = 122 then SVC122AD = SVCEPA
    +  If SVCLST = 137 then SVC137AD = SVCEPA
    +  /**************************/
    +  /*  Check amode           */
    +  /**************************/
    +  If Bitand(SVCAMODE,'80'x) = '80'x then SVC_AMODE = '31'
    +    Else SVC_AMODE = '24'
    +  /**************************/
    +  /*  Check SVC type flag   */
    +  /**************************/
    +  Select                                     /* determine SVC type   */
    +    When Bitand(SVCATTR1,'C0'x) = 'C0'x then SVCTYPE = '3/4'
    +    When Bitand(SVCATTR1,'80'x) = '80'x then SVCTYPE = ' 2 '
    +    When Bitand(SVCATTR1,'20'x) = '20'x then SVCTYPE = ' 6 '
    +    When Bitand(SVCATTR1,'00'x) = '00'x then SVCTYPE = ' 1 '
    +    Otherwise SVCTYPE = '???'
    +  End /* select */
    +  If SVCLST = 109 then SVCTYPE = ' 3 '  /* 109 is type 3 ESR, not 2  */
    +  /**************************/
    +  /*  Check other SVC flags */
    +  /**************************/
    +  SVCAPF = '   ' ; SVCESR = '   ' ; SVCNP = '  '  /* init as blanks  */
    +  SVCASF = '   ' ; SVCAR  = '  '  ; SVCUP = '  '  /* init as blanks  */
    +  If Bitand(SVCATTR1,'08'x) = '08'x then SVCAPF  = 'APF'
    +  If Bitand(SVCATTR1,'04'x) = '04'x then SVCESR  = 'ESR'
    +  If Bitand(SVCATTR1,'02'x) = '02'x then SVCNP   = 'NP'
    +  If Bitand(SVCATTR1,'01'x) = '01'x then SVCASF  = 'ASF'
    +  If Bitand(SVCATTR3,'80'x) = '80'x then SVCAR   = 'AR'
    +  If SVCURCNT <> 0 then SVCUP = 'UP'   /* this SVC has been updated  */
    +  If SVCURCNT = 0 then do              /* svc never updated          */
    +    SVCURCNT = '   '
    +    SVCOLDAR = '        '
    +  End
    +  Else do /* most, if not all UP nums are sngl digit- center display */
    +   If SVCURCNT < 10 then SVCURCNT = Right(SVCURCNT,2,' ') || ' '
    +     Else SVCURCNT = Right(SVCURCNT,3,' ')
    +  End /* else do */
    +  /**************************/
    +  /*  Check lock flags      */
    +  /**************************/
    +  SVCLL    = ' '  ; SVCCMS  = ' ' ; SVCOPT = ' '  /* init as blanks  */
    +  SVCALLOC = ' '  ; SVCDISP = ' '                 /* init as blanks  */
    +  If Bitand(SVCLOCKS,'80'x) = '80'x then SVCLL    = 'L'  /* LOCAL    */
    +  If Bitand(SVCLOCKS,'40'x) = '40'x then SVCCMS   = 'C'  /* CMS      */
    +  If Bitand(SVCLOCKS,'20'x) = '20'x then SVCOPT   = 'O'  /* OPT      */
    +  If Bitand(SVCLOCKS,'10'x) = '10'x then SVCALLOC = 'S'  /* SALLOC   */
    +  If Bitand(SVCLOCKS,'08'x) = '08'x then SVCDISP  = 'D'  /* DISP     */
    +  /*********************************/
    +  /*  location, location, location */
    +  /*********************************/
    +  SVCLOCA = Bitand(SVCEPA,'7FFFFFFF'x)       /* zero high order bit  */
    +  SVCLOCA = C2d(SVCLOCA)                     /* need dec. for compare*/
    +  Call FIND_SVC_LOC SVCLOCA                  /* determine SVC loc    */
    +  SVCLOC = RESULT                            /* Save Result          */
    +
    +  If SVCLOCA = IGCERROR_ADDR | ,             /* this SVC             */
    +     SVCLOCA = IGCRETRN_ADDR then do         /*          is not used */
    +    SVC_AMODE = '  '                         /* blank out amode      */
    +    SVCAPF = '*** Not Used ***'              /* replace other        */
    +    SVCESR = ''                              /*   fields to line     */
    +    SVCASF = ''                              /*     up "locks" due   */
    +    SVCAR  = ''                              /*       to "not used"  */
    +    SVCNP  = ''                              /*         display      */
    +    SVCUP  = ''                              /*                      */
    +    SVCURCNT = ''                            /*                      */
    +    SVCOLDAR = '          '                  /*                      */
    +    SVCUNUSED_TOT = SVCUNUSED_TOT + 1        /* add 1 to unused tot  */
    +  End /* If SVCLOCA = IGCERROR_ADDR */
    +  Else do /* used SVC */
    +    SVCACT_TOT = SVCACT_TOT + 1              /* add 1 to tot active  */
    +    If SVCAPF  = 'APF' then ,
    +       SVCAPF_TOT = SVCAPF_TOT + 1           /* add 1 to APF total   */
    +  End /* Else do */
    +
    +  Queue ' '  Right(SVCLST,3,' ') '('Right(D2x(SVCLST),2,0)')' ,
    +    SVCEPAR SVCLOC SVC_AMODE SVCTYPE SVCAPF SVCESR SVCASF ,
    +    SVCAR SVCNP SVCUP SVCURCNT SVCOLDAR ,
    +    SVCLL || SVCCMS || SVCOPT || SVCALLOC || SVCDISP
    +End /* Do SVCLST = 0 to 255 */
    +/*********************************************************************/
    +/* ESR SVC tables display loop                                       */
    +/*********************************************************************/
    +Do SVCESRL = 1 to 4  /* ESR display loop  */
    +  If SVCESRL = 1 then do
    +    SVCEAD = C2d(SVC116AD)                   /* Type 1 ESR tbl       */
    +    SVCEHD = 'Type 1 (SVC 116'              /* Type/SVC for heading */
    +  End
    +  If SVCESRL = 2 then do
    +    SVCEAD = C2d(SVC122AD)                   /* Type 2 ESR tbl       */
    +    SVCEHD = 'Type 2 (SVC 122'              /* Type/SVC for heading */
    +  End
    +  If SVCESRL = 3 then do
    +    SVCEAD = C2d(SVC109AD)                   /* Type 3 ESR tbl       */
    +    SVCEHD = 'Type 3 (SVC 109'              /* Type/SVC for heading */
    +  End
    +  If SVCESRL = 4 then do
    +    SVCEAD = C2d(SVC137AD)                   /* Type 6 ESR tbl       */
    +    SVCEHD = 'Type 6 (SVC 137'              /* Type/SVC for heading */
    +  End
    +  SVCESRMX = C2d(Storage(D2x(SVCEAD+4),4))   /* Max # ESR entries    */
    +  Queue '     '
    +  Queue 'SVC Table for ESR' SVCEHD '- Maximum ESR Number Supported' ,
    +        'is' SVCESRMX'):'
    +  Queue '  Num Hex  EP-Addr  Location  AM TYP APF ASF AR NP' ,
    +        'LOCKS'
    +  SVCEAD = SVCEAD + 8                        /* bump past ESR hdr    */
    +  Do SVCELST = 0 to SVCESRMX
    +    SVCETENT  = Storage(D2x(SVCEAD+(SVCELST*8)),8) /* SVC Tbl Entry  */
    +    SVCEAMODE = Substr(SVCETENT,1,1)         /* AMODE indicator      */
    +    SVCEEPA   = Substr(SVCETENT,1,4)         /* Entry point addr     */
    +    SVCEEPAR  = C2x(SVCEEPA)                 /* EPA - readable       */
    +    SVCEEPAR  = Right(SVCEEPAR,8,'0')        /* ensure leading zeros */
    +    SVCEATTR1 = Substr(SVCETENT,5,1)         /* SVC attributes       */
    +    SVCEATTR3 = Substr(SVCETENT,6,1)         /* SVC attributes       */
    +    SVCELOCKS = Substr(SVCETENT,7,1)         /* Lock attributes      */
    +  /**************************/
    +  /*  Check amode           */
    +  /**************************/
    +  If Bitand(SVCEAMODE,'80'x) = '80'x then SVCE_AMODE = '31'
    +    Else SVCE_AMODE = '24'
    +  /**************************/
    +  /*  Check SVC type flag   */
    +  /**************************/
    +  Select                                     /* determine SVC type   */
    +    When Bitand(SVCEATTR1,'C0'x) = 'C0'x then SVCETYPE = '3/4'
    +    When Bitand(SVCEATTR1,'80'x) = '80'x then SVCETYPE = ' 2 '
    +    When Bitand(SVCEATTR1,'20'x) = '20'x then SVCETYPE = ' 6 '
    +    When Bitand(SVCEATTR1,'00'x) = '00'x then SVCETYPE = ' 1 '
    +    Otherwise SVCETYPE = '???'
    +  End /* select */
    +  /**************************/
    +  /*  Check other SVC flags */
    +  /**************************/
    +  SVCEAPF = '   ' ; SVCENP = '  '  /* init as blanks  */
    +  SVCEASF = '   ' ; SVCEAR = '  '  /* init as blanks  */
    +  SVCEESR = '   '
    +  If Bitand(SVCEATTR1,'08'x) = '08'x then SVCEAPF  = 'APF'
    +  If Bitand(SVCEATTR1,'04'x) = '04'x then SVCEESR  = 'ESR'
    +  If Bitand(SVCEATTR1,'02'x) = '02'x then SVCENP   = 'NP'
    +  If Bitand(SVCEATTR1,'01'x) = '01'x then SVCEASF  = 'ASF'
    +  If Bitand(SVCEATTR3,'80'x) = '80'x then SVCEAR   = 'AR'
    +  /**************************/
    +  /*  Check lock flags      */
    +  /**************************/
    +  SVCELL    = ' '  ; SVCECMS  = ' ' ; SVCEOPT = ' ' /* init as blanks*/
    +  SVCEALLOC = ' '  ; SVCEDISP = ' '                 /* init as blanks*/
    +  If Bitand(SVCELOCKS,'80'x) = '80'x then SVCELL    = 'L' /* LOCAL   */
    +  If Bitand(SVCELOCKS,'40'x) = '40'x then SVCECMS   = 'C' /* CMS     */
    +  If Bitand(SVCELOCKS,'20'x) = '20'x then SVCEOPT   = 'O' /* OPT     */
    +  If Bitand(SVCELOCKS,'10'x) = '10'x then SVCEALLOC = 'S' /* SALLOC  */
    +  If Bitand(SVCELOCKS,'08'x) = '08'x then SVCEDISP  = 'D' /* DISP    */
    +  /*********************************/
    +  /*  location, location, location */
    +  /*********************************/
    +  SVCELOCA = Bitand(SVCEEPA,'7FFFFFFF'x)     /* zero high order bit  */
    +  SVCELOCA = C2d(SVCELOCA)                   /* need dec. for compare*/
    +  Call FIND_SVC_LOC SVCELOCA                 /* determine SVC loc    */
    +  SVCELOC = RESULT                           /* Save Result          */
    +
    +  If SVCELOCA = IGXERROR_ADDR then do        /* this SVC is not used */
    +    SVCE_AMODE = '  '                        /* blank out amode      */
    +    SVCEAPF = '* Unused *'                   /* replace other fields */
    +    SVCEASF = ''                             /*  to line up "locks"  */
    +    SVCEAR  = ''                             /*   due to "unused"    */
    +    SVCENP  = ''                             /*    display           */
    +  End /* If SVCELOCA = IGXERROR_ADDR */
    +  Else do /* used SVC */
    +    If SVCESRL = 1 then ,
    +       SVCESR_T1_TOT = SVCESR_T1_TOT + 1     /* add 1 to TYPE 1 tot  */
    +    If SVCESRL = 2 then ,
    +       SVCESR_T2_TOT = SVCESR_T2_TOT + 1     /* add 1 to TYPE 2 tot  */
    +    If SVCESRL = 3 then ,
    +       SVCESR_T3_TOT = SVCESR_T3_TOT + 1     /* add 1 to TYPE 3/4 tot*/
    +    If SVCESRL = 4 then ,
    +       SVCESR_T6_TOT = SVCESR_T6_TOT + 1     /* add 1 to TYPE 6 tot  */
    +  End /* Else do */
    +
    +  Queue ' '  Right(SVCELST,3,' ') '('Right(D2x(SVCELST),2,0)')' ,
    +    SVCEEPAR SVCELOC SVCE_AMODE SVCETYPE SVCEAPF SVCEASF ,
    +    SVCEAR SVCENP ,
    +    SVCELL || SVCECMS || SVCEOPT || SVCEALLOC || SVCEDISP
    +  End
    +
    +End /* Do SVCESRL = 1 to 4 */
    +Queue '    '
    +Queue '  SVC Usage Summary:'
    +Queue '    Total number of active standard SVCs (including ESR' ,
    +      'slots) =' SVCACT_TOT
    +Queue '    Total number of unused standard SVCs =' SVCUNUSED_TOT
    +Queue '    Total number of active standard SVCs' ,
    +      'requiring APF auth =' SVCAPF_TOT
    +Queue '    Total number of active Type 1   ESR SVCs =' SVCESR_T1_TOT
    +Queue '    Total number of active Type 2   ESR SVCs =' SVCESR_T2_TOT
    +Queue '    Total number of active Type 3/4 ESR SVCs =' SVCESR_T3_TOT
    +Queue '    Total number of active Type 6   ESR SVCs =' SVCESR_T6_TOT
    +Return
    +
    +FIND_SVC_LOC:  /* determine virtual storage location of SVC  */
    +Arg SVC_LOC
    +Select
    +  When SVC_LOC >= X2d(VVSTRT)    & SVC_LOC <= X2d(VVEND)     ,
    +       then SVCLOC = 'PRIVATE  ' /* never, but coded anyway */
    +  When SVC_LOC >= X2d(GDACSAH)   & SVC_LOC <= X2d(CSAEND)    ,
    +       then SVCLOC = 'CSA      '
    +  When SVC_LOC >= X2d(CVTMLPAS)  & SVC_LOC <= X2d(CVTMLPAE)  ,
    +       then SVCLOC = 'MLPA     '
    +  When SVC_LOC >= X2d(CVTFLPAS)  & SVC_LOC <= X2d(CVTFLPAE)  ,
    +       then SVCLOC = 'FLPA     '
    +  When SVC_LOC >= X2d(CVTPLPAS)  & SVC_LOC <= X2d(CVTPLPAE)  ,
    +       then SVCLOC = 'PLPA     '
    +  When SVC_LOC >= X2d(GDASQAH)   & SVC_LOC <= X2d(SQAEND)    ,
    +       then SVCLOC = 'SQA      '
    +  When SVC_LOC >= X2d(CVTRWNS)   & SVC_LOC <= X2d(CVTRWNE)   ,
    +       then SVCLOC = 'R/W Nuc  '
    +  When SVC_LOC >= X2d(RONUCSZB)  & SVC_LOC <= X2d('FFFFFF')  ,
    +       then SVCLOC = 'R/O Nuc  '
    +  When SVC_LOC >= X2d('1000000') & SVC_LOC <= X2d(CVTRONE)   ,
    +       then SVCLOC = 'E-R/O Nuc'
    +  When SVC_LOC >= X2d(CVTERWNS)  & SVC_LOC <= X2d(CVTERWNE)  ,
    +       then SVCLOC = 'E-R/W Nuc'
    +  When SVC_LOC >= X2d(GDAESQAH)  & SVC_LOC <= X2d(ESQAEND)   ,
    +       then SVCLOC = 'E-SQA    '
    +  When SVC_LOC >= X2d(CVTEPLPS)  & SVC_LOC <= X2d(CVTEPLPE)  ,
    +       then SVCLOC = 'E-PLPA   '
    +  When SVC_LOC >= X2d(CVTEFLPS)  & SVC_LOC <= X2d(CVTEFLPE)  ,
    +       then SVCLOC = 'E-FLPA   '
    +  When SVC_LOC >= X2d(CVTEMLPS)  & SVC_LOC <= X2d(CVTEMLPE)  ,
    +       then SVCLOC = 'E-MLPA   '
    +  When SVC_LOC >= X2d(GDAECSAH)  & SVC_LOC <= X2d(ECSAEND)   ,
    +       then SVCLOC = 'E-CSA    '
    +  When SVC_LOC >= X2d(GDAEPVTH)  & SVC_LOC <= X2d(EPVTEND)   ,
    +       then SVCLOC = 'E-PRIVATE' /* never, but coded anyway */
    +  Otherwise SVCLOC = '????     '
    +End /* select */
    +Return SVCLOC
    +
    +FIND_NUC: /* Find EP address of "ARG" in NUC MAP  */
    +Arg NUC_NAME
    +CVTNUCMP  = C2d(Storage(D2x(CVT+1200),4))    /* NUC map address      */
    +NUCMAPEND = C2d(Storage(D2x(CVTNUCMP+8),4))  /* End of nucmap        */
    + /* NUCMAPLEN = C2d(Storage(D2x(CVTNUCMP+13),3)) */ /* tbl length    */
    +NUC_CURA  = CVTNUCMP+16                      /* Curent tbl entry     */
    +Do while  NUC_CURA <  NUCMAPEND              /* go though tbl        */
    +  NUC_EP    = Storage(D2x(NUC_CURA),8)       /* Nuc EP name          */
    +  If NUC_EP = NUC_NAME then do               /* NUC_NAME found?      */
    +    NUC_ADDR = C2d(Storage(D2x(NUC_CURA+8),4)) /* yes, save addr     */
    +    Leave                                    /* leave this loop      */
    +  End /* If NUC_EP = NUC_NAME */
    +  Else NUC_CURA = NUC_CURA + 16              /* bump to next entry   */
    +End /* do while */
    +Return NUC_ADDR
    +
    +XLATE_NONDISP:       /* translate non-display characters to a "."    */
    +Arg XLATEPRM
    +XLATELEN = Length(XLATEPRM) /* length of parm passed to routine      */
    +Do I = 1 to XLATELEN                      /* check each byte for     */
    +  If (Substr(XLATEPRM,I,1) >= '00'x & ,   /* non-display characters  */
    +    Substr(XLATEPRM,I,1) < '40'x ) | ,    /* and replace each        */
    +    Substr(XLATEPRM,I,1) = 'FF'x  then ,  /* character that          */
    +    XLATEPRM = OVERLAY('.',XLATEPRM,I)    /* is non-displayable      */
    +End                                       /* with a period (.)       */
    +Return XLATEPRM
    +
    +STORAGE_GDA_LDA:     /* GDA/LDA Storage values sub-routine           */
    +ASCB     = C2d(Storage(224,4))               /* point to cur ASCB    */
    +ASCBLDA  = C2d(Storage(D2x(ASCB + 48),4))    /* point to LDA         */
    +CVTGDA   = C2d(Storage(D2x(CVT + 560),4))    /* point to GDA         */
    +LDASTRTA = Storage(D2x(ASCBLDA + 60),4)      /* point to V=V start   */
    +LDASTRTA = C2x(LDASTRTA)                     /* display in hex       */
    +LDASIZEA = C2d(Storage(D2x(ASCBLDA + 64),4)) /* point to V=V size    */
    +LDASIZEA = LDASIZEA/1024                     /* convert to Kbytes    */
    +LDASTRTS = Storage(D2x(ASCBLDA + 92),4)      /* pt. to sysarea start */
    +LDASTRTS = C2x(LDASTRTS)                     /* display in hex       */
    +LDASIZS  = C2d(Storage(D2x(ASCBLDA + 96),4)) /* pt. to sysarea size  */
    +LDASIZS  = LDASIZS/1024                      /* convert to Kbytes    */
    +GDAPVTSZ = C2d(Storage(D2x(CVTGDA + 164),4)) /* point to MAX PVT<16M */
    +GDAPVTSZ = GDAPVTSZ/1024                     /* convert to Kbytes    */
    +GDAEPVTS = C2d(Storage(D2x(CVTGDA + 172),4)) /* point to MAX PVT>16M */
    +GDAEPVTS = GDAEPVTS/1024/1024                /* convert to Mbytes    */
    +GDACSASZ = C2d(Storage(D2x(CVTGDA + 112),4)) /* point to CSA<16M     */
    +GDACSASZ = GDACSASZ/1024                     /* convert to Kbytes    */
    +GDAECSAS = C2d(Storage(D2x(CVTGDA + 128),4)) /* point to CSA>16M     */
    +GDAECSAS = GDAECSAS/1024                     /* convert to Kbytes    */
    +GDASQASZ = C2d(Storage(D2x(CVTGDA + 148),4)) /* point to SQA<16M     */
    +GDASQASZ = GDASQASZ/1024                     /* convert to Kbytes    */
    +GDAESQAS = C2d(Storage(D2x(CVTGDA + 156),4)) /* point to SQA>16M     */
    +GDAESQAS = GDAESQAS/1024                     /* convert to Kbytes    */
    +GDAVRSZ  = C2d(Storage(D2x(CVTGDA + 196),4)) /* point to V=R global  */
    +GDAVRSZ  = GDAVRSZ/1024                      /* convert to Kbytes    */
    +GDAVREGS = C2d(Storage(D2x(CVTGDA + 200),4)) /* point to V=R default */
    +GDAVREGS = GDAVREGS/1024                     /* convert to Kbytes    */
    +GDA_CSA_ALLOC  = C2d(Storage(D2x(CVTGDA + 432),4)) /* CSA amt alloc  */
    +GDA_CSA_ALLOC  = Format(GDA_CSA_ALLOC/1024,,0)     /* conv to Kbytes */
    +GDA_ECSA_ALLOC = C2d(Storage(D2x(CVTGDA + 436),4)) /* ECSA amt alloc */
    +GDA_ECSA_ALLOC = Format(GDA_ECSA_ALLOC/1024,,0)    /* conv to Kbytes */
    +GDA_SQA_ALLOC  = C2d(Storage(D2x(CVTGDA + 440),4)) /* SQA amt alloc  */
    +GDA_SQA_ALLOC  = Format(GDA_SQA_ALLOC/1024,,0)     /* conv to Kbytes */
    +GDA_ESQA_ALLOC = C2d(Storage(D2x(CVTGDA + 444),4)) /* ESQA amt alloc */
    +GDA_ESQA_ALLOC = Format(GDA_ESQA_ALLOC/1024,,0)    /* conv to Kbytes */
    +GDA_CSA_CONV   = C2d(Storage(D2x(CVTGDA + 448),4)) /* CSA => SQA amt */
    +GDA_CSA_CONV   = Format(GDA_CSA_CONV/1024,,0)      /* conv to Kbytes */
    +GDA_ECSA_CONV  = C2d(Storage(D2x(CVTGDA + 452),4)) /* ECSA=>ESQA amt */
    +GDA_ECSA_CONV  = Format(GDA_ECSA_CONV/1024,,0)     /* conv to Kbytes */
    +/*********************************************************************/
    +/* High Water Marks for SQA/ESQA/CSA/ECSA added in OS/390 R10        */
    +/*********************************************************************/
    +If Bitand(CVTOSLV2,'01'x) = '01'x then do    /* OS/390 R10 and above */
    +  GDASQAHWM  = C2d(Storage(D2x(CVTGDA + 536),4))   /* SQA HWM        */
    +  GDASQAHWM  = Format(GDASQAHWM/1024,,0)           /* conv to Kbytes */
    +  GDAESQAHWM = C2d(Storage(D2x(CVTGDA + 540),4))   /* ESQA HWM       */
    +  GDAESQAHWM = Format(GDAESQAHWM/1024,,0)          /* conv to Kbytes */
    +  If Bitand(CVTOSLV5,'08'x) = '08'x then do  /* z/OS 1.10 and above  */
    +    GDATotalCSAHWM  = C2d(Storage(D2x(CVTGDA+552),4)) /* CSA HWM     */
    +    GDATotalCSAHWM  = Format(GDATotalCSAHWM/1024,,0)  /* conv to Kb  */
    +    GDATotalECSAHWM = C2d(Storage(D2x(CVTGDA+556),4)) /* ECSA HWM    */
    +    GDATotalECSAHWM = Format(GDATotalECSAHWM/1024,,0) /* conv to Kb  */
    +    GDACSAHWM       = GDATotalCSAHWM   /* set var used for VMAP disp */
    +    GDAECSAHWM      = GDATotalECSAHWM  /* set var used for VMAP disp */
    +  End
    +  Else do  /* use pre z/OS 1.10 values for CSA/ECSA HWM              */
    +    GDACSAHWM  = C2d(Storage(D2x(CVTGDA + 544),4)) /* CSA HWM        */
    +    GDACSAHWM  = Format(GDACSAHWM/1024,,0)         /* conv to Kbytes */
    +    GDAECSAHWM = C2d(Storage(D2x(CVTGDA + 548),4)) /* ECSA HWM       */
    +    GDAECSAHWM = Format(GDAECSAHWM/1024,,0)        /* conv to Kbytes */
    +  End
    +End
    +Return
    +
    +EXTRACT_SYSPARMS:    /* Extract IEASYSxx values from the IPA         */
    +Parse arg IEASPARM
    +IEASPARM = Strip(IEASPARM,'T')               /* remove trailing blnks*/
    +If IEASPARM = '' then return         /*"blank" parm in IHAIPA*/
    +/*********************************************************************/
    +/* This next section of code removes IEASYSxx parameters from the    */
    +/* IPA output display for parms that are obsolete or undocumented    */
    +/* but still have to be accounted for when parsing out the parms     */
    +/* and values from the IPA control block.                            */
    +/*********************************************************************/
    +If Bitand(CVTOSLV3,'08'x) = '08'x then ,     /* z/OS 1.3 and above   */
    +  If Substr(IEASPARM,1,3) = 'IPS'then return /* remove IPS parm      */
    +If Bitand(CVTOSLV3,'02'x) = '02'x then ,     /* z/OS 1.5 and above   */
    +  If Pos('ILM',IEASPARM) <> 0  then return   /* remove ILM parms     */
    +If Bitand(CVTOSLV5,'04'x) = '04'x then do    /* z/OS 1.11 and above  */
    +  If Pos('IQP',IEASPARM)  <> 0 then return   /* remove IQP parm      */
    +  If Pos('CPCR',IEASPARM) <> 0 then return   /* remove CPCR parm     */
    +  If Pos('DDM',IEASPARM)  <> 0 then return   /* remove DDM parm      */
    +End
    +If Bitand(CVTOSLV5,'01'x) = '01'x then do    /* z/OS 1.13 and above  */
    +  If Pos('RTLS',IEASPARM) <> 0 then return   /* remove RTLS parm     */
    +End
    +/*********************************************************************/
    +IPAOFF = ((I-1) * 8)                         /* offset to next entry */
    +IPASTOR = D2x(ECVTIPA + 2152 + IPAOFF)       /* point to PDE addr    */
    +IPAPDE  = C2x(Storage((IPASTOR),8))          /* point to PDE         */
    +If IPAPDE = 0 then return   /* parm not specified and has no default */
    +TOTPRMS = TOTPRMS + 1    /* tot num of specified or defaulted parms  */
    +IPAADDR = Substr(IPAPDE,1,8)                 /* PARM address         */
    +IPALEN  = X2d(Substr(IPAPDE,9,4))            /* PARM length          */
    +IPAPRM  = Storage((IPAADDR),IPALEN)          /* PARM                 */
    +IPASRC  = Substr(IPAPDE,13,4)                /* PARM source          */
    +If X2d(IPASRC) = 65535 then PRMSRC = 'Operator'   /* operator parm   */
    +Else
    +  If X2d(IPASRC) = 0     then PRMSRC = 'Default'  /* default  parm   */
    +Else
    +  PRMSRC = 'IEASYS' || X2c(IPASRC)           /* IEASYSxx parm        */
    +PRMLINE = '    'IEASPARM'='IPAPRM
    +  /**************************************************/
    +  /* This check just below is for parms that do not */
    +  /* have an equal sign in IEASYSxx.                */
    +  /**************************************************/
    +If IEASPARM = 'PRESCPU' | ,
    +   IEASPARM = 'WARNUND' | ,
    +   IEASPARM = 'CVIO'    | ,
    +   IEASPARM = 'CLPA' then  PRMLINE = '    'IEASPARM
    +  Else PRMLINE = '    'IEASPARM'='IPAPRM
    +PRMLINE.TOTPRMS = IEASPARM PRMLINE PRMSRC
    +PRMLINE.0 = TOTPRMS
    +Return
    +
    +BUILD_IPAPDETB:      /* Build table for lookup for IPA values        */
    +NUM=1
    +IPAPDETB.NUM = 'ALLOC   ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'APF     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'APG     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'BLDL    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'BLDLF   ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'CLOCK   ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'CLPA    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'CMB     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'CMD     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'CON     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'CONT    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'COUPLE  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'CPQE    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'CSA     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'CSCBLOC ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'CVIO    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'DEVSUP  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'DIAG    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'DUMP    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'DUPLEX  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'EXIT    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'FIX     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'GRS     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'GRSCNF  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'GRSRNL  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'ICS     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'IOS     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'IPS     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'LNK     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'LNKAUTH ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'LOGCLS  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'LOGLMT  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'LOGREC  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'LPA     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'MAXCAD  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'MAXUSER ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'MLPA    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'MSTRJCL ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'NONVIO  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'NSYSLX  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'NUCMAP  ' ; NUM = NUM + 1
    +If Bitand(CVTOSLV1,'04'x) = '04'x then do    /* OS/390 R3 and above  */
    +   IPAPDETB.NUM = 'OMVS    ' ; NUM = NUM + 1
    +End
    +Else do
    +   IPAPDETB.NUM = 'RESERVED' ; NUM = NUM + 1
    +End
    +IPAPDETB.NUM = 'OPI     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'OPT     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'PAGE-OPR' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'PAGE    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'PAGNUM  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'PAGTOTL ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'PAK     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'PLEXCFG ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'PROD    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'PROG    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'PURGE   ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'RDE     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'REAL    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'RER     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'RSU     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'RSVNONR ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'RSVSTRT ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'SCH     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'SMF     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'SMS     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'SQA     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'SSN     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'SVC     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'SWAP    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'SYSNAME ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'SYSP    ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'VAL     ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'VIODSN  ' ; NUM = NUM + 1
    +IPAPDETB.NUM = 'VRREGN  ' ; NUM = NUM + 1
    +If Bitand(CVTOSLV2,'80'x) = '80'x then do    /* OS/390 R4 and above  */
    +   IPAPDETB.NUM = 'RTLS    ' ; NUM = NUM + 1
    +End
    +If Bitand(CVTOSLV2,'04'x) = '04'x then do    /* OS/390 R8 and above  */
    +   IPAPDETB.NUM = 'UNI     ' ; NUM = NUM + 1 /* added by APAR OW44581*/
    +End
    +If Bitand(CVTOSLV3,'20'x) = '20'x then do    /* z/OS 1.1 and above   */
    +   IPAPDETB.NUM = 'ILMLIB  ' ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'ILMMODE ' ; NUM = NUM + 1
    +End
    +If Bitand(CVTOSLV3,'08'x) = '08'x then do    /* z/OS 1.3 and above   */
    +   IPAPDETB.NUM = 'IKJTSO  ' ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'LICENSE ' ; NUM = NUM + 1
    +End
    +If Bitand(CVTOSLV3,'02'x) = '02'x then do    /* z/OS 1.5 and above   */
    +   IPAPDETB.NUM = '' ; NUM = NUM + 1 /*"blank" def in IHAIPA */
    +   IPAPDETB.NUM = 'HVSHARE ' ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'ILM     ' ; NUM = NUM + 1
    + /********************************************************************/
    + /* If you have a z/OS 1.5 or z/OS 1.6 system without OA09649, you   */
    + /* may have to delete the next 3 lines of code.                     */
    + /********************************************************************/
    +   IPAPDETB.NUM = '' ; NUM = NUM + 1 /*"blank" def in IHAIPA */
    +   IPAPDETB.NUM = '' ; NUM = NUM + 1 /*"blank" def in IHAIPA */
    +   IPAPDETB.NUM = 'PRESCPU ' ; NUM = NUM + 1 /* added by OA09649 */
    +End
    +If Bitand(CVTOSLV5,'40'x) = '40'x then do    /* z/OS 1.7 and above   */
    +   NUM = NUM-3
    +   IPAPDETB.NUM = 'DRMODE  ' ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'CEE     ' ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'PRESCPU ' ; NUM = NUM + 1
    +End
    +If Bitand(CVTOSLV5,'10'x) = '10'x then do    /* z/OS 1.9 and above   */
    +   IPAPDETB.NUM = 'LFAREA  ' ; NUM = NUM + 1
    +End
    +If Bitand(CVTOSLV5,'08'x) = '08'x then do    /* z/OS 1.10 and above  */
    +   IPAPDETB.NUM = 'CEA     ' ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'HVCOMMON' ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'AXR     ' ; NUM = NUM + 1
    +End
    +If Bitand(CVTOSLV5,'08'x) = '08'x then do    /* z/OS 1.10 and above  */
    + /********************************************************************/
    + /* If you have z/OS 1.10 without OA27495, you may have to delete    */
    + /* the next line of code. If you have z/OS 1.9 with OA27495 and     */
    + /* wish to see the "ZZ" value, change the check above from:         */
    + /*   If Bitand(CVTOSLV5,'08'x) = '08'x then do                      */
    + /* to:                                                              */
    + /*   If Bitand(CVTOSLV5,'10'x) = '10'x then do                      */
    + /********************************************************************/
    +   IPAPDETB.NUM = 'ZZ      ' ; NUM = NUM + 1
    +End
    +If Bitand(CVTOSLV5,'04'x) = '04'x then do    /* z/OS 1.11 and above  */
    +   NUM = NUM - 1
    +   IPAPDETB.NUM = 'ZAAPZIIP' ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'IQP'      ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'CPCR'     ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'DDM'      ; NUM = NUM + 1
    +End
    +If Bitand(CVTOSLV5,'02'x) = '02'x then do    /* z/OS 1.12 and above  */
    +   IPAPDETB.NUM = 'AUTOR'    ; NUM = NUM + 1
    +End
    +If Bitand(CVTOSLV5,'01'x) = '01'x then do    /* z/OS 1.13 and above  */
    +   IPAPDETB.NUM = 'CATALOG'  ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'IXGCNF'   ; NUM = NUM + 1
    +End
    +If Bitand(CVTOSLV6,'80'x) = '80'x then do    /* z/OS 2.1  and above  */
    +   IPAPDETB.NUM = 'PAGESCM'  ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'WARNUND'  ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'HZS'      ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'GTZ'      ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'HZSPROC'  ; NUM = NUM + 1
    +End
    +If Bitand(CVTOSLV6,'40'x) = '40'x then do    /* z/OS 2.2  and above  */
    +   IPAPDETB.NUM = 'SMFLIM'   ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'IEFOPZ'   ; NUM = NUM + 1
    +End
    +If Bitand(CVTOSLV6,'10'x) = '10'x then do    /* z/OS 2.3  and above  */
    +   IPAPDETB.NUM = 'RACF'     ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'FXE'      ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'IZU'      ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'SMFTBUFF' ; NUM = NUM + 1  /* APAR OA52828 */
    +   IPAPDETB.NUM = 'DIAG1'    ; NUM = NUM + 1  /* IBM use only */
    +   IPAPDETB.NUM = 'OSPROTECT'; NUM = NUM + 1  /* APAR OA54807 */
    +   IPAPDETB.NUM = 'ICSF'     ; NUM = NUM + 1  /* APAR OA55378 */
    +   IPAPDETB.NUM = 'ICSFPROC' ; NUM = NUM + 1  /* APAR OA55378 */
    +End
    +       /* RUCSA and BOOST on z/OS 2.3 with APARs OA56180 and OA57849 */
    +If Bitand(CVTOSLV6,'08'x) = '08'x then do    /* z/OS 2.4  and above  */
    +   IPAPDETB.NUM = 'RUCSA'    ; NUM = NUM + 1
    +   IPAPDETB.NUM = 'BOOST'    ; NUM = NUM + 1
    +End
    +IPAPDETB.0 = NUM-1
    +Return
    +
    +SPLIT_IPA_PAGE: /* Split up page data set parms to multiple lines */
    +TOT_IPALINES = 0
    +Do SPLIT = 1 to PRMLINE.0
    +   TOT_IPALINES = TOT_IPALINES+1    /* add one total lines    */
    +   IPA_PDE = Word(PRMLINE.SPLIT,1)  /* keyword                */
    +   IPA_PRM = Word(PRMLINE.SPLIT,2)  /* value                  */
    +   IPA_SRC = Word(PRMLINE.SPLIT,3)  /* IEASYSxx, dlft, or OPR */
    +   IPA_LEN = Length(IPA_PRM)
    +  If IPA_PDE = 'NONVIO' | IPA_PDE = 'PAGE' | ,
    +     IPA_PDE = 'PAGE-OPR' | IPA_PDE = 'SWAP' then do
    +    MORE  = 'YES' /* init flag for more subparms */
    +    FIRST = 'YES' /* init flag for first subparm */
    +    SPLITPOS = 1
    +    Do until MORE = 'NO'
    +      SPLITPOS = Pos(',',IPA_PRM)
    +      If SPLITPOS = 0 then do
    +        If FIRST = 'YES' then do
    +          IPALINE.TOT_IPALINES = '    'IPA_PRM || ','
    +          IPALINE.TOT_IPALINES = ,
    +            Overlay(IPA_SRC,IPALINE.TOT_IPALINES,68)
    +        End
    +        Else do
    +          MBLNK = ''
    +          If IPA_PDE = 'NONVIO' then MBLNK = '  '     /* align   */
    +          If IPA_PDE = 'PAGE-OPR' then MBLNK = '    ' /* align   */
    +          IPALINE.TOT_IPALINES = MBLNK'          'IPA_PRM || ','
    +          IPALINE.TOT_IPALINES = ,
    +            Overlay(IPA_SRC,IPALINE.TOT_IPALINES,68)
    +        End
    +        MORE = 'NO'  /* no more subparms */
    +      End /* if SPLITPOS = 0 */
    +      Else do
    +        IPAPRM_SPLIT = Substr(IPA_PRM,1,SPLITPOS)
    +        If FIRST = 'YES' then IPALINE.TOT_IPALINES = '    'IPAPRM_SPLIT
    +          Else do
    +            MBLNK = ''
    +            If IPA_PDE = 'NONVIO' then MBLNK = '  '     /* align   */
    +            If IPA_PDE = 'PAGE-OPR' then MBLNK = '    ' /* align   */
    +            IPALINE.TOT_IPALINES = MBLNK'          'IPAPRM_SPLIT
    +          End
    +        IPA_PRM  = Substr(IPA_PRM,SPLITPOS+1,IPA_LEN-SPLITPOS)
    +        IPA_LEN =  Length(IPA_PRM)
    +        TOT_IPALINES = TOT_IPALINES+1  /* add one total lines */
    +        FIRST = 'NO'
    +      End
    +    End  /* do until more=no */
    +  End
    +  Else do
    +    IPALINE.TOT_IPALINES = '    'IPA_PRM || ','
    +    IPALINE.TOT_IPALINES = Overlay(IPA_SRC,IPALINE.TOT_IPALINES,68)
    +  End
    +End
    +Return
    +
    +SORT_IPA: Procedure expose PRMLINE.
    +/* bubble sort the IPA list */
    +SORT_DONE = 0
    +SORT_RECS = PRMLINE.0
    +Do while SORT_DONE = 0
    +  SORT_DONE = 1
    +  Do I = 1 to SORT_RECS - 1
    +    J = I + 1
    +    If PRMLINE.I > PRMLINE.J then do
    +      SORT_DONE = 0
    +      TEMP_SORT = PRMLINE.J
    +      PRMLINE.J = PRMLINE.I
    +      PRMLINE.I = TEMP_SORT
    +    End /* if */
    +  End /* do i=1 to sort_recs */
    +  SORT_RECS = SORT_RECS - 1
    +End /* do while */
    +Return
    +
    +GET_CPCSI:
    +SI_OFF=0
    +IRALCCT = C2d(Storage(D2x(RMCT+620),4))         /* point to IRALCCT  */
    +                                                /*  (undocumented)   */
    +If Bitand(CVTOSLV5,'08'x) = '08'x then , /* z/OS 1.10 and above      */
    +  SI_OFF = 128      /* additional offset to CPC SI info in IRALCCT   */
    + /****************************************************************/
    + /* If you have z/OS 1.12 or z/OS 1.13 with z13 support          */
    + /* maintenance applied you will have to uncomment either the    */
    + /* first 2 lines or the 2nd 2 lines to fix the CPCSI display.   */
    + /* The 2nd set should work for z/OS 1.12 or z/OS 1.13 systems   */
    + /* that do have the maintenance and also for those systems that */
    + /* do not have the maintenance.                                 */
    + /****************************************************************/
    +/*If Bitand(CVTOSLV5,'02'x) = '02'x then , */   /* z/OS 1.12 and >   */
    +/*  SI_OFF = 384 */   /* additional offset to CPC SI info in IRALCCT */
    +/*If C2x(Storage(D2x(IRALCCT+10),1)) <> '40' then , *//* z13 support */
    +/*  SI_OFF = 384 */   /* additional offset to CPC SI info in IRALCCT */
    +If Bitand(CVTOSLV6,'80'x) = '80'x then , /* z/OS 2.1  and above      */
    +  SI_OFF = 384      /* additional offset to CPC SI info in IRALCCT   */
    + /****************************************************************/
    + /* The check below was added for a reported problem on          */
    + /* z/OS 2.3 at RSU1812 or RSU1903.  I'm not sure what APAR(s)   */
    + /* broke this or if the same APAR could apply to earlier z/OS   */
    + /* versions.                                                    */
    + /*                                                              */
    + /* If the CPU node display doesn't look right, delete the code  */
    + /* that changes the offset to 392 or comment it out.            */
    + /****************************************************************/
    +If Bitand(CVTOSLV6,'10'x) = '10'x then       /* z/OS 2.3  and above  */
    +  /* (MODEL='3906' | MODEL='3907') | */      /* z/OS 2.3 + z14       */
    +  /* (MODEL='2964' | MODEL='2965') then */   /* z/OS 2.3 + z13       */
    +  SI_OFF = 392      /* additional offset to CPC SI info in IRALCCT   */
    +CPCSI_TYPE  = Storage(D2x(IRALCCT+332+SI_OFF),4)    /* Type          */
    +CPCSI_MODEL = Storage(D2x(IRALCCT+336+SI_OFF),4)    /* Model         */
    +CPCSI_MODEL = Strip(CPCSI_MODEL)                    /* Remove blanks */
    +CPCSI_MAN   = Storage(D2x(IRALCCT+384+SI_OFF),16)   /* Manufacturer  */
    +CPCSI_MAN   = Strip(CPCSI_MAN)                      /* Remove blanks */
    +CPCSI_PLANT = Storage(D2x(IRALCCT+400+SI_OFF),4)    /* Plant         */
    +CPCSI_PLANT = Strip(CPCSI_PLANT)                    /* Remove blanks */
    +CPCSI_CPUID = Storage(D2x(IRALCCT+352+SI_OFF),16)   /* CPUID         */
    +CPCSI_MODELID = Storage(D2x(IRALCCT+592+SI_OFF),4)  /* Model ID      */
    +CPCSI_MODELID = Strip(CPCSI_MODELID)                /* Remove blanks */
    + /*   CPCSI_MODELID may not be valid on emulated    */
    + /*   z/OS systems like FLEX, HERC and z/PDT        */
    +Return
    +
    +FORMAT_MEMSIZE:
    +/****************************************************************/
    +/* The following code is used to display the storage size in    */
    +/* the largest possible unit.  For example, 1023G and 1025G are */
    +/* displayed as 1023G and 1025G, but 1024G is displayed as 1T.  */
    +/* The size passed to the routine must be in MB.                */
    +/****************************************************************/
    +Arg SIZE_IN_MB
    +Select
    +   When SIZE_IN_MB < 1024 then do
    +     MUNITS = 'M'
    +   End
    +   When SIZE_IN_MB >= 1024 & SIZE_IN_MB < 1048576 then do
    +     If SIZE_IN_MB/1024 == TRUNC(SIZE_IN_MB/1024) then do
    +       SIZE_IN_MB = SIZE_IN_MB/1024
    +       MUNITS = 'G'
    +     End
    +     Else MUNITS = 'M'
    +   End
    +   When SIZE_IN_MB >= 1048576 & SIZE_IN_MB < 1073741824 then do
    +     If SIZE_IN_MB/1048576 == TRUNC(SIZE_IN_MB/1048576) then do
    +       SIZE_IN_MB = SIZE_IN_MB/1048576
    +       MUNITS = 'T'
    +     End
    +     Else do
    +       If SIZE_IN_MB/1024 == TRUNC(SIZE_IN_MB/1024) then do
    +         SIZE_IN_MB = SIZE_IN_MB/1024
    +         MUNITS = 'G'
    +       End
    +       Else MUNITS = 'M'
    +     End
    +   End
    +   When SIZE_IN_MB >= 1073741824 & ,
    +        SIZE_IN_MB <= 17591112302592 then do
    +     If SIZE_IN_MB/1073741824 == TRUNC(SIZE_IN_MB/1073741824) ,
    +        then do
    +       SIZE_IN_MB = SIZE_IN_MB/1073741824
    +       MUNITS = 'P'
    +     End
    +     Else do
    +       SIZE_IN_MB = SIZE_IN_MB/1048576
    +       MUNITS = 'T'
    +     End
    +   End
    +   When SIZE_IN_MB = 17592186040320 then do
    +       SIZE_IN_MB = 'NOLIMIT'   /* 16384P */
    +       MUNITS = ''
    +   End
    +   When SIZE_IN_MB > 17592186040320 then do
    +       SIZE_IN_MB = '*NOLIMT'   /* >16384P  (16EB) ?? */
    +       MUNITS = ''
    +   End
    +   Otherwise do
    +     Queue ' '
    +     Queue 'Error in FORMAT_MEMSIZE code. Contact Mark Zelden.'
    +     Queue 'SIZE_IN_MB=' SIZE_IN_MB
    +     Queue ' '
    +     SIZE_IN_MB = '*ERROR*'
    +     MUNITS = ''
    +   End
    +End /* select */
    +STOR_SIZE =  SIZE_IN_MB || MUNITS
    +Return STOR_SIZE
    +
    +BROWSE_ISPF:         /* Browse output if ISPF is active              */
    +Address ISPEXEC "CONTROL ERRORS RETURN"
    +Address TSO
    +prefix = sysvar('SYSPREF')        /* tso profile prefix              */
    +uid    = sysvar('SYSUID')         /* tso userid                      */
    +If prefix = '' then prefix = uid  /* use uid if null prefix          */
    +If prefix <> '' & prefix <> uid then /* different prefix than uid    */
    +   prefix = prefix || '.' || uid  /* use  prefix.uid                 */
    +ddnm1 = 'DDO'||random(1,99999)    /* choose random ddname            */
    +ddnm2 = 'DDP'||random(1,99999)    /* choose random ddname            */
    +junk = MSG('OFF')
    +"ALLOC FILE("||ddnm1||") UNIT(SYSALLDA) NEW TRACKS SPACE(2,1) DELETE",
    +      " REUSE LRECL(80) RECFM(F B) BLKSIZE(3120)"
    +"ALLOC FILE("||ddnm2||") UNIT(SYSALLDA) NEW TRACKS SPACE(1,1) DELETE",
    +      " REUSE LRECL(80) RECFM(F B) BLKSIZE(3120) DIR(1)"
    +junk = MSG('ON')
    +"Newstack"
    +/*************************/
    +/* IPLINFOP Panel source */
    +/*************************/
    +If Substr(ZENVIR,6,1) >= 4 then
    +  If EDITOP = 'YES' then ,
    +    Queue ")PANEL KEYLIST(ISRSPEC,ISR)"
    +  Else ,
    +    Queue ")PANEL KEYLIST(ISRSPBC,ISR)"
    +Queue ")ATTR"
    +Queue "  _ TYPE(INPUT)   INTENS(HIGH) COLOR(TURQ) CAPS(OFF)" ,
    +      "FORMAT(&MIXED)"
    +If EDITOP = 'YES' then ,
    +  Queue "  | AREA(DYNAMIC) EXTEND(ON)   SCROLL(ON) USERMOD('20')"
    +Else ,
    +  Queue "  | AREA(DYNAMIC) EXTEND(ON)   SCROLL(ON)"
    +Queue "  + TYPE(TEXT)    INTENS(LOW)  COLOR(BLUE)"
    +Queue "  @ TYPE(TEXT)    INTENS(LOW)  COLOR(TURQ)"
    +Queue "  % TYPE(TEXT)    INTENS(HIGH) COLOR(GREEN)"
    +Queue "  ! TYPE(OUTPUT)  INTENS(HIGH) COLOR(TURQ) PAD(-)"
    +Queue " 01 TYPE(DATAOUT) INTENS(LOW)"
    +Queue " 02 TYPE(DATAOUT) INTENS(HIGH)"
    +If EDITOP = 'YES' then do
    +  Queue " 03 TYPE(DATAOUT) SKIP(ON) /* FOR TEXT ENTER CMD. FIELD */"
    +  Queue " 04 TYPE(DATAIN)  INTENS(LOW)  CAPS(OFF) FORMAT(&MIXED)"
    +  Queue " 05 TYPE(DATAIN)  INTENS(HIGH) CAPS(OFF) FORMAT(&MIXED)"
    +  Queue " 06 TYPE(DATAIN)  INTENS(LOW)  CAPS(IN)  FORMAT(&MIXED)"
    +  Queue " 07 TYPE(DATAIN)  INTENS(HIGH) CAPS(IN)  FORMAT(&MIXED)"
    +  Queue " 08 TYPE(DATAIN)  INTENS(LOW)  FORMAT(DBCS) OUTLINE(L)"
    +  Queue " 09 TYPE(DATAIN)  INTENS(LOW)  FORMAT(EBCDIC) OUTLINE(L)"
    +  Queue " 0A TYPE(DATAIN)  INTENS(LOW)  FORMAT(&MIXED) OUTLINE(L)"
    +  Queue " 0D TYPE(DATAIN)  INTENS(LOW)  CAPS(IN)  FORMAT(&MIXED)" || ,
    +        " COLOR(BLUE)"
    +  Queue " 20 TYPE(DATAIN)  INTENS(LOW) CAPS(IN) FORMAT(&MIXED)"
    +End
    +Else do
    +  Queue " 0B TYPE(DATAOUT) INTENS(HIGH) FORMAT(DBCS)"
    +  Queue " 0C TYPE(DATAOUT) INTENS(HIGH) FORMAT(EBCDIC)"
    +  Queue " 0D TYPE(DATAOUT) INTENS(HIGH) FORMAT(&MIXED)"
    +  Queue " 10 TYPE(DATAOUT) INTENS(LOW)  FORMAT(DBCS)"
    +  Queue " 11 TYPE(DATAOUT) INTENS(LOW)  FORMAT(EBCDIC)"
    +  Queue " 12 TYPE(DATAOUT) INTENS(LOW)  FORMAT(&MIXED)"
    +End
    +If EDITOP = 'YES' then do
    +  Queue ")BODY WIDTH(&ZWIDTH) EXPAND(//)"
    +  Queue "@EDIT @&ZTITLE  / /  %Columns!ZCL  !ZCR  +"
    +End
    +Else do
    +  Queue ")BODY EXPAND(//)"
    +  Queue "%BROWSE  @&ZTITLE  / /  %Line!ZLINES  %Col!ZCOLUMS+"
    +End
    +Queue "%Command ===>_ZCMD / /           %Scroll ===>_Z   +"
    +Queue "|ZDATA ---------------/ /-------------------------|"
    +Queue "|                     / /                         |"
    +Queue "| --------------------/-/-------------------------|"
    +Queue ")INIT"
    +Queue "  .HELP = IPLINFOH"
    +If EDITOP = 'YES' then ,
    +  Queue "  .ZVARS = 'ZSCED'"
    +Else ,
    +  Queue "  .ZVARS = 'ZSCBR'"
    +Queue "  &ZTITLE = 'Mark''s MVS Utilities - IPLINFO'"
    +Queue "  &MIXED = MIX"
    +Queue "  IF (&ZPDMIX = N)"
    +Queue "   &MIXED = EBCDIC"
    +If EDITOP = 'YES' then do
    +  Queue "  VGET (ZSCED) PROFILE"
    +  Queue "  IF (&ZSCED = ' ')"
    +  Queue "   &ZSCED = 'CSR'"
    +End
    +Else do
    +  Queue "  VGET (ZSCBR) PROFILE"
    +  Queue "  IF (&ZSCBR = ' ')"
    +  Queue "   &ZSCBR = 'CSR'"
    +End
    +Queue ")REINIT"
    +Queue "  .HELP = IPLINFOH"
    +If EDITOP = 'YES' then ,
    +  Queue "  REFRESH(ZCMD,ZSCED,ZDATA,ZCL,ZCR)"
    +Else ,
    +  Queue "  REFRESH(ZCMD,ZSCBR,ZDATA,ZLINES,ZCOLUMS)"
    +Queue ")PROC"
    +Queue "  &ZCURSOR = .CURSOR"
    +Queue "  &ZCSROFF = .CSRPOS"
    +Queue "  &ZLVLINE = LVLINE(ZDATA)"
    +If EDITOP = 'YES' then ,
    +  Queue "  VPUT (ZSCED) PROFILE"
    +Else ,
    +  Queue "  VPUT (ZSCBR) PROFILE"
    +Queue ")END"
    +/*                                    */
    +Address ISPEXEC "LMINIT DATAID(PAN) DDNAME("ddnm2")"
    +Address ISPEXEC "LMOPEN DATAID("pan") OPTION(OUTPUT)"
    +Do queued()
    +   Parse pull panline
    +   Address ISPEXEC "LMPUT DATAID("pan") MODE(INVAR)" ,
    +           "DATALOC(PANLINE) DATALEN(80)"
    +End
    +Address ISPEXEC "LMMADD DATAID("pan") MEMBER(IPLINFOP)"
    +/* Address ISPEXEC "LMFREE DATAID("pan")" */
    +"Delstack"
    +"Newstack"
    +/*************************/
    +/* IPLINFOH Panel source */
    +/*************************/
    +If Substr(ZENVIR,6,1) >= 4 then
    +  Queue ")PANEL KEYLIST(ISRSPBC,ISR)"
    +Queue ")ATTR DEFAULT(!+_)"
    +Queue "  _ TYPE(INPUT)   INTENS(HIGH) COLOR(TURQ) CAPS(OFF)" ,
    +      "FORMAT(&MIXED)"
    +Queue "  + TYPE(TEXT)    INTENS(LOW)  COLOR(BLUE)"
    +Queue "  @ TYPE(TEXT)    INTENS(LOW)  COLOR(TURQ)"
    +Queue "  ! TYPE(TEXT)    INTENS(HIGH) COLOR(GREEN)"
    +Queue "  # AREA(SCRL)    EXTEND(ON)"
    +Queue ")BODY EXPAND(//)"
    +Queue "!HELP    @&ZTITLE  / / "
    +Queue "!Command ===>_ZCMD / / "
    +Queue "#IPLHSCR                                          "  || ,
    +      "                            #"
    +Queue ")AREA IPLHSCR"
    +Queue "@EXECUTION SYNTAX:!TSO %IPLINFO 

    +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%0ArTBot@_LP|!77uhmYheziV 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%0D20G7$~u$~MNkO_SRLSbP7;|H-8hUWoo zFhV6_5g)V(N)m|~l(?675<{2FJ3bGy*F(g9GKIp+~IHNY$X^gmK3(Gu=k|?WQ<7MdGDTwi0#m^Sa0O?ROiBNS#-KG3N+5)- zZ-+8v=0WTw()`r&$m$!>7TMH9mM&C0XF74>qOhd3L}?9&L=km*Akf5K7Kg#7QyYHa z>9YugMsm_$^3yP04WxEFOk7`(nI8&#!LEq>{&(U%l4g50wMrP-oTuL*H8Sy&WJDE# zzP+F}7bL(IQhr0Y?J}!15%~tN`7bDS%*&ff7$cdwEtwZ=B@`6DOOh>4!TBq-kw0^+ z$_?d5MN$k0Ow`B&B!^`egyyJ3M%-pT5gLKeve*vdscM!K5}r~kFvk@>*aQ~RPV8pH zVlh#6_Gl2RJnpACp$rXPs1@c+FCiHl@ScDs2lDq|iJ7AW&U`N zk@6MP2oVuuq!1{9B$*u35YnuyXoRM!&_iBjADIZ$B6n4_{-jX~wt3ZrORD_Js1pK} zl(I~sOJsxLFT(GrH4&{ofeR-Ofrr3hX_OJBD}5dZsKS&yQPIQ(6u1}{Zl@<%rkx&y zR*-OW)&c*i9Otljj)NP_kQ?;FTt!Pz3tdn4%6w zbErThS0W&kShtN#_>$rk-dW20x@0Lf^Px z)={urgmT%H5iAuA^Ad0ZmXI|U09JD>XmD{1Z--ro5kY;Q4=^C^OLBFBZH?=U6ol8Y zEDeY#{$vF&FP~c(*Z7nv6en#}R%oE5@1e71MZx4OJu6n_Q61`8sk`f!i`intcELne zH?T*XO#y5=_jqBJj3bgC#bK!cbYdZDUCSh4weu^@d~li-{#hR_ZFX0<{=p>}0HBzl zHZY#Hg2h}wjRcfUP@%?=j_XUmPamyG%hD0(c`hScs93Y@!q}>jSFNqQ3&_FPZ5kJuM@vx-_-5saW;CSOgaAmi>KKt$4*O?GFfOVdg7w?NiVa zT9Q|`_10F=p;$S}YxgYVK|*YXE3g{c#n|Lj>;bV}BkD}OP9Rv>Q*P>C^`}ho2Yn3; z*tpVgB^yXHM{GS^m85b(k2whG`SBI(0XOUq$Gjh~#nne$u|x`xuB{Nb_09W#t;nTu zOCC7rN&Q@If%g=a;-|L4L2Y8f|T;#Q*QqmPr5VW2EN^V#&ix4;Dkz^!Gq@*LYtcs74mw@42 z5F@eDijj6vucC(&J9?2C_Q*S`Jjk)R%A&MU#!84pL2Ft@K!Yn8DGN**nHEqS@Dpxrd}kjfuLP-&z$!np`dSWFvu36%c4ds#MJ>mr+1Vr{SDXMuda-~QUknGH5PzAe% zZ@Hqfw7df4PxEXhl@g|5O|(?<8;~HEElQgvHn>)LaEBj3kwxe~$afcnpLfQm9kRlJaL zYy2s>0*YZ0KLKp2#6TdLH=D}DNNb8_@M>&AGL)FM$<^tRuk@8v$SGR~1tl1E@(Y!u z6;MSL5#6k4q%;(*iD1)A6%>`KJV>!fDPx4_sU=~4C;HK{1%JV45-^}8p~Pk-)VBV@q_7t>I#_0%toed-J=Cu($`S}IQVE}E z<1N)oc*A8MfUT@Gw3j^)KLs%*Pb6jzMoBGqCPpL%ynl6dnXn)I@+z$gZ~6r!-S(z8 zXp5PW?6A$gxa9q{XD|tv2ohU6iHcV8ndnt`QL<1gx}XZ6S{lQk2D@ogxPYXT%SSJB z6jAs;w5eE;_-nob8XrI-MGE2+LzM^V>X2tAR;7G_=Ec3Aa-ykz6-iZSW+Nj z7AL7eA1LWpjfX+Dsmr)@EP^k|7E*-k-``-$gs;Dyc*Y=~gW+p$44C;W3EO^7&-gs8Q$%oOCYr4;FlT?d6FUsnt?e8( zKqqaO9L5M96h~RqhV<_53D@aKBYrunE*h+0Jg_CHgk)%xi&!4|VSwlNT5_D-6KoW%sO`&BG?#O7aRhWbYM&M0rE{>K6 z=E*dXpc5sXr7CM(CKv=OOU fl_^K6k)1l@PG%s{@X$el>JrCL(EXXOq>%Xkm-*8A literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/take.wav b/modules/windows/oodialog/wav/take.wav new file mode 100644 index 0000000000000000000000000000000000000000..5e6b3eeddc1b559d1b26de24bbfe6d9117171a0c GIT binary patch literal 88264 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�O%Hz2g)QA-+F-hud8@kiXNZ2ot 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 literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/whistle.wav b/modules/windows/oodialog/wav/whistle.wav new file mode 100644 index 0000000000000000000000000000000000000000..935b2c89482932e1a2ffaeebf0f08c633b12d3ea GIT binary patch literal 78710 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 CKCe9h literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/wav/yourgood.wav b/modules/windows/oodialog/wav/yourgood.wav new file mode 100644 index 0000000000000000000000000000000000000000..f510f249a425d811d0b8d617b7ef93f2f36acf75 GIT binary patch literal 63160 zcmeIbYfoHRnxI=F&4=@Oe!*yd!ciZcnbLHXs%K7hx2iMMnI)Gk(iY$`ATYy4Toiz~ z1%f~Uh>HRcU>OiLGPZ1|?6lHORcEStMm;?`7wP<&^Z7i_yVi~fZoXuto!M1h#t}RA zUVE+g{=RGNwch>t-~Rg7U;ckT``OiB{qFzh{IA3R_TT*MXFvN_{QGym`&s<|S3mn- zIMdnwUxxoR-&54Q)jr(r_spebc4l@qF3wsmtTsJ8Ju{R3PG7&cdUGA_^yW)TZXv!d zXwADD<T0^ue(Fqrv@CY5=MyT@D`n zxR^B=m5;*kA$?+oxXFpA%e1z(~Q=pK$;`^;T zJgaJNedGJ9Xz=&`TL0McM+$tTz()%FsZhY!sJZ;9;B^KMW(Llj`5-?(lqdR7{d^Fj zy}wT0ICA)5x{hh6n1g~ZKQ?Ouj_-?CU1`2gP?ad~y%jI|ZX)G7;?RJ&j>J2*@cyf7 zcvCOM_xtbjV-Ihpzz4DuZw92fMpmad^mI{o9IxtF?~JB4t;s8c7;z~!BmGpB#NpJzcy;0a;<= zupsj5z8lR42<0eqlyp>ldM2IAU-?14+8Iv5+QJ%bWI<@F+^TJ>|$p9$>-JPlA~D!^st#ZdyPfTf^$;tO~+S}7x3{MAdo zA}Q)6uUCj3il+RAE6t@|zX^io>lYq3-*mxo0wkd&SO`<& zJBxOph-jBU6+D~B(*P}FnNSS5t}a(CA>4sGA6W{iT!4K6G^zi_g{T@mrQ4xrz2D+Y zK2fxKMuTCEqTE2NIBIm##JjVerKrqz5JZMc4Ru^iqtn#Ay*EMDL<@-^4FH!4nF{e` z{RY%=)bzUvzC`tU^H%a|ac|>795vu5+D|p>^&2fWp?ASyAp+?;Dx|}p0fr75M32d1 zHGu(oh`Sc9T3x186A2O(Bt{m81Yp3EaRMuT)`6kFIJQcGZsWV?v6-m#<9xAEyKxj9 z#z(!Q%wM}ZjkXZPnN#>nfjR-QnQ!7R_=&x!TTp}$fn?~ROyC~?0#pFf04~nZnWydZ zEaIG|N(1%csQ%s1kS1w5)qZpl-8Lv4=*33^f2G}De&>SdmZXe`RjUR@n~T ztE;P^tpz9$*UMQl>KTNDU;@R@1{54+%rjyMg9er`I(`)2#TCut1&G^vlXjo#DF0|6 z8Y=F`C}ntfcyJKMp8R?_T(?-~qLeSM@(+AN*MUokD6WGtXM{fCcM%}MCQHFZ8fMG_ zW6>&Pn!`kercax*1idoF(wR)m{3CrS-DAx*9k!OVXrehdI5;pc&^ItRItFj&7OQI; z8@1ZT+G@f~l*Ki)S&Zlu;lKuju0w~Ag}_y)GuX2;R-+%PPS2ESHdLYtS!M%7fTpf^ zbB5X$5KIktBHbPhgiMI6Ey^IyDkyQHBo1IO5bQ!q<(wGxaca0UIWxDowza!|a7fwT z+o`QBFGiP%s$w%n6G^Sh6|mph+1=UMs%=03p-rl4t>}qfN@G(ry1ceg+uE{Tb#X4i z+t4A83#4=wB$&Ur&OFQ4U6>Hba`=Y=itGUr_Y|89PVx`S7xUtrOPPn zphx;M0gaxXZcAtTjg}j29bJ9HW0kdor!T+#?%P){zI?D>t4x;$ zs5Ss?GlS*H*mPxe_weNDv**vBJ$-bvyEZpf%JM3^fw8xzcVKjKwz{!C;EY z`?ck{*{SGXB&`D#2S+Do%9UjVVQ)`F6G3P~cIG}aA;Y=_x27{1f-fVan#aMP_V$jB zuAYI?RCVX@>8tPl@ekj=e0sdQRvsJZk#j-bf=1Kj<*kF0XU|`}d>&|2rbh>Wys7l{ z4VI=W8~YEQzIgHc*^>tcJJp$>h`E~^aupmXJ1}AvYAEIysRVn{p^!POQUy(e zorB&EuY+GD*h|+*o@5QO)!x?D(K|e~SUY<0hkyP*|LL1&$GgijgPm=yZS9>>Hxxv# zUtZcic>Ln`|M2^l&rS|%i?ED_I(zy64I`ql9GjX&@D87T{mt*cehj}BW=s9uot@oa zXDA7nVK^3-H(+R|sm|Wa{^x|7Fcz(1oJKA~e(@#EY z>F7-=sE4SmZtWic-ao(Swr*hr2aoWNffUQ-TIy z-f=VVj5ES^dw&61X6GA|J3#SUV2jr5x zvje?_pUN9XqOZ5JqwV_D>uvqh>-WF<@Bh#L`+tA;WKZe8apg)&M_#%Rm&&8PUAJy^_4E&pK-KAKjeU7>b!+e7==kVxZ)2!aN&y#22-sU2YZ05w zPLCdwYA>3_PZ;;z1o7A z=|KUhx)4FzMh^i zy#@@%I!02fMh)7IWejwZ&IGfJ4|7qM-U4VnyRt3F^@y}CBT5mdV~g9{T3cGKwX}8g z3}Q^FU_gL#+&Xyh=;;&atj4uoyVlw@I90|@7_DP1YS?1sc5efdjz%CHrHQGTg~}qX zT$K}MnPQwH#Gz{u=t)`SH0CZPcZSNYBe25YCEFdsq!pwXJm`fw+HPFC*3ycaP0pZX zrP7q<`O&kdCr5i*)#-uu7RcW-EUW^G(i3v+92^}T?QgBl$#0GS7!e+v3td70!7Ho- zwpkFQtt?NLxFD_c%;SO?j3S1Ds@ORMe`shV7eNQmp~1e}1Yml}o&kK&WNC0{Vt)PZ z@uNqN?jPN$RWZUhTH3mXW)_#$DC;S5#!n-`yBk%(P|Y;XNSPrUGN-EGL@)+bO@(lV z&qz*BQUYLboojJbe+Zt6XtHUAHI67Pg00RjtTI{xSqyC^=QfN1A06)@j02r*IEuc~ z?9%$i#`?c;k+yE|Je3n=pF=mg5Ci4C__Dve{)R@Q5qn?!v}3$wEm6BA+) z+7vP=5tBXvY8*jW3I-7_>zJV*{!XC+wD5IZ$zkaI2BsDxFh}&(aI|=kuEDWc1yfez zo;bt~5U|ytQVO4?B8nO$OJu1eSH`LAy7Y38Ndg8L;{(3MKYrlR#>XdwaE!0X*{O+f z;;8=H-Cabew{H(%%SH$LyV{K?rmD5Q!@~#1``asXV}rN5y9dW+usas4PNhOv41oLl zgkvg;<^{ekRTt(Fsqs*iS#*Al(Nhx9B#+nv>*`#BTml+`>VPPzJJ@K4DMK+Lkb1WW zIR&!2yQlkBM{CFMWOe(_{=Iwqdu#I(Lw(&HoxMom+Sc~=R*iuPW^{dX2P=A@M{BwlF!=bF01mR?omV3cRv{pe@i^ZF6t`=-$!(Zfynq z1TttAzE8n2k}NM)mzI`d@V@|P@H$4+1gglC3O}i9^lx$s|FDYIg-kCHwT})NGC4@? z@9n*9h=2R`ZK3Pzy487mc)oU@k<8)#W@T!)yZwvnH*O7#&n>MkRpxM-qFUQKdieOs z!+U${3n4&oXbz^%CR>XLl(H6Wft=cvamNQS z1eIn8n^f!Rx`|`CcI}I{j)C&p{V!iU|MKLpwovNpXuW>D{q`6?|ZgVGr*U zd>-v>u1KBAd?lmej` z838(J23HAV`Ur-4QCq-kz0uJ(S=qX~zkhdoqe3`wlX#=Me|&llktoyR^fW>HN^P4c zXREeWh12-G&CN|HRGlXhB;sL|5HU`$xv~IzQH|9V$gThYBGki}2Q4*)=m?cIYMbl9 znlT4sw|k(N9PPb*8z|xE&6~uy9la9^n}Di! z@aW*~_Bv5HOv27$UKSVUr^Yn{V-u)r46iHmvx+3*Qou3^a8;W^^&TfPDH28EFb+fJgR>x3f=j8FD2M2dI7RLK-U2nPCisi$u;zNNA zLM(4=AKrWL;P_x`X%0e!6zOSoUZI4VJz1qu)UrkB%@r&yMiz~jE+YfwS$LcaCstPg zZ(}_eFcLTb&(!v$f-=Pahm%g=b1VH*Z`g!Y!4T*VmA{%94%L zcJCcOe1t}<&Dn*vgiv4wi!e8XXd&fb0)(7c2qRMu2&5MDLS@o)PoYpyGE@ZTpu-*> z8bV(IuTy|-b$0i5Gat~8*J%6V+Ks`5y_3f$$H#|zD`fy|y>_E(bZ%vHYkhTPWfcsU zme;rM+^yTSprD;408$UL8S++8rG*8QL6B8l zT@J@+ObmpE285^^H*pJ_MhyE!OUuVU?Zm;lCqY#*VibDt^(@ zIluGOA6~tB@%;J8ozhj(+vq5n2& z;=~VKGQ}gz0d_=Nkfn>*y5(B??9Pk-@rUnTzI<`Aw~U{=ah=eArb-`-f3UAJlan*m z+MRn3AKu?to-r;T8U)`Vh%`GhK3W=|np=RQOV#C-+Q!z};v9MvQip6X-XY8}c$%0( zR5jL%cwf-fAZT!>!eNh%0N&6DfNI|-Qpi9^=`9y-g07wkeWV-dKt8=)OPRQ ze|T~qDTbRPBjA8y5zIuT!J#ok1Y5hdrlThmoYbzWYl-_K!`u+c7kFq%7{A2a6_PRF zpru{PUb`{6dh(C|_}w?JzLmC9!(Gs}n_*RXnxJEtxt>yKVs>@+{^MuQAKweBSsLo? z?(7;UO*1MRbr4@dv{#VU-Gd|SDi&JrsE5YI>+6kS5MLr91~^qC6I6hi^gIeM=op2# zKs+J20}X{Ol{D8>#Ac3PZnX4O_FjGW>gDrSFCHCil*jvTUB7&r-wLG@`fa z3PX831RgHzfc769%tK7ZKnPQWd!c&BOkzQrVe0OJxlB(Y9oO5YRv&-+^2O7q&mP^| zTbvr{zRn=GhiSc`+dVyl;|SHr*zEEhW=U%_~pwNPY%~B(*w7@XuZ{Im_5OC>HGqb(fDk& zcJT1o*DszvIN06XSYn*cTsRua$Uf%doj}5cRyXew?C-4Wshp{Y(yE#ha}G7sx)=cC zxE(7NgA8y5*$Epl$cp%MR?QuQa5(5O!qEtSgb6N8jExTU_1^C3>nC=`5qEdAw-3$l zef9Fy%in+Z4_}|$Vd{?g7)Ha;7u_Rr8XM{#7@c0M-MRnt*_RI)zB9!>GlsbzW>zTq zCTClmY?)iGIbf>Ad;(_M+vyY*7~Ksq-X21AushDjAQBTPwuV&BT*4M24uA%iDQzNQ zMFh0USX3Zf3qub@jFXt6@_`2~&(I&{P#B(+7WZDf`0Du!ojs5h$iSdbQySq(x^~EX!v0;%kXGp@9yE@ zyM$s4~j%x_@wp=&s+n>|vy8ZeC~1gwqm6 zfY2KCM!I1svw#lnV3zaLh8fUzYkg(Wp)-~n$AK|1(g57tcXpr)^TEmF8{<-ZgfrEs zdsi|hiPtblwnv}{Q3#?Tg_cZ|nWB*L>1=5Pjls{20Hp?j3Dm9KI|q)z4z^aA*BNon z5M98~F%IK-1(T5sURT#Pw|DpM>}{_T(kt#3^b=VO(qqA$%E*uXn2VQ)F+9|aSmcf~ zC_oys1863LJlJ9&MnsS>LVulSNb|xPB_na-9sa>|NTrY)$Vvf-0{#&lb5l@7TBb9O zI-)kG)Pkhm8s}UGCd&ja0UQ>&AA?McJ{atECg65&|L{a*ZP&5PgZp>4R^}&4BSa^- z2Xw;r;Syw8WR7fe8}-?BN}Q+-)?h8MPwIwPE0yZ36pC3qhe`&R$|cR=k)woLcI2Tv zIc4M&D$_5f#}@re-i?gUGRefiYlWe^BhHwDNzyoNXg6yl zuq)x8C8n{n4o8~FUaS^WS1jeMMeaf&gZWkn*-f=Oezr4awL?M){(oK{MY&A7bzF~&3Ng)GFhhkd94x2I|5MjiW`3Yug zmY6H1X&+XML+8*HwVQTmg;}s=1_(6AQ~yvuV4@opDHKthLRBE;%y`&zkx1}xhjTg@ zE}tS|g(cUN!$=-t?(XmLn0sYOe*sfMO*jBr=%~)nvZ3+{%w|GqZF7qUo+wUvMy*Em zheoVIADV2ZQ_!p}R(7mmumLUt4hJSQ=Ld`dQpgET)e3QISSxAFa{3c-5E)g|cEAACrbmVwTq3rX~t!x});Gq@n%3D2A_TU%LTdCeT<IE%0$1w>8Db!y zLTQAoH;43sZ>k=$BCibTgd+>DwL^+M5k%tK;_p2K#MA)Xt| z#OB3BLP^cQKS>0xO2yMgFc@-9XnSuP8AUWO436!Mk#uVI;{CvgjK<`%^DWp@S_;r2 zehTbp37^Xxd)NbUm4-oa?HRDfp9aAaB1Wx@U+Rp0LL`%GrU9F=E2$zG5+><588~#8 zfsxNb9Xt{{Ve@bX!81To3qTSHbdJaY7N8`cqi;|Qy%rlpg{4H=Ux5p>t&<=u_zp&R z3EPcILKWOd#)3m=%b*q|hmSnX!T?x&LRVqdUZA17luh^$mg<)$%S?JK@uZ^06r&T! zv$(ocUBeqw9_58P7C!0GbOtp6M(YA70!t9%^tXOQTq%4cG-*hB`ecOyo}w9r198fQ zU!3$WaA^%r4_&_rz)6$Kqe$Dn|%XA)jOglJT#6zCJ+OmI?`g7 zNkP-HMg%!29c2Rm(_tz~yOOS~LqrTx7%uIjw9O?Z&#dFPIK~>mi)g9fKJ~*q1%j~4 zN79X=h6y46eSi_J&j=?Z7B}}6CDqEmsgRHj5lN)WlB)}&VQm8HfHWr;2V_S(2AMHRjo3z2`MuL&`YnNC!J;6m-^=?vl-45I$tcsDBKTeqa+{$z)-)` zk?=*Bl_~`W)(kA_2L+0rpt<-u{Xva{c$~H|5!8K${D;mMZAD3Ihf@9gDe7U!jFXbW zhN?L!8$JT$LkfZNs6EQlsV zdZpHo~Aky{T$( zm3Go$am`=(xQ_0r2JIzZ$@RQJ)aATI(W4d7c0NQ>X1OXl;X9hh4Hx=Hy}AIZdDP)E z!Iy!Gc2zHad!Ya&Rppij5pvbD*rY!FtRvbub>_$(-dwAG)9Y&oG6kFo_?U-Curt?&Sg^ zpC|jNGq!vNhBtPWCF#sJ5MRFbjb2-=--Ew*D zcfOKD@tp+no%^`(hI(+x)uMZOaAD<-Cx285{JArwNh+HTU&E5RAbW7C6c*t%H-CUj zAAq3^ukr!#d6zD58t+p5Us~O_6VQKYSX~A$x|J^#-NG^VarBy7f0#?(PoXrR4J-P?K=OfF`GBV^E_2QZVOZ^1bQ?;|Yd#cg&;~i(8P&MwW z!}Bf&1xV-Mufxqjb0v;Xw|@cn#Zz@I`D8NVeYC`xD3mNBcwJsA%gD*B1_ zGUq>v%LUyV1ZbvZ<2b|AsMdT`7b+2mXeADstGw~J8T_-tbM|Ii&n4!Oiy!fQwsJPw zbyTF)Yf8Ny2lb{-b-)j()*xVUbhgqZx|SuRUYpxJPG5fJx$M+^HWx{B(+b9BQD_nZ zs{~$kO6D#Se6cX-tQ@3EcAC|%z*wSjTqj1dtPO$`^}>(SPjcwF!{Y0dbC1dX;)>t7 z?>KN#qQB!jAE|k5p%?}71*RGM{8QyPgSTx&$sIJlJR4oud=iUuf>4-WYMg3C%DJ>J z7gvAh!f99V`;g||fZ>vLz~Fxd#$|_;Oupb-!+~9 zPe*|lYrxZY>{m=AjS2}nU{7KJMOg#r8e#u9N&;cSU?`)5k+vKqTB2o}HJe!Mo?E5l9dwcpyNNj0vm<_A!O(iD@nfJ)Lw!!vjGaQks$9+RPwOUFjO8!;%O}i0_ z?P3eg@pomVwCb1+_ z3ykVLur0^Uo^G=wwUm202TP;ufFtk@PH781^M3ubX76M!jbQ+hKl!aA7ao$}1VVC3i53-C zxJd)h3C7z-$UsP&#EG5M?BNWI$Tj6AUV1K>gphP6>=YXwAPHw|dK8(()t&u={oS3t z1M(;BkYDrxSveDn*f_IBmKFd6o2itQEp||v2QjdTy_Cp>nGb=`n(i0}2Sm&ifF!qa z%a-hjG?$pE5L|^efi8t&^>5-(thHtJ3)79IX^LMi6wzH*$9E@yvXOou8 z#H(w&BvGtXw+`7ByF$BJX20ib~x2{LR@TS5sXze+(Kl{WK) z^$Z|jr5=-B&Dg35P-e=j`=rd-L$~+X7=3VfbOhLHID6yS0YQpLGF!wxYME(HR^%~w z%Z{H&wxYU{pf9o!1NaWRQ8gKy6>>LC>4MBJ68knGdqD4AKFtE4XBB`A0+{oJn0K_J zqm|Tq?c}3?#iNMQAe&xRYc)2=tVSY3@+2G`9rNjaX%gA(O15e_agrWMl1PFmGc>Rj z9=pI+e>)6G4-$|pQM`Az+;Ic&=uB9EFs0caMrMFa;v_Qy?CR|J3R;T_*#^i#&;g0s z$rJhcXIER>Ng6mQ;AFaFUti6Qs=JsRU_Lw`kaM?FpA!s4mfmY;uQ3}n%LV8xS zGG6`c)6cG4Ywa-|0?A59S&S86hofQ*mC3BMFVs&?$a`vfs>rS6Cc4-GX1Xgkr$?h^ zJSIVlmJ}23_G78*wsw@l#1Be`+l)1NK~zOpIT7jzA29v}xLio6;in{vbZKk7LDrzp zKl}94&#sbbiQKE+YyJsXiV~hYcyL0F%OhYW&n$^%O)r;J5gG-R%{A3Y{*D1XZ^)to z4OVWzQU@q$e|1QO)>}aqLTZN}$odwVfmm z7;y?IQ);#Cy@Puvj~_pL`0(U}?Y4V+ckZxLxkmPv$YO0@Dtp)rXdL1oLGYl^G1FGr zM|=^8oVwNRQA$(Te8e}T0`nl4DGHRp;uQ8G5^hK8SyM7)U_blp(<@{#8DO`oY2=A( z;Njs>PImp|9R7SM1I0hI6;jYWxw1AuMshuySsoDfi{5A*~r;& zl)5XVEQGbia_!0$B$o1dOIt6wNLEet04>blc=GtmufG2J>*rrSymx24%AUw*#B_Nm zskVj8iKZ%{Gkuxc)!EB!1FDrd0O}EEY=lmR)&v;Y#3BKZ6(=vC?y_@}Wta-IP&w^v zC!y?Ba&bw}&tN|GpryTcjLhKna)5Ko1bsny{)GHHMi}r;HBQVAID4>obcFV+{y|Ya zgZiIxs>oN0fsqj-`x!?_<>{zF(L{yt z+@ia&cTx8f6JtMn283iqAwM>$5$GnA!AK7C5nN|Gyc^Sn0|?21w!XgUj^mx}&5hL+ zHkJVf0G0`hCzDx%=_Lj=L|+7naK}*5ZP4WweE>B(2Iq z@J{2AMrCS@{Cu}bj@sRI`*#1xgjt%mw${!2xZtK*5-Dz?(Cf?d)8iwA(L-zxS1izH zV?c&=W%BfG>_UY-6`y>gwHnFs7D*lz(6wFv0@#$i-~9Toe);qN@b7>A%fG$aQ!1~3 z`gUz=y|zs-e*e+q=U9BL}bf zxK#Lvz_AUJ$_qkw{d$7#H^2Vn&;R0o{foc+^|jtoWi`-QUs_sSWi)np^a%LA`ttsE zb;8tR2oC~Igis>gF?!!WI6>C??K=mABfF%&LNN@3C=fp~(gB;P&QVO<8hOV?$reUb zFZ0b>N0NpGY*N^1)74FpGO)M1tK;U)TjamI-tybe|L$-8(=UJizyF6{{cX#@^s;X- z*jXdYSz(NIbb>+o>Z>mw^FE7|GRnRCM8{+$GdU_b*2&33V$n@P$t99~j8C!^IJpG0 z+XT%7(Zl29EHtessnZ}}g$yp_`aHP1e|L9hlk~xh|!KIB~|XtRN7mww_HK! z{`0SX@r%Fw#V>#L$(63j$_|vcL*Twf=zag;lNZmvdiM0;y@T2^L#2Vpq>pVwni#&2 zg>Q6X#!QKul8XdS6$YgE4_)`NuV^4wAGuv`la7MCC{rZjLS{9N(5^;262987ja;JS zu~=klF)1O&Mo36RRNjwW?j=9%jh5dLkA3pVZ$9}u%BR1(F)*>Tw|{Kv-#Y-gdwl$e zyyGOsCf4Qs7vtPEG(3SdU6`9R-W(mDC6Nb8mkL=Ykxgt| z^93ZGTSpGIwc4Z|HI+k&&82!atSL#6NN}Fgunv&u3eu4I%miB|DJDr~YwPvan*+1e zdyl^S`stJXJF82pi)hQyU3gMkTU+2Y7=t~xZgq4Gj7`H&atG4WF2+0v1!N(8BKdlVu-N`f(g_m2QA`=KL#F5@$cIUAG&e#DmH~1A6DOE6xsSv) z?hhX^$UwKk46w17P4a{NJ)Jj+%&vC~S9TwemHyGuW))d4FK>_|YoC~rLEH4$5IGE6 z#W2Jv9KuI}XtS)4PmW9|&h_B8bwY$@W25A!(?L=qr`ZVptRJj;kgl6;*IRprD!iWK z$>aNX)+&p7s_nhIckgW1)`?h1+(P0gEO!Z#EuuAK4kYW`!eR~E4>K^8%t%B+24okP zjS^3dFzPVJWU`iqJi{arix~mmq=L8;o3fjJ!O0&qjPx!<@596WgQSogBJUXviU@>B z9%xOvT5~?IseC~cNU0I~^~vfrc)RQ7^{WI$pa1=5pSN@m&8@88+1_4Xo|~MRm|NXC ze$1<1P7e1>P;L5Hvd@yBiJND~$;aK*O;9?!97%Xd)@6tjAqVMw$SiBtDpOlI9YVwb zG)yyL|40%PNqL-)L%JX>G13%?|42z-o*VbZlZ(~dHe|B^Y}ANE4u&%1P>6xIaUTqW zUsE#7V!~-#8Xh45XQaSxzj+Jp-0r+}tMyjjXm#h_<0sFV5m?*6QP=Qi2Y1l}2txdX z@)+BbT^!temjQI1U35Necbmj(hI{5Vpa+7vaj4461sGuUX_N`!5ghiR&jic>y+W>s z6;itd+_43mbQe?ONFs?xO+jRChZy>af{7ByJ{OTIJy8gAK)l!ut<1UupEAWkV4KD~ zM(ini#Na?$>>(P0G+t}F*)ukYmTaz)seft|3%*PayhBt8rC3VaUCB3LipUMZ0CZ3x zL9Un^Bk>7DrP!h4Ke~@pm-?WIoNFw`tVf<&qqLJ&DOhOH1h?3ou>4X!3v=$iY&;$?k5oI~^;O2P?+22TRokY%5 zXC#JlVkP8^0Fr!^=JFZZ-2v^})u++ZFuK)sZ0A~wPj0~W>Gi|)g8_!IV6LYmVt^Pa*-LFc3(3TBS1A-=*( zD3)YrPE=fQGH{+DEze5=ByZ5~4G%&^$jGE96Guq2o{xku7&fv|ual^0g;Dj&x^W5< z4MvsW@)dOm>{Eh7QgH@6g*}-(X_xX5LV*A-NC?01bGUD}06R|zh+0rwOU`2@DT0Jf zHiUvlQW?%kvgi-;n)e3)6j&2YNC>GVeFKJof?Lv7WACIR?*?8~C%^+T=wNJU!S|8l zF*0%5w)rLzzW~iFTxt3==~5a9phr1^z% z#zfRF)S}R*tRO))vKCR38%jDteKyIRp>?=Ar52vz4T5aTj^6|bamhs=77YMfkRWBo z!H%V0A-B>^xF8gVmOzc~pi~yqxGM3iVlS{GF;%#Na=i>K9rr4pA=`=b(2bD%!17^S0d2lW>*><2<27?Fe(B zF60u*;l%(Y)rr2S805`R3Q)!?BbKQv5wTW5L#%;CZfBPBg;0%8Pme(NxrMcr4ThVm zYbNsNB^=93yxsu7(E}9BkRV$MegTAh%oZ_8yx8YM0j{7AQX zL-Q^5U-^LhJ&I;h!}$V0shycd2s>zix6?X?%tpvslh7kI2^u$0iM~ZED@iafq?9=GSRD@k@dxI`S!MaYF{|%+2{{ zLxN6SuM6p^vkd^HUC}m58fnQ)EtEH1@)2^WE?|?!XhNY8HNwihM+;C zRNk)Z%WBd0WtZM?{&n}gO`|~nh91scKHsIZ(@JK8a_Wv|)C$Ug<%P7(^#$fyk z3vs&Un}5AKHg9h8Uvv%mD^;7z+aUDLQc-Wzp3;x{LH*j>9eAIM-lmxiD@_ki?(&`q zrt1f$%afJGa;#}VH}M0!d5WlOdd@XAQ@o9raFn^Oith_CimX)U7RxNL;b}Jp(090% zaOmcopX5yy+=;w8c!-D-(1_vq2f5-;uK^@zewmdZ&NujaH2&y%(P*5YmTc*~8I7|s zb-)2O#8*u~0PE4bNA{w2STR&Y2Vn`_h`Tt7y767;5$d9K@|^AZ7ey#@i8v?ISu$z)CmXG@_#m}s0R0M=nie|G*Nk4(Ws{kkpHX9$&Orw42WXX-$WYHRM<)U-4 z7?}py1szUtSwtrZ0hz^vk3RB+p&qAElbA(%cz78&fL1&;h$*L7z7n&~Om#ZSvlvOy ze1PsWGlN*VwmlDoh>ui3%rfwaTp7oFPOL3dYZT?ebNp{qi~E`?(!Es3=!^5|;)wt& zPBV)y=J^EkC`=(SQ;G;DiaAgQdnfqQq64O$n1$mH+!=5)vT{)sjA7BirMZ5*XZ3$bPr&3P9NeEh`AAzT(jcd@99#biA9h=orH6p2G9nAjCC zMB_fZ5b$JdiU>xwDYPN%s!527V0%+8+!=}wGvRl!`dGAM1+S1KB}=49(f>k3eUO61U_AF0eA$#y z7Z>@KhN!`Av_?5qT2at23PBUOTp$~q7C7kTlon>hzhJU_W`-*SETn)Y=#a|R&mH@f zg(ML?G@q070)`YG;lzA8%SS2k8g^Dq@r=HY7u?HV9_I3HM97;KWU_87)?*4e6aaQH z4a*2wWvWEwD4xzFZYap{Q(zNYGn64}id3*fa=<{)qEjdBSVD&g6>%*LtJhbL3aJQ9 zP=m5SC4@!MdHhs-Su?A+Sg#_E{88ea9I+TO*hhzH_2v%C9eD3e%-GT<)UqYy0yc!g zCE*jJG-oFja!L59Ki;6(NA0P2*GFN!%h7uQ8eg_R$n-iu*VO3Hzq1;}q z22-D8GH5}AkQL~u5lD~AyutdQ6E=?<)4k~?nXLwhU62Cw{I=MH28H&NLm%n5ewz|Y z7kT|;r_YU@E{pZ;AhWZ(e|Y@pv4&K05vzv4g{ePmI6dVDiWrD^HG+s|q{254 z#jz|&0l<%;2XG2^rr5?}Ubzxv2=;_6_K82uf{ap?*eZivam1NG1gd0QT)@ezqT4%I zf!W0(dK?r?1{Dwqp76-{aG$ry<<+ek45w6FGl;E8SOkG%DmC#Wne{+Je1eVk4Fp=U zMBv0lZ{T{Nbz(qCx(7F+dJ?oGrQk!q+B-BO3<2w3SU-wH@q)$nj-J6umXb+Co>2N^ z&9(nW$G$!eO+j0;WFaTMzTVdc(TU8LruyAk7H%jQieD&A9Eda+_*5nI%-R;}hasq- zg9w-<)JrLpyTJ!;lzWm)4QrqfTH!ivfoFLj?>h(lDyC$a1pvq?Yv=da_o7a)3K{sp zEOo-FJ;{J!Fw7078}J|&`1deJ)D8*P$FdC3tt*-ZuvONJ5F(cKC`J+9+BkSi9;8R% z7g`IluM$!`&;$qNfj(aB*U{e9HGmaXzt&hVxe=ZQEjWVqycP%`1U^I0`m|9O?+SdV zT+mag2K&ULj4jj;wFXBjOZ>twNPUS9TLB*8Gh0)x^7xIw(m{!_Fu?nYIfPw^dw7W~ z4_;z%HCq{Y*Z0j(Vz+%vmzRKfZJo!>VU1AWgTq5sZaI8dUZ>8p|ZkNNDsARk(Y15Wf3WI z(%N?8#*Nk+t!iyoFI(GO3(AsC_F4E3z%``o{94sE1ocvU=88>R1AWseut-m-iOfV$ z78XbDQ=IR@SfSv~ghA49C(P4_#9JL&DDk!w0YX>>K&QdNhWgsaaMjq$_O`aR8?CO; zZD|38c9y1R$Z=^bWy1cu(F=Jw0CMCc#E?FuSJ2$&Q1%qa_&@}}39ER%%bLA_1W+g< z$I@>R0T=C`4W1vhe9* zYuBMF0&qyN2pSMM$Lo}AJ}IbCWq$V*?<3=lWEdA8VQSaHU&dol*X1JUmX4dZI(RE} zSNHHld1-Z>r4_s`4fwaPGPtYb;{)FI6~MDfgU2-zPeLZ=p{i!+(ZqQ9cnltu1ub?6 z17;)CgOQiMjdK|@9!Fr0co5IdkEjltGB4F=pw=|1NNLGM;cS!YvU(p2+17@MZ*RZV z##@I+eCaexHraW^8`jr-Ti{)n1Mk!v%<*Jg#l#@YZbeh7J)xu!5w=Y+4dm)RO7iBSG&3*mBk99=?SmT zCnu-pT@}Xyf1Z1?;Lc|r^YDa?0lW>1g+RQ9(MWQbXZF5pmq#N$q<1uc+@^h@2Itx) zIpOjmB-Y_Wcq^qaiu4O1MMmW^fe?!)Zeu|)NwKx!^UptLyF$;{%sj6eTxYYvoxMBz zNB2%1J%0N9%f}~37j9JxCrOxBirt63IU35g98w_Yu?s9DGu~;aSa1jL2o{$fUP*uJ zRwu819b%~;>o}+9arrB28`~_S-*ZJ01W^Qd_NCE{S0b{+T(dwk+6S#(2rSS9-!bd* zOECkvNBQ$Xb`Cv5FupHr=2gAmB3wY7r(G)}>b2$)FMud+h^2;Cnx!x-ox-|uip2rgdkG(ks6Mj3oE3j`B>@6ouLa?q%#jAEF!>jY zBr@^*;x0&|ChG4f@!n)!p6(h<2i95}9eBJgrWG~#lHaHEn(+e?2T0XQkvIO-okU61dYLCH)d7n(YL2&rLVw}O%Efrib9 zCsxN8<|W}tB=QF1ruZ1+!FdXcRk*YsYTUODLcwv(zY#3fl{j+Exzy$A3Of@*htPkm zks@wLmARxG>G!glc-3yHg6g^yLD)SrrOqh9?8Q=GebFjN%Wa8Dgu`-HebXlL%6sOp z>B@#(LI762xULKU!$a9+2#o8nU{4g^_$^rxpF}Zjk3u4K({M+L4=IbA3;9yfVou%r zFr>zR@_vHF{;rwT_l=LZrcW&ccwY?6>p@3Z2+oVMS@o&h1o*t7mKXl9a$%j_9Bx!uU?i;TS78w9)CJW>PGoSY3&* zAb%8Stwb8jC^vk#2!zi`)~d6*h}eO(&r4W!cvW3x#SuOy$t7$9ghWR?mu%&S{bZ;D z41Xu1CglQL>&b8^C?HZY)D#0g&LR}w+iRc^f7mMuCcC%4cX*UF5VO3>8;O(q^DHSd zo_0pA+$cxeo|CL6dlthLC6!a$eUMClK zhlI1-7{wOVpm`vy^66?5eFJ9+9eyw*j9Q5$!7$0JQsBIzBq0k)%PYKsAj!-@Bc2_} z+fXuK2u)MuW35fFGMe#7_)$w+4-pVC3(x~{{*h5lePhtFZLwPXMg2f8vojPS3NP+&|5{1xWeJ9gj;gOtT7?H;~2Z4v5#O0x(TE0%KYd-0tN88 z24E3?1ut1s5y{}g@8DJZYep+y$nSij)8lS_Ms?c7AB~c3-5MeFx1KrSmLPyV; zke~^rBLm7!R0u&95h)pHCyUEH(Oqy*`&^VXZ%zmBAa$J(wKJOtSVT>o4us@P#7c%K ztVN|8+Ey}@qWI;gyL|PFj z?#TBjjW!e|BOHJ?9~YEJ=khPHI|bHw-iD)})6=mYI9qnj)q;|T&KrWM_(=`w#6oY9 z{Mv^QX>c-b!7hlQ39?UmRmN2t`{G^oSO7{0jk-Vp7qdF_glDS6UTV5_%>Yf?KCKke z7j4pM#yTV-brNI@n!!G$Fvm}!u!=iHAUGZISOk?xE{)W6OktVK>nsh=qhqLJc9z9# zHl`55SfK>2CRM^L_4W(eq~1d|I4ls#x{xmVnL&|=S}9B8B1Z~=Ur|n7DSn)~!D?}# zQUBES;-=JKySNC5en8JtdJiuwb@fjo&2%^@IRTm25Zr1S)tiYA-Cqk-lV z#c?9jd3c&TF6t&4if`&vmYlmYA&{U?1P%g$bC@M9@40)TvpQGuy=T4}K%6~lW+TUq z`(U%oM!qyQb@QL$fe*=;OSHOldA49ys>o;3#d^O9|MO_1?(Fh3Eg!6)z6X-1VBD7a{YS>R!sI21or_$0i+IcK2BV1;C-!ie{bK z9DC(m$|bc60556EZr-t@)Y2?_`B*iG5ilz^4wr_|uk+BM{RSk(3=s@1DE-&j8_L>3`RZC>yhy*9OTx~1qLHIeU4Eu~uZ+r-1`jf+i}>hPrN zMF(d<3NX`MP5qszRENJH)oJL@)J_+R{=BytstmCNs^8aic&@AZiKc^8Ked|s;YV|i zO_eV^Z0h|2;4(#vrVE5#(?Le1pijNexTS$;{d_*i^{K^C)4AgKY<;U;dhJ~0*Pke; z|E}#7_g%!a(>R55qjbk}KY3N<@>*579v zELuE=$R+rvHcye}LO4#5=5*uvQikMo#USXZ*6T=QS{GKke!ltOLQtA3yszU6I|j7| z<`@2u$frTFTH~(sKbkI{zVRpft3iUxKs-Z&%c^}m|A8s+Bgk4^;Nt+%Nq=vR_?w08 zvZm@iM}_a-&SmYt&H0AnzfJ9rb>5i*mk{{J;r2U2|L1taS^xOnX`oAf-wx>=joRyR zeiN|u(c|lzc`sKl(YN=~*T+VoK*N$XjxHz6n?&dGJAZ;#-Uea8e&6c-ws8EBB&>H+ zkJ9RAE^Ar4_TFvVWu0Gi{wD>@MF5^V_tBu8BMB!im%JaH!+%mH?jqX%;O8!9<`3T0 z#|A%A;Db`&Eo9qyfC8raL2=?keg7F*tp>F}6mfqd{k&GVUVHH;g1~zN6{-*+JK{{y4Zb#edz literal 0 HcmV?d00001 diff --git a/modules/windows/oodialog/winsystem/deskicon.rex b/modules/windows/oodialog/winsystem/deskicon.rex new file mode 100755 index 0000000..7f22caa --- /dev/null +++ b/modules/windows/oodialog/winsystem/deskicon.rex @@ -0,0 +1,99 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*****************************************************************************/ +/* Name: DESKICON.REX */ +/* Type: Open Object Rexx Script */ +/* */ +/* Description: Sample how to create a desktop icon using the AddDesktopIcon */ +/* method from the WindowsProgramManager class */ +/* */ +/* TODO change this to a GUI application by creating a dialog */ +/* that explains what is happening and has push buttons */ +/* to iniate the actions. */ +/* */ +/*****************************************************************************/ + +pm = .WindowsProgramManager~new + +/* Create a shortcut to notepad editor with shortcut key CONTROL+ALT+N. + * The shortcut will be a personal shortcut for the current user. "PERSONAL" + * is the default. + */ +rc = pm~AddDesktopIcon("My Notepad 1","%SystemRoot%\system32\notepad.exe",,,"%HOMEDRIVE%%HOMEPATH%",,,"n") + +if rc then call errorDialog "Error. Could not create the 'My Notepad 1' shortcut." + +/* Create a shortcut to run REXXTRY, use the REXX.ICO icon, working diretory is + * %TEMP%, th argument is REXXTRY, the shortcut key is CTRL+ALT+T. The shortcut + * should be common for all users, but on Vista you can not write to the all + * users area unless you have elevated Administrator pivileges. + */ +parse value SysVersion() with name version +if version >= 6 then do + msg = "The next shortcut is intended to be an 'All Users' shortcut." || '0d0a0d0a'x || - + "But, on Vista you can not write to the 'All Users' area without" || '0d0a'x || - + "elevated privileges. If you run this program with elevated" || '0d0a'x || - + "privileges, then creating an 'All Users' shortcut will succeed," || '0d0a'x || - + "otherwise it will fail. You can choose to create an 'All Users'" || '0d0a'x || - + "shortcut, or a 'Personal' shortcut. (Creating a 'Personal'" || '0d0a'x || - + "shortcut will always succeed.)"|| '0d0a0d0a'x || - + "Create an 'All Users' shortcut?" + + isYes = askDialog(msg) + if isYes then location = "COMMON" + else location = "PERSONAL" +end +else do + location = "COMMON" +end + +rc = pm~AddDesktopIcon("RexxTry","rexx.exe","rexx.ico",0,"%TEMP%",location,"rexxtry","T","MAXIMIZED") + +if rc then call errorDialog "Error. Could not create the 'RexxTry' shortcut." + +/* Create a shortcut to NOTEPAD editor, with the working diretory as c:\temp. + * The shortcut will be a personal shortcut for the current user. + */ +rc = pm~AddDesktopIcon("My Notepad 2","notepad.exe", , ,VALUE( 'TEMP',, 'ENVIRONMENT' ) || '\',"PERSONAL", , ,"MAXIMIZED") + +if rc then call errorDialog "Error. Could not create the 'My Notepad 2' shortcut." + +return 0 + +::requires "winsystm.cls" +::requires "ooDialog.cls" diff --git a/modules/windows/oodialog/winsystem/desktop.rex b/modules/windows/oodialog/winsystem/desktop.rex new file mode 100755 index 0000000..1887b67 --- /dev/null +++ b/modules/windows/oodialog/winsystem/desktop.rex @@ -0,0 +1,66 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: DESKTOP.REX */ +/* Type: Open Object Rexx Script */ +/* */ +/* Description: Sample how to add groups and shortcuts to the desktop */ +/* Creates a group and shortcuts to programs on the windows dektop */ +/* using the WindowsProgramManager class */ +/* */ +/* TODO change this to a GUI application. */ +/* */ +/****************************************************************************/ + +pm = .WindowsProgramManager~new + +pm~AddGroup("My Own Group") +pm~AddItem("My own notepad", "notepad.exe", "NOTEPAD.EXE",0) +pm~AddItem("My own calculator", "calc.exe",,,,1) +pm~AddItem("My own write", "write.exe",,,"c:\") +pm~ShowGroup("My own group", "MAX") +say "press enter to delete the 'My own write' item" +pull +pm~DeleteItem("My own write") + +pm~ShowGroup("My Own Group") +say "press enter to delete the 'My Own Group' group" +pull +pm~DeleteGroup("My Own Group") + +::requires "winsystm.cls" diff --git a/modules/windows/oodialog/winsystem/displayAnyMenu.rex b/modules/windows/oodialog/winsystem/displayAnyMenu.rex new file mode 100755 index 0000000..a2a16ac --- /dev/null +++ b/modules/windows/oodialog/winsystem/displayAnyMenu.rex @@ -0,0 +1,189 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: displayAnyMenu.rex + * Type: Example ooRexx program + * + * Description: Displays the menu hierarchy for a window that the user picks. + * + * The user is prompted for the title of an open, top-level, + * window. This program then parses the details of the menubar + * for that window and displays them graphically. + * + * The example uses a mixture of ooDialog and winsystm. + * + * In addition, the example uses some of the public functions + * provided by the windowsSystem.frm package. That framweowork + * is an example of how to extract common function into a + * package and share that function with any number of ooRexx + * programs. + * + * The table below lists the external functions and classes used in this + * program and shows where to go to examine the source code for them. + * + * External function Source + * --------------------------------------------------- + * RcDialog ooDialog + * errorDialog() ooDialog + * askDialog() ooDialog + * infoDialog() ooDialog + * MenuDetailer windowsSystem.frm + * findTheWindow() windowsSystem.frm + */ + +sd = locate() +.application~useGlobalConstDir("O", sd"winSystemDlgs.h") + +-- Prompt the user for a window title +dlg = .UserPrompt~new(sd"winSystemDlgs.rc", IDD_USER_PROMPT) + +if dlg~initCode <> 0 then do + msg = "Error initializing the UserPrompt dialog." || '0d0a0d0a'x || - + "The dislplayAnyMenu example will have to quit." + j = errorDialog(msg) + return 99 +end + +-- A return of 2 means the user canceled, and we will just quit. +if dlg~execute("SHOWTOP") == 2 then return 2 + +-- The UserPrompt dialog validates the data, i.e. it enforces that either a +-- valid WindowObject is obtained, or that the user cancels. Here, we ask the +-- dialog for the window object that the user picked, create a MenuDetailer +-- object using that window object, and then display the menu. + +topWnd = dlg~getUserPick +md = .MenuDetailer~new(topWnd) +md~display + +-- Return 0 for okay +return 0 + +::requires 'windowsSystem.frm' + +/** class UserPrompt + * Our user prompt dialog subclasses the RcDialog. The RcDialog class takes + * care of all the details of the dialog and we just over-ride the ok method + * to take care of validating the user input. We also add a method, + * getUserPick(), which is used to return the window object representing the + * window the user selected. + */ +::class 'UserPrompt' subclass RcDialog inherit AdvancedControls MessageExtensions + +/** ok() + * The over-ride of the ok() method is basically simple. It verifies that the + * user entered something in the edit control and then attempts to contstruct + * a .WindowObject using the text from the edit control as the title of a + * window. + * + * The method will only end the dialog with the 'ok' value if a valid window + * object is constructed. Otherwise it forces the user to either try again, + * or to cancel. + */ +::method ok + expose wnd edit + + -- Get the edit control object and then the text the user entered. We only + -- instantiate the edit control object the first time through. + + if \ edit~isA(.EditControl) then edit = self~newEdit(IDC_EDIT_NAME) + title = edit~getText~strip + + -- Check that the user entered something. + if title~length == 0 then do + msg = "You must enter the title of a window whose menu" || '0d0a'x || - + "you want displayed." || '0d0a0d0a'x || - + "Would you rather cancel?" + if askDialog(msg) then return self~cancel + else return + end + + -- Warn the user that constructing the window object may take a little bit of + -- time. + msg = "It may take a second or two find the window" || '0d0a'x || - + "you picked. Be patient." || '0d0a0d0a'x || - + "This dialog will be disabled during the search." + j = infoDialog(msg) + + -- Disable the dialog so that an impatient user can not fiddle with it. + self~disable + edit~disable + self~disableItem(IDOK) + self~disableItem(IDCANCEL) + + -- The big step, get a window object with the title entered by the user. + wnd = findTheWindow(title) + + -- Re-enable the dialog. + self~enable + edit~enable + self~enableItem(IDOK) + self~enableItem(IDCANCEL) + + -- If we don't have a window object, give the user a chance to try again, or + -- to cancel. If the user does not want to try again, we end the dialog by + -- invoking our cancel() method. + if wnd == .nil then do + msg = "Failed to find the window with title:" || '0d0a'x || - + " " title || '0d0a0d0a'x || - + "The window title has to match exactly." || '0d0a0d0a'x || - + "Try again?" + if askDialog(msg) then return + else return self~cancel + end + + -- Okay, we have a window object. We end the dialog by inoking the superclass + -- ok() method. + return self~ok:super + +/** cancel() + * Just to keep things tidy, if the user cancels, we make sure that wnd is .nil. + * Then if getUserPick() is called, .nil is returned. Presumably, if the user + * cancels, getUserPick() would not be invoked. However, if someone were to + * take this dialog class implementation and extend it, this simple detail might + * be overlooked. + */ +::method cancel + expose wnd + wnd = .nil + return self~cancel:super + +/** getUserPick() Return the window object to the caller */ +::method getUserPick + expose wnd + return wnd diff --git a/modules/windows/oodialog/winsystem/displayWindowTree.rex b/modules/windows/oodialog/winsystem/displayWindowTree.rex new file mode 100755 index 0000000..f9a2c12 --- /dev/null +++ b/modules/windows/oodialog/winsystem/displayWindowTree.rex @@ -0,0 +1,275 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: displayWindowTree.rex + * Type: Example ooRexx program + * + * Description: Allows the user to pick an open top-level window and then + * displays the window hiearchy for that window. The program + * uses both ooDialog and winsystm classes. + * + * This example uses some of the public functions provided by + * the windowsSystem.frm package. That framework contains + * functions shared with other example programs shipped with + * ooRexx that use winsystm.cls. + * + * External function Source + * --------------------------------------------------- + * errorDialog() ooDialog + * getWindowTree() windowsSystem.frm + * showWindowTree() windowsSystem.frm + * + */ + +sd = locate() + +-- Use the global .constDir for symbolic IDs and turn auto detection off. +.application~setDefaults("O", sd"winSystemDlgs.h", .false) + +-- Create and show our ooDialog dialog. The logic of the program is contained +-- within the WindowListDlg class. +dlg = .WindowListDlg~new(sd"winSystemDlgs.rc", IDD_WINDOW_List) +if dlg~initCode == 0 then do + dlg~execute("SHOWTOP") + return 0 +end +else do + msg = "Failed to instantiate the .WindowListDlg object." || '0d0a0d0a'x || - + "Aborting on error." + j = errorDialog(msg) + return 99 +end + + +::requires "windowsSystem.frm" + +::class 'WindowListDlg' public subclass RcDialog + +/** initdialog() + * Initialize the state of our dialog controls. + */ +::method initDialog + expose listView windows inError + + -- If some un-anticipated error happens we will change the behaviour of the + -- dialog. inError is used to flag an error. + inError = .false + + -- Instantiate an array that will be used to hold all the top-level window + -- objects. + windows = .array~new + + -- If we can't get the list view control, something is wrong. + listView = self~newListView(IDC_LV_WINDOWS) + if listView == .nil then return self~putInErrorState("NOLISTVIEW") + + -- The extended list view styles can only be added after the list view control + -- has been created. + -- + -- The FULLROWSELECT style highlights the entire row when row is selected + -- rather than just part of the row. + -- + -- The LABLETIP style will cause a tool-tip like label to appear that displays + -- the entire text of the column, if the text is longer than will fit in the + -- column, when the user puts their mouse over the row. + listView~addExtendedStyle("FULLROWSELECT LABELTIP") + + -- We want to set the width of column 0, (the first column,) to the width of + -- the list view control, minus the width of a scroll bar if there is one. + -- + -- We can find out the width of a scroll bar from the system metrics and can + -- query the width of the list view control directly. + -- + -- Note that the system metric figure is in pixels and the column width needs + -- to be in dialog units. Therefore the width of the scroll bar is more than + -- we actually need, but it is close enough. + parse value listView~getSize with width height + + SM_CXVSCROLL = 20 + width -= SystemMetrics(SM_CXVSCROLL) + + -- Insert our one and only column for the list view control. + listView~insertColumn(0, "Window Title", width) + + -- Connect the push buttons to our event handling methods. + self~connectButton(IDC_PB_SHOW, onShow) + self~connectButton(IDC_PB_QUIT, onQuit) + self~connectButton(IDC_PB_REFRESH, onRefresh) + + -- The logic / code to fill the list view control is in the onRefresh() + -- method. So, we simply invoke the method ourselves to populate the list + -- view. + self~onRefresh + + +/** onRefresh() + * This method contains the logic to populate the list view control with the + * titles of the current top-level windows. The method is connected to the + * Refresh button, so it is invoked when the user pushes that button. + * + * However, it can also be invoked internally to populate the list view. This + * is done when the dialog is initialized, from the initDialog() method. And + * it is also invokde if an invalid window handle is detected in the onShow() + * method. + */ +::method onRefresh + expose listView windows inError + + -- Be sure the windows array is empty + windows~empty + + -- Be sure the list view control is empty + listView~deleteAll + + -- Instantiate a WindowManager object and get the desktop window. + mgr = .WindowsManager~new + deskTop = mgr~desktopWindow + + -- Build an array of all the children windows of the desktop. Skip any window + -- that does not have a title or that is invisible. + child = deskTop~firstChild + do while child <> .nil + if child~title~strip \== "", child~state~caselessWordpos("invisible") == 0 then windows~append(child) + child = child~next + end + + -- If we don't have any windows, something is wrong. + if windows~isEmpty then return self~putInErrorState("NOWINDOWS") + + -- Now, for each window, add a row using the window title as the text for the + -- row. + do wnd over windows + listView~addRow( , , wnd~title) + end + + -- Select the first row, so that we are guaranteed that a row is selected. + -- Note that the row numbers are zero-indexed. + listView~select(0) + + +/** onShow() + * The user pushed the 'Show' button. In the unlikely event that we are in an + * error state we will quit. Otherwise, we will display the window hiearchy of + * the window the user selected. + */ +::method onShow + expose listView inError windows + + if inError then return self~cancel + + -- Get the row number selected. Note that we are guarenteed that a row is + -- selected because we selected a row to begin with and we have provided no + -- way for the user to deselect a row. Because of this we do not have to + -- check for -1. Since the rows are zero-indexed, we add 1 to the selected + -- row number, to produce the index into our array of windows. + wnd = windows[listView~selected + 1] + + -- It is conceivable / possible that the user has closed a window since the + -- time the list view was populated. This can be detected because the window + -- state will be 'Illegal Handle.' + if wnd~state == "Illegal Handle" then return self~badHandle + + -- Display the window hierarchy of the selected window. + tree = getWindowTree(wnd) + success = showWindowTree(tree) + + +/** onQuit() + * The user pushed the 'Quit' button. This is easy, just quit the dialog. + */ +::method onQuit + return self~cancel + + +/** badHandle() + * This private method is invoked when the user picks a window that has been + * closed since the list view was originally populated. We tell the user the + * problem and refresh the list view. + */ +::method badHandle private + expose listView + + -- Get the text of the selected item to use in the error message. + title = listView~itemText(listView~selected) + + msg = "The window you selected appears to have been closed." || '0d0a0d0a'x || - + "Window title:" title || '0d0a0d0a'x || - + "The window list is being refreshed. Select a new window." + j = infoDialog(msg) + self~onRefresh + return 0 + + +/** putInErrorState() + * This private method is used when some un-recoverable error is detected. + * + * It displays an error message to the user based on the reason for the error, + * sets the error state flag, and tries to disable the Show push button. + */ +::method putInErrorState private + expose inError + use strict arg reason + + inError = .true + select + when reason == "NOWINDOWS" then do + msg = "For some reason no top-level windows were located." || '0d0a'x || - + "This is not correct, the sample program is not" || '0d0a'x || - + "executing correctly." + end + when reason == "NOLISTVIEW" then do + msg = "An internal error is preventing this sample program" || '0d0a'x || - + "from executing correctly. The ListControl object" || '0d0a'x || - + "could not be obtained." + end + otherwise do + msg = "The sample program is not executing correctly," || '0d0a'x || - + "some unknown error." + end + end + -- End select + + msg = msg || '0d0a0d0a'x || "Please just quit." + j = errorDialog(msg) + + -- We will try to disable the 'Show' push button. But, if the dialog is not + -- working correctly, it could be that this won't work. + pb = self~newPushButton(IDC_PB_SHOW) + if pb <> .nil then pb~disable + + return 0 diff --git a/modules/windows/oodialog/winsystem/eventlog.rex b/modules/windows/oodialog/winsystem/eventlog.rex new file mode 100755 index 0000000..f387689 --- /dev/null +++ b/modules/windows/oodialog/winsystem/eventlog.rex @@ -0,0 +1,529 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: eventlog.rex */ +/* Type: Open Object Rexx Script */ +/* */ +/* Description: Example of how to use the WindowsEventLog class */ +/* */ +/****************************************************************************/ + +/* main program */ + +log = .WindowsEventLog~new + +/******************************************************************************/ +say "==============================================================================" +say " Display some basic attibutes of a WindowsEventLog object. Consult the" +say " documentation for an explanation of the meaning of these attributes." +say +/******************************************************************************/ +say " Events attribute: " log~events +say " Current minimum read buffer size:" log~minimumReadBuffer "bytes" +say " Current minimum read buffer size:" log~minimumRead "KBs" +say " Minimum read buffer range: " log~minimumReadMin "KBs to" log~minimumReadMax "KBs" +say + +/******************************************************************************/ +say "==============================================================================" +say " Open each event log on this computer and display information about the" +say " log. Then close the log." +say +/******************************************************************************/ +logNames = .array~new +ret = log~getLogNames(logNames) + +if ret == 0 then do name over logNames + ret = log~open( , name) + + if ret == 0 then do + say " Event log: " name + say " Total records: " log~getNumber + say " First record number" log~getFirst + say " Last record number " log~getLast + say " Log is full? " logicalToText(log~isFull) + log~close + end + else do + say " Error opening the" name "event log rc:" ret + end + say +end + + +/******************************************************************************/ +say "==============================================================================" +say "Going to read the 3 oldest records in the Application event Log," +say "oldest first. The log is not opened before reading. The open and" +say "close are done implicitly." +/******************************************************************************/ +ok = doPause(.false) + +count = 0 + +if log~getNumber < 3 then do + say "To few records ("log~getNumber") for this demonstration." +end +else do + -- If the user has set the overwrite option for the event log, the first + -- record is not always 1. FORWARDS is the default. + firstRec = log~getFirst + ret = log~readRecords( , , , firstRec, 3) + + if ret == 0 then do + count = displayRecords(log~events) + end + else do + say "Error reading the Application event log rc:" ret + end +end + +say "==========================================================================" +say count "records read" +say + +/******************************************************************************/ +say "==========================================================================" +say "Going to read the 3 most recent records in the System event Log, the" +say "most recent first. The log is not opened before reading. The open" +say "and close are done implicitly." +/******************************************************************************/ +ok = doPause(.false) + +count = 0 + +if log~getNumber("", "System") < 3 then do + say "To few records (" || log~getNumber("", "System") || ") for this demonstration." +end +else do + -- If the user has set the overwrite option for the event log, the most recent + -- record is not always the same as the record number. + lastRec = log~getLast( , "System") + ret = log~readRecords("BACKWARDS", , "System", lastRec, 3) + + if ret == 0 then do + count = displayRecords(log~events) + end + else do + say "Error reading the System event log rc:" ret + end +end + +say "==========================================================================" +say count "records read" +say + +/******************************************************************************/ +say "==========================================================================" +say "Going to read the 3 oldest records in the System event Log, in reverse" +say "chronological older. The log is opened before any operation, then" +say "closed when all operations are done. This allows specifying the log" +say "name only once." +/******************************************************************************/ +ok = doPause(.false) + +count = 0 + +ret = log~open("", "System") + +if ret == 0 then do + totalRecs = log~getNumber + + if totalRecs < 3 then do + say "To few records (" || totalRecs || ") for this demonstration." + end + else do + -- If the user has set the overwrite option for the event log, the first + -- record is not always number 1. + firstRec = log~getFirst + + -- Now calculate the record number we are going to start at. + startRec = firstRec + 3 - 1 -- Same as firstRec + 2 of course. + + ret = log~readRecords("BACKWARDS", , , startRec, 3) + + if ret == 0 then do + count = displayRecords(log~events) + end + else do + say "Error reading the System event log rc:" ret + end + end +end +else do + say "Error opening the System event log rc:" ret +end + +-- It is always safe to invoke the close() method. If no log is open, then the +-- method does nothing. +log~close + +say "==========================================================================" +say count "records read" +say + + +/******************************************************************************/ +say "==========================================================================" +say "Going to read the complete Security event log forwards. If there are" +say "a log of records, this will produce substantial output. You can cancel" +say "if you wish." +/******************************************************************************/ +ok = doPause(.true) +count = 0 + +if ok then do + + ret = log~readRecords("FORWARDS", , "Security") + select + when when ret == 0 & log~events~items == 0 then do + -- On many systems the security log is empty. + say "The Security event log has no event records." + end + + when ret <> 0 then do + say "Error reading the Security event log rc:" ret + end + + otherwise do + count = displayRecords(log~events) + end + end + -- End select +end +else do + say "Skipping this demonstartion." +end + +say "==========================================================================" +say count "records read" +say + + +/******************************************************************************/ +say "==========================================================================" +say "Going to read the complete System event log in reverse chronological" +say "order. If there are a lot of records, this will produce substantial" +say "output. You can cancel if you wish." +/******************************************************************************/ +ok = doPause(.true) +count = 0 + +if ok then do + + ret = log~readRecords("BACKWARDS", , "System") + select + when when ret == 0 & log~events~items == 0 then do + say "The System event log has no event records." + end + + when ret <> 0 then do + say "Error reading the System event log rc:" ret + end + + otherwise do + count = displayRecords(log~events) + end + end + -- End select +end +else do + say "Skipping this demonstartion." +end + +say "==========================================================================" +say count "records read" +say + + +/******************************************************************************/ +say "==========================================================================" +say "Going to write some records to the Application event log." +say "You can skip this step if you do not want records added to" +say "your Application event log." + +/* Some notes on how the event logging service works. Typically, applications + that want to write records to one of the event logs, add entries to the + registry. These registry entries control how the event logging service + handles the writing of a record. + + The registry entries are written to subkeys under the Event log service. + + If an application has not added the registry entries, then the event records + are *always* written to the Application log. This can not be over-ridden. + + So, say there is an application, MyApplication that wants to write a record + using the source name of MyApplication to an event log. To do that the + source name must be a subkey of a logfile entry under the EventLog key in the + registry. + + If MyApplication should be written to the System log the registry key must + be added like this: + + HKEY_LOCAL_MACHINE + System + CurrentControlSet + Services + EventLog + System + MyApplication + Security + System + + If the key does not exists, the Application event log is always used. +*/ + +/******************************************************************************/ +ok = doPause(.true) + +if ok then do + source = "MyLog" + type = 4 -- Information + category = 22 + id = 33 + binaryData = "01 1a ff 4b 0C"x + + ret = log~write( , source, type, category, id, binaryData, "String1", "sTring2") + if ret == 0 then + say "Record" source "successfully written" + else + say "Error writing record" source "rc:" ret + + -- The default type for writing a record is 'Error' This might look a little + -- scary to a user, so we will use Information for the type. + type = 4 -- Information + + ret = log~write(, "Application2", type,,, "1A 1B 1C 0000 00"x, "First String", "Second String") + if ret == 0 then + say "Record Application2 successfully written" + else + say "Error writing record Application2 rc:" ret + + ret = log~write(, "Security1", type,,,"1A1B1C000000"x, "Tom", "John", "Larry", "Frank") + if ret == 0 then + say "Record Security1 successfully written" + else + say "Error writing record Security1 rc:" ret + + ret = log~write(,"Security2", type,,,"04 03 01 1B 1C 00 FF 00 FE 00 FD"x, "One", "Two") + if ret == 0 then + say "Record Security2 successfully written" + else + say "Error writing record Security2 rc:" ret + + ret = log~write(, "System1", type,,,"1A 1B 1C 00 00 00"x, "1", "2", "3", "4") + if ret == 0 then + say "Record System1 successfully written" + else + say "Error writing record System1 rc:" ret + + ret = log~write(, "System2", type,,,"1A1B1C000000"x, "House", "Apartment") + if ret == 0 then + say "Record System2 successfully written" + else + say "Error writing record System2 rc:" ret + + ret = log~write(, "NotRegisteredAppliaction1", type,,,"1A1B1C0000FF00"x, "Cat", "Dog", "Rabbit") + if ret == 0 then + say "Record NotRegisteredAppliaction1 successfully written" + else + say "Error writing record NotRegisteredAppliaction1 rc:" ret + + rawData = "4d 61 72 6b 20 4d 69 65 73 66 65 6c 64 0d 0a"x + ret = log~write(, "NotRegisteredAppliaction2", type,,, rawData, "ooRexx", "example") + if ret == 0 then + say "Record NotRegisteredAppliaction2 successfully written " + else + say "Error writing record NotRegisteredAppliaction2 rc:" ret +end +else do + say "Skipping this demonstartion." +end + +say "==========================================================================" +say + + +/******************************************************************************/ +say "==============================================================================" +say "The next and last demonstration will clear the Application event log." +/******************************************************************************/ + +backupFile = getWriteableFileName() + +if backupFile == "" then do + say "Could not determine with certainty a writeable location for a backup file." + say "You may want to skip this demonstration, the log will not be backed up." +end +else do + say "The log will first be backed up to this file:" + say " " backupFile +end + +say +say "You can skip this step if you do not want to clear" +say "your Application event log." +say +say "If this is the first time you ran this example, you" +say "may want to skip this test so that you can see the" +say "records written to the log in the previous demonstration." +say "(If you elected to write any records.)" +say +say "If you previously ran this example and saved the Application" +say "log, you may want to move the back up file to a different" +say "location. The same back up file name is used each time the" +say "example executes." + +ok = doPause(.true) +if ok then do + if backupFile \== "" then ret = log~clear(, , backupFile) + else ret = log~clear + + if ret == 0 then say "The Application event log was cleared successfully." + else say "Error clearing the Application event log rc:" ret +end + +return 0 /* leave program */ + +::requires "winsystm.cls" + +/* Routine to display the event log records */ +::routine displayRecords + use strict arg records + + say records~items "records read" + + do record over records + say "==========================================================================" + parse var record type date time "'" sourcename"'" id userid computer "'" string "'" "'" data "'" + say 'Type : 'type + say 'Date : 'date + say 'Time : 'time + say 'Source : 'sourcename + say 'ID : 'id + say 'UserId : 'userid + say 'Computer : 'computer + say 'Detail : 'string + say 'Data : 'data + end + +return records~items + +/* Simple routine to do a logical into text */ +::routine logicalToText + use strict arg logical + if logical then return "True" + else return "False" + +/* Simple routine to pause the program */ +::routine doPause + use arg confirm + + say + if confirm then do + say "Continue? (y/n)" + parse lower pull answer + ok = (answer~left(1) == 'y') + end + else do + say "Press Enter to continue" + pull + ok = .true + end + say + +return ok + +::routine getWriteableFileName + + -- Find this user's Documents directory, surely that is writeable. + + shell = .oleObject~new('Shell.Application') + folderConstant = '5'~x2d() + folderObj = shell~nameSpace(folderConstant) + folderItem = folderObj~self + documentsFolder = folderItem~path + + backupFile = "" + + -- Check that we got a good directory + if SysIsFileDirectory(documentsFolder) then do + -- Unfortunately, we can not use a network mapped drive and it is not + -- uncommon for people to have their My Documents directory on a network + -- share. + drv = documentsFolder~left(2) + if SysDriveMap(drv, "REMOTE")~caselessWordPos(drv) == 0 then do + backupFile = documentsFolder || '\applicationBackup_01.evt' + end + end + + if backupFile == "" then do + -- Keep looking, see if we can write to the current directory. + currentDir = directory() + if canWriteToDir(currentDir) then do + backupFile = currentDir || "\applicationBackup_01.evt" + end + else do + -- As a last resort, try the temp directory + tempDir = value("TEMP", , 'ENVIRONMENT') + if canWriteToDir(tempDir) then do + backupFile = tempDir || "\applicationBackup_01.evt" + end + end + end + +return backupFile + +::routine canWriteToDir + use strict arg dir + + tmpFile = dir || '\' || "tmpFileWriteTest.deleteMe" + + -- Write to the file, close it, test it, delete it. + j = lineout(tmpFile, "Delete this file if you find it") + j = lineout(tmpFile) + if SysIsFile(tmpFile) then do + answer = .true + end + else do + answer = .false + end + + 'del /F /Q' tmpFile '1>nul 2>&1' + +return answer diff --git a/modules/windows/oodialog/winsystem/getTheWindow.rex b/modules/windows/oodialog/winsystem/getTheWindow.rex new file mode 100755 index 0000000..a30f5aa --- /dev/null +++ b/modules/windows/oodialog/winsystem/getTheWindow.rex @@ -0,0 +1,199 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: getTheWindow.rex + * Type: Example ooRexx program + * + * Description: This example shows how to find a window without using the + * exact window title. + * + * The WindowsManager class provides the find() method to get a + * top-level window using its title. But, you need to use the + * exact title. This example uses a method of the + * WindowsManager, desktopWindow(), that is available in ooRexx + * 4.0.0 and later. Once you get the desktop window, you can + * enumerate all its children windows and compare their titles + * in a custom matching function. + * + */ +say +say +say 'This sample program will find an open top-level window' +say 'using a substring of the window title. Case does not' +say 'matter.' +say +say 'Enter part of the title of the window you want found' +.stdout~charout(" Substring: ") +parse pull text + +-- Instantiate a WindowManager object and get the desktop window. +mgr = .WindowsManager~new +deskTop = mgr~desktopWindow + +say +say +say 'First some information about the desktop window:' +say 'Desktop: ' desktop +say ' Class: ' deskTop~wClass +say ' Position:' deskTop~coordinates +say +say + +text = text~strip +if text == "" then do + say 'Sorry the empty string is not going to work.' + say 'Try again when you are serious about finding' + say 'a window.' + say + return 99 +end + +-- This function is where the real work is done. +wnd = fuzzyFindWindow(deskTop, text) + +if wnd <> .nil then do + say 'Found your window.' + say ' Title: ' wnd~title + say ' Class: ' wnd~wClass + say ' Position:' wnd~coordinates + say ' Styles: ' wnd~getStyle +end +else do + say 'Could not find your window' + say ' Are you sure' text 'is a substring' + say ' of the window title?' +end + +-- fuzzyFindWindow() returns the first matching window. We'll use another, +-- similar, function to get all matching windows. +say +say +say 'This is a similar exercise, but will find all matching' +say 'windows, using a substring of the window title.' +say +say 'Enter part of the title of the window(s) you want found' +.stdout~charout(" Substring: ") +parse pull text +say +say + +text = text~strip +if text == "" then do + say 'Sorry the empty string is not going to work.' + say 'Try again when you are serious about finding' + say 'a window.' + say + return 99 +end + +-- This function will return an array with all matching windows. An empty array +-- signals no match. +windows = fuzzyFindWindows(deskTop, text) + +if windows~items > 0 then do wnd over windows + say 'Found this window.' + say ' Title: ' wnd~title + say ' Class: ' wnd~wClass + say ' Position:' wnd~coordinates + say ' Styles: ' wnd~getStyle + say +end +else do + say 'Could not find any matching windows.' + say ' Are you sure' text 'is a substring' + say ' of some open window title?' +end +say + +return 0 + +::requires 'winsystm.cls' + +/** fuzzyFindWindow() + * Searches the desktop children window for a window whose title contains the + * text specified. + * + * @param desktopWnd The desktop window object. + * @param text The text to look for, case is not significant. + * + * @return The window object if a window is found, otherwise .nil. + * + * @note Although in this program, only the desktop window is used, the + * function itself would work for any window. + */ +::routine fuzzyFindWindow + use strict arg deskTopWnd, text + + -- Set up the default return. + wnd = .nil + + -- Starting with the first child window, look at each window's title and see + -- if it contains the specified text. The first match found is returned. + child = deskTopWnd~firstChild + do while child <> .nil + title = child~title + if title~caselessPos(text) <> 0 then do + wnd = child + leave + end + + child = child~next + end + +return wnd + +/** fuzzyFindWindows() + * This is the exact same function as the above, except it returns an array of + * all the windows that contain the specified text. + */ +::routine fuzzyFindWindows + use strict arg deskTopWnd, text + + -- Set up the default return. + w = .array~new + + -- Starting with the first child window, look at each window's title and see + -- if it contains the specified text. Add each matching window to the array. + child = deskTopWnd~firstChild + do while child <> .nil + title = child~title + if title~caselessPos(text) <> 0 then w~append(child) + child = child~next + end + +return w diff --git a/modules/windows/oodialog/winsystem/menuCalc.rex b/modules/windows/oodialog/winsystem/menuCalc.rex new file mode 100755 index 0000000..43b1012 --- /dev/null +++ b/modules/windows/oodialog/winsystem/menuCalc.rex @@ -0,0 +1,183 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: menuCalc.rex + * Type: Example ooRexx program + * + * Description: Displays the menu hierarchy of the Windows Calculator + * application. The menu hierachy for both the Calculator's + * standard view and its scientific view are printed to the + * console. + * + * This is a very simple program so that it is easeier to see + * the details. + * + * The example uses a mixture of ooDialog and winsystm. + * + * In addition, the example uses some of the public functions + * provided by the windowsSystem.frm package. That framweowork + * is an example of how to extract common function into a + * package and share that function with any number of ooRexx + * programs. + * + * The below table lists the external functions and classes used in this + * program and shows where to go to examine the source code for them. + * + * External function Source + * --------------------------------------------------- + * getPathToSystemExe() windowsSystem.frm + * errorDialog() ooDialog + * findTheWindow() windowsSystem.frm + * MenuDetailer windowsSystem.frm + */ + + +-- Get the complete path to the calculator application to be sure we start the +-- the program we want. +calcExe = getPathToSystemExe("calc.exe") + +-- If we could not get the complete path, just quit. +if calcExe == .nil then do + msg = "Faild to locate a definitive path to the Windows" || '0d0a'x || - + "Calculator application. This sample can not execute." + return errorDialog(msg) +end + +-- This will start the calculator application as a separate process. +"start" calcExe + +-- Get the calculator window object, quit if that fails. +calcWnd = getCalcWindow() +if calcWnd == .nil then return 99 + +-- First, display the menu for the 'Standard' view. The calculator application +-- may already be in the standard view. But, if it is not, we will first switch +-- to that view. +-- +-- When the calculator program switches views, it actually creates a whole new +-- dialog window. Because of that, if we do switch views we need to re-find the +-- window. +-- +-- The way we switch to Standard view is to simulator clicking on the View menu, +-- and then clicking the Standard menu item. + +if \ inStandardView(calcWnd) then do + calcWnd~ProcessMenuCommand("&View","S&tandard") + calcWnd = getCalcWindow() + if calcWnd == .nil then return 99 +end + +-- To print the menu, we instantiate a MenuDetailer object using the Calculator +-- window object. Then we tell the menu detailer object to 'print.' Printing +-- sends the output to the console. + +say; say "Printing the Calculator's Standard View menu" +menuDetail = .MenuDetailer~new(calcWnd) +menuDetail~print + +-- Switch to the Scientific view and print that menu. Switching to Scientific +-- view is done as above, we simulate clicking on the Scientific menut item. +-- +-- When we switch views we need to re-find the window and likewise we will need +-- a new MenuDetailer object. + +calcWnd~ProcessMenuCommand("&View","&Scientific") +calcWnd = getCalcWindow() +if calcWnd == .nil then return 99 + +say; say; say "Printing the Calculator's Scientific View menu" +menuDetail = .MenuDetailer~new(calcWnd) +menuDetail~print + +-- Now close the Calculator by simulating clicking on the System menu, and then +-- clicking the Close menu item. +calcWnd~SendSysCommand("Close") + +return 0 + +::requires 'windowsSystem.frm' + +/** getCalcWindow() + * A simple helper routine. We need to find and re-find the calculator window + * several times. Each time we need to check for .nil and notify the user if + * there is an error. + * + * The same steps, repeated more than once, is a good signal to put the code + * into its own routine (or own method when using objects.) + */ +::routine getCalcWindow + + calcWnd = findTheWindow("Calculator") + if calcWnd == .nil then do + msg = "Could not find the Calculator application window." || '0d0a0d0a'x || - + "This sample with have to abort." + j = errorDialog(msg) + end +return calcWnd + +/** inStandardView() + * Another simple helper routine. + * + * This tests if the calculator is in standard view by seeing if the menu item + * for standard view is checked. + * + * Note that this one line is sufficient for the test: + * + * return calc~menu~submenu(1)~isChecked(0) + * + * But, it is always possible that getting a menu or submenu will fail and + * return .nil. For that reason, and to make it a little easier to see what + * the steps are, the test is in several steps. + * + * Note that the submenu and the menu item are obtained by position and the + * position index is zero-based. + */ +::routine inStandardView + use strict arg calc + + menuBar = calc~menu + if menuBar <> .nil then do + viewMenu = menuBar~subMenu(1) + + if viewMenu <> .nil then do + return viewMenu~isChecked(0) + end + end + +-- If we had an error, just return false. +return .false diff --git a/modules/windows/oodialog/winsystem/menuNotepad.rex b/modules/windows/oodialog/winsystem/menuNotepad.rex new file mode 100755 index 0000000..ecee394 --- /dev/null +++ b/modules/windows/oodialog/winsystem/menuNotepad.rex @@ -0,0 +1,109 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: menuNotepad.rex + * Type: Example ooRexx program + * + * Description: This example displays the hierarchy of the Notepad menu. + * + * The MenuObject class in winsystm.cls allows you to work with + * the menus in a Windows window. You can do things like + * simulate a user selecting a menu item. This in turn allows + * you to 'remote control' a window. However in order to + * simulate selecting a menu item you need to know either its + * text or its id. These items can be difficult to learn + * becuase often times a menu item's text has hidden characters + * in it and the id of menu items are usually only known by the + * application developer. + * + * This examle shows how to use the MenuObject to discover the + * text and id numbers of any item in the Notepad menu. + * + * The example uses some of the public functions provided by + * the windowsSystem.frm package. That framework contains + * functions shared with other example programs shipped with + * ooRexx that use winsystm.cls. + * + * This example does not have much comment. To understand more + * of the details of starting and closing Notepad automatically, + * take a closer look at the writeWithNotepad.rex example. + * + * External function Source + * --------------------------------------------------- + * getPathToSystemExe() windowsSystem.frm + * errorDialog() ooDialog + * findTheWindow() windowsSystem.frm + * MenuDetailer windowsSystem.frm + * + * The external functions used by this program allow you to read through the + * code here and get the over-all picture of how the program works. To + * understand the finer details, you will need to look at the implementation + * of the external functions contained in windowsSystem.frm. + */ + +notepadExe = getPathToSystemExe("notepad.exe") + +if notepadExe == .nil then do + msg = "Faild to locate a definitive path to the Windows" || '0d0a'x || - + "Notepad application. This sample can not execute." + return errorDialog(msg) +end + +"start" notepadExe + +np = findTheWindow("Untitled - Notepad") +if np == .nil then do + msg = "Could not find the Notepad application window." || '0d0a0d0a'x || - + "This sample with have to abort." + return errorDialog(msg) +end + +-- To really understand how the MenuDetailer class works, take a look at its +-- implementation in windowsSystem.frm. + +-- The MenuDetailer can either print or display the menu hierarchy. Here we do +-- both. print() shows the hierarchy on the console in text format. display() +-- shows it in a graphical dialog. +md = .MenuDetailer~new(np) +md~print +md~display + +-- Close the Notepad window. +np~SendSysCommand("Close") + +::requires 'windowsSystem.frm' diff --git a/modules/windows/oodialog/winsystem/quickCalc.rex b/modules/windows/oodialog/winsystem/quickCalc.rex new file mode 100755 index 0000000..2936c9d --- /dev/null +++ b/modules/windows/oodialog/winsystem/quickCalc.rex @@ -0,0 +1,221 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: menuCalc.rex + * Type: Example ooRexx program + * + * Description: Demonstrates how to control an application programmatically + * using the winsystm classes. Does some simple calculations + * using the Windows Calculator application. + * + * This program is similar to userwmgr.rex but more simple to + * better show what is going on. + * + * This example uses some of the public functions provided by + * the windowsSystem.frm package. That framweowork is an + * example of how to extract common function into a package and + * share that function with any number of ooRexx programs. + * + * To really understand how this program works, you will need to examine the + * the code for the external functions in windowsSystem.frm. + * + * The table below lists the external functions and classes used in this + * program and shows where to go to examine the source code for them. + * + * External function Source + * --------------------------------------------------- + * errorDialog() ooDialog + * infoDialog() ooDialog + * getPathToSystemExec() windowsSystem.frm + * findTheWindow() windowsSystem.frm + */ + +-- Get the complete path to the calculator executable. This ensures we start +-- the correct application. +calcExe = getPathToSystemExe("calc.exe") + +-- Abort if we have an error. +if calcExe == .nil then do + msg = "Faild to locate a definitive path to the Windows" || '0d0a'x || - + "Calculator application. This sample can not execute." + return errorDialog(msg) +end + +-- Start calculator as a separate process. +"start" calcExe + +-- It takes some finite period of time for an application to start. This can +-- vary substantially depending on the system load. findTheWindow() allows for +-- this, but will eventually time out if the window can not be located. +calc = findTheWindow("Calculator") +if calc == .nil then do + msg = "Could not find the Calculator application window." || '0d0a0d0a'x || - + "This example program will have to abort." + return errorDialog(msg) +end + +-- Make the calculator the top-most window. +calc~ToForeground + +/* Each button in a dialog has a resource ID. When the button is pushed or + * clicked, the button sends a command (WM_COMMAND) notification to its parent + * window. The command notification contains the resource ID of the button that + * was pushed. This is how the dialog knows what button(s) the user pushes or + * clicks. + * + * We can simulate a user pushing buttons by sending commands to the dialog + * using the resource ID of the button we want pushed. Here we define variables + * with the IDs of some of the buttons in the calculator application. You can + * verify that these are the correct ID numbers by exploring the window hiearchy + * of the calculator application using the displayWindowTree.rex example program + * that is included with the ooRexx distribution. + */ + +divide = 90 +multiply = 91 +plus = 92 +minus = 93 +equals = 112 + +clear = 81 +memClear = 113 +memReturn = 114 +memSave = 115 + +zero = 124 +one = 125 +two = 126 +three = 127 +four = 128 +five = 129 +six = 130 +seven = 131 +eight = 132 +nine = 133 + +-- We also want to get a WindowObject that represents the answer field in the +-- calculator application so that we can get the answer. It so happens that +-- this is the first child window of the calculator. +answerField = calc~firstChild + +-- Check that we got the right window, abort on error. The answer field is a +-- window whose class is EDIT. +if \ answerField~isA(.WindowObject) | answerField~wClass \== "Edit" then do + msg = "Failed to locate the answer field in the Calculator application." || '0d0a0d0a'x || - + "This example program will have to abort." + j = errorDialog(msg) + + -- Try to close the calculator application, although we may be hosed and this + -- won't work. + calc~sendSysCommand("Close") + return 99 +end + +-- We will calculate 10 * 16. After each button push we will pause a bit so +-- that the user can see the numbers appear on the calculator. Then we will get +-- the answer and display a message box showing the whole thing. This starts +-- our message. +msg = "10 * 16 =" + +calc~sendCommand(one) +j = SysSleep(.5) +calc~sendCommand(zero) +j = SysSleep(.5) +calc~sendCommand(multiply) +j = SysSleep(.5) +calc~sendCommand(one) +j = SysSleep(.5) +calc~sendCommand(six) +j = SysSleep(.5) +calc~sendCommand(equals) +j = SysSleep(.5) + +-- Now get the answer. The 'title' of a window is the text of the window. In +-- this case the 'title' of the answer field window is the answer of the +-- calculation. +msg = msg answerField~title +j = infoDialog(msg) + +-- Push the clear button +calc~sendCommand(clear) + +-- Do one more calculation. +msg = "(5 + 5) * 16 / (2 + 1) =" + +calc~sendCommand(memClear) + +calc~sendCommand(two) +j = SysSleep(.5) +calc~sendCommand(plus) +j = SysSleep(.5) +calc~sendCommand(one) +j = SysSleep(.5) +calc~sendCommand(equals) +j = SysSleep(.5) + +calc~sendCommand(memSave) + +calc~sendCommand(five) +j = SysSleep(.5) +calc~sendCommand(plus) +j = SysSleep(.5) +calc~sendCommand(five) +j = SysSleep(.5) +calc~sendCommand(equals) +j = SysSleep(.5) +calc~sendCommand(multiply) +j = SysSleep(.5) +calc~sendCommand(one) +j = SysSleep(.5) +calc~sendCommand(six) +j = SysSleep(.5) +calc~sendCommand(equals) +j = SysSleep(.5) + +calc~sendCommand(divide) +calc~sendCommand(memReturn) +calc~sendCommand(equals) + +-- Now get the answer. +msg = msg answerField~title +j = infoDialog(msg) + +-- Close the calculator by pressing Close in the system menu. +calc~sendSysCommand("Close") + +::requires 'windowsSystem.frm' diff --git a/modules/windows/oodialog/winsystem/quickShowAllMenus.rex b/modules/windows/oodialog/winsystem/quickShowAllMenus.rex new file mode 100755 index 0000000..492b761 --- /dev/null +++ b/modules/windows/oodialog/winsystem/quickShowAllMenus.rex @@ -0,0 +1,94 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: quickShowAllMenus.rex + * Type: Example ooRexx program + * + * Description: The main purpose of this example is to demonstrate how you + * can quickly put together an ooRexx script that does real + * work once you have a created a package of useful functions. + * + * This program uses the windowsSystem.frm package to print out + * a menu outline of every open window that has a menu. + * + * The below table lists the external functions and classes used in this + * program and shows where to go to examine the source code for them. + * + * External function Source + * --------------------------------------------------- + * MenuDetailer windowsSystem.frm + */ + + -- Instantiate a WindowManager object and get the desktop window. + mgr = .WindowsManager~new + deskTop = mgr~desktopWindow + + -- Instantiate a MenuDetailer object using the desktop window. The desktop + -- window does not have a menu, so we won't bother displaying it. + menuLister = .MenuDetailer~new(desktop) + + -- Keep track of how many windows we found, and how many have a menu. The + -- desktop window has a surprisingly large number of windows that we don't + -- see. + windowCount = 0 + menuCount = 0 + + -- Enumerate all the desktop child windows, printing a menu outline for each + -- window that has a menu. + -- + -- Note this: many up-to-date Windows applications no longer use true menus. + -- Instead they use a number of new Windows controls that give the appearance + -- of menus. These applications do not have a menu to display. + --- + -- Also, some of the menus printed are likely to belong to invisible windows. + child = deskTop~firstChild + do while child <> .nil + windowCount += 1 + if child~menu <> .nil then do + menuCount += 1 + + menuLister~setWindow(child) + menuLister~print + say; say + end + child = child~next + end + + say 'Found' windowCount 'windows, of which' menuCount 'had menus.' + +::requires 'windowsSystem.frm' diff --git a/modules/windows/oodialog/winsystem/registry.rex b/modules/windows/oodialog/winsystem/registry.rex new file mode 100755 index 0000000..71644d3 --- /dev/null +++ b/modules/windows/oodialog/winsystem/registry.rex @@ -0,0 +1,196 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2018 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* Name: REGISTRY.REX */ +/* Type: Open Object Rexx Script */ +/* */ +/* Description: */ +/* This examples demonstrates the use of the WindowsRegistry class to read */ +/* and manipulate the Windows registry */ +/* */ +/****************************************************************************/ + +regeditor = "REGEDIT" + +FileControl = "\control.reg" +FileNewKey = "\testuser.reg" + +r = .WindowsRegistry~new /* create a new registry object */ + +/* r~Current_Key always refers to the most recently opened or created key + and is used if the keyhandle argument is omitted. r~Current_Key is initially + set to HKEY_LOCAL_MACHINE. */ + +/* Open the HKEY_LOCAL_MACHINE\System key. On NT it is not possible to open + this key with ALL access rights */ +if r~open(,"SYSTEM","QUERY WRITE") \= 0 then do + syskey = r~Current_Key + if r~List(,keys.) = 0 then do /* Get a list of System's subkeys */ + bk = r~open(,keys.1||"\Control") /* open System's first subkey's Control key */ + if bk \= 0 then do + + q. = r~Query /* Get and displeay information about the Control key. */ + say "Control is of class" q.class", was last modified" q.date "at" q.time, + || ", has" q.subkeys "subkeys, and" q.values "values." + + if r~List(,vals.) = 0 then /* list all subkeys of Control */ + do i=1 to q.subkeys + say vals.i + end + say "-----" + drop vals. + drop name data type /* these 3 symbols must be uninitialized */ + + /* list all values of the first subkey */ + if r~ListValues(,vals.) = 0 then do i = 1 to q.values + say vals.i.name "=" vals.i.data "("vals.i.type")" + end + /* save HKEY_LOCAL_MACHINE\System\XXX\Control to a file */ + saveret = r~Save(bk,FileControl) + if saveret = 183 then say "The file" FileControl "already exists" + else say "HKEY_LOCAL_MACHINE\System\"keys.1"\Control has been saved to" FileControl + end + r~Close(bk) /* close Control key */ + end + r~Close(syskey) /* close System key */ + say "-----" +end + +/* open the HKEY_LOCAL_MACHINE\SOFTWARE key. */ +if r~open(r~Local_Machine,"SOFTWARE") \= 0 then do + /* Get a list of ...\Software's subkeys */ + kinfo. = r~query /* r~Current_Key is used again */ + say "class name =" kinfo.class + say "subkeys =" kinfo.subkeys + say "values =" kinfo.values + say "date =" kinfo.date + say "time =" kinfo.time + say "-- list --" + if r~List(,keys.) = 0 then do i over keys. + say keys.i + end + say "-----" + r~Close /* close HKEY_LOCAL_MACHINE\SOFTWARE */ +end + +/* create a new subkey under HKEY_CURRENT_USER and modify it */ +savekey = 0 +if r~create(r~Current_User,"TEST_USER") \= 0 then do + + savekey = r~Current_Key /* Current_Key was set to HKEY_CURRENT_USER\TEST_USER */ + r~setvalue(,"","Test User") /* set the default value */ + + /* add other values */ + r~setvalue(,"PROFESSION","Developer") + r~setvalue(,"BIRTHYEAR","1972","NUMBER") /* type NUMBER for numbers */ + r~setvalue(,"LOCATION","EUROPE","EXPAND") + + /* Add multiple zero-terminated strings. The last character must be a 0x as well */ + A_Multi_SZ = "This is the first line" || "0"x || "This is the second line", + || "0"x || "And this is the last line!" || "0"x + r~setvalue(,"ADDITIONAL",A_Multi_SZ,"MULTI") /* use type MULTI */ + ret = RxMessageBox("Explore key \\HKEY_CURRENT_USER\TEST_USER and close RegEdit to continue.",, + "WindowsRegistry", "OK") + regeditor /* start registry editor */ + + /* retrieve the previously added values */ + say "The following entries have been added to the registry:" + st. = r~getvalue(,"") + say "default:" st.data + st. = r~getvalue(,"PROFESSION") + say "PROFESSION:" st.data + st. = r~getvalue(,"BIRTHYEAR") + say "BIRTHYEAR:" st.data "of type" st.type + st. = r~getvalue(,"LOCATION") + say "LOCATION:" st.data + + say "ADDITIONAL:" + st. = r~getvalue(,"ADDITIONAL") + /* that's how a multiple zero terminated string can be processed */ + if st.type = "MULTI" then /* that's what we expect */ + do while st.data~length \= 0 + p = st.data~pos(d2c(0)) /* find hex 0 */ + if p < st.data~length then do + say " " st.data~left(p-1) /* display substring */ + st.data = st.data~substr(p+1) /* remove substring */ + end + else st.data = "" + end + + r~DeleteValue(,"BIRTHYEAR") /* delete a value */ + sk = r~Current_Key + r~create(,"OREXX\DATA1") /* Create a key and a subkey at once */ + /* Create another key + subkey (use previously stored key handle) */ + lk = r~create(sk,"OREXX\DATA2") + if lk \= 0 then r~delete(sk, "OREXX\DATA2") /* Delete subkey DATA2 */ +end + +if savekey \= 0 then do + /* save newly created key TEST_USER to a file */ + saveret = r~Save(savekey,FileNewKey) + if saveret = 183 then say "The file" FileNewKey "already exists" + if saveret = 0 then + say "\\HKEY_CURRENT_USER\TEST_USER has been saved to" FileNewKey + r~close(savekey) + /* It is not possible to delete a key and its subkeys at once, */ + /* so delete the key's subkeys first step by step */ + rc = r~Delete(r~Current_User,"TEST_USER\OREXX\DATA1") + rc = r~Delete(r~Current_User,"TEST_USER\OREXX") + rc = r~Delete(r~Current_User,"TEST_USER") /* and now delete the key */ + + if rc = 0 then do + ret = RxMessageBox("\\HKEY_CURRENT_USER\TEST_USER has been deleted.", + || " Explore and close RegEdit to continue.", "WindowsRegistry", "OK") + regeditor + end + else say "Delete of key TEST_USER failed ("rc")" + if r~create(r~Current_User,"TEST_USER") \= 0 then do /* create key again to restore */ + rc = r~Restore(,FileNewKey) /* restore previously saved key */ + if rc = 0 then do + ret = RxMessageBox("\\HKEY_CURRENT_USER\TEST_USER has been restored.", + || " Explore and close RegEdit to continue.", "WindowsRegistry", "OK") + regeditor + say "Please remove \\HKEY_CURRENT_USER\TEST_USER using" RegEditor + end + else say "Restoring failed ("rc")" + end + say "The files" FileControl "and" FileNewKey "have been created, please delete manually to cleanup." +end + +/* winsystm.cls contains the WindowsRegistry class definition */ +::requires "winsystm.cls" diff --git a/modules/windows/oodialog/winsystem/usewmgr.rex b/modules/windows/oodialog/winsystem/usewmgr.rex new file mode 100755 index 0000000..d658324 --- /dev/null +++ b/modules/windows/oodialog/winsystem/usewmgr.rex @@ -0,0 +1,431 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: usewmgr.rex + * Type: Example ooRexx program + * + * Description: Demonstrates the use of the WindowsManager, the WindowObject, + * and the WindowsClipboard classes. Has some examples of + * ooDialog usage. + * + * This example uses some of the public functions provided by + * the windowsSystem.frm package. That framework contains + * functions shared with other example programs shipped with + * ooRexx that use winsystm.cls. + * + * Note: Because of language dependencies this example will not run + * correctly on all language versions of Windows. It assumes + * the window titles are in English. To run on a different + * language version, change the window titles for the Calculator + * and Notepad applications to the correct title for + * the specific language version of Windows. + */ + +-- First, give the user a clue as to what is happening. +msg = "This ooRexx example program demonstrates controlling a" || .endOfLine || - + "Windows application using the winsystm.cls classes." || .endOfLine~copies(2) || - + "Information will be displayed using message boxes like" || .endOfLine || - + "this one. Push the ok button in them to continue the" || .endOfLine || - + "demonstration." || .endOfLine~copies(2) || - + "You will see the Calculator and Notepad programs appear" || .endOfLine || - + "on your screen, one at a time. There are some short" || .endOfLine || - + "pauses between actions. Be patient during them." || .endOfLine~copies(2) || - + "On the other hand, if the pauses are too short for you," || .endOfLine || - + "you can increase the pauses by editing the code. This" || .endOfLine || - + "will provide a good excuse to explore the code, which" || .endOfLine || - + "is an excellent way to learn. Simply search for 'call" || .endOfLine || - + "SysSleep' in the code and increase the sleep amount for" || .endOfLine || - + "any pause that is is too short." || .endOfLine~copies(2) || - + "In particular watch the Calculator program to see the" || .endOfLine || - + "changes as it is remotely controlled. The applications" || .endOfLine || - + "will be closed automatically" + +j = infoDialog(msg) + +-- A simple demonstration of the Windows Manager. Get an instance of the +-- WindowsManager class. Then, display the title and coordinates of the current +-- foreground window. +winMgr = .WindowsManager~new + +fg = winMgr~ForegroundWindow +if fg \= .nil then do + msg = "Current foreground window" || '0d0a0d0a'x || - + " Window title: " fg~Title || '0d0a'x || - + " Window location:" fg~Coordinates + j = infoDialog(msg) +end +else do + msg = "The WindowsManager object failed to find the foreground window." + j = errorDialog(msg) +end + +-- A more involved demonstration using the Windows Calculator application. The +-- real work is done in the workWithCalc() routine. +calcPrg = getPathToSystemExe("calc.exe") +if calcPrg \== .nil then do + ret = workWithCalc(calcPrg) +end +else do + msg = "Faild to locate a definitive path to the Windows" || '0d0a'x || - + "Calculator application. Going to skip this part" || '0d0a'x || - + "of the demonstration." + j = errorDialog(msg) +end + +-- An example similar to the Windows Calculator, but using Windows Notepad. +notepad = getPathToSystemExe("notepad.exe") +if notepad \== .nil then do + ret = workWithNotepad(notepad) +end +else do + msg = "Faild to locate a definitive path to the Windows" || '0d0a'x || - + "Notepad application. Going to skip this part of" || '0d0a'x || - + "the demonstration." + j = errorDialog(msg) +end + +return 0 + + +/* windowsSystem.frm contains public helper routines and also requires + * winsystm.cls and oodplain.cls. Requiring windowsSystem.frm gives us access + * to the class definitions for WindowsManager, WindowsClipboard, and + * WindowObject. oodplain.cls has the class definitions for the message dialogs. + */ +::requires "windowsSystem.frm" + +::routine workWithCalc + use strict arg calcPrg + + -- Start the Calculator program. + "start" calcPrg + + -- Find the Calculator Window, if we don't find it, then end this portion of + -- the demonstration. + calc = findTheWindow("Calculator") + if calc == .nil then return windowFailure("Calculator") + + -- Make the calculator the top-most window. + calc~ToForeground + call SysSleep 2 + + -- Switch to the scientific view. + calc~ProcessMenuCommand("&View","&Scientific") + call SysSleep 2 + + /* When the view of the Calculator is changed, it gets a new window handle. + * Because of this, after each view change, the calculator must be found + * again. This is an oddity of the Calculator application. Most applications + * maintain the same window handle through out their execution. + */ + calc = findTheWindow("Calculator") + if calc == .nil then return windowFailure("Calculator") + calc~ToForeground + + /* Each button in a dialog has a resource ID. When the button is pushed or + * clicked, the button sends a command (WM_COMMAND) notification to its + * parent window. The command notification contains the resource ID of the + * button that was pushed. This is how the dialog knows what button(s) the + * user pushes or clicks. + * + * We can simulate a user pushing buttons by sending commands to the dialog + * using the resource ID of the button we want pushed. Here we define + * variables with the IDs of some of the buttons in the calculator + * application. This makes the code easier to read. You can verify that + * these are the correct ID numbers by using the displayWindowTree.rex program + * included with this distribution of ooRexx. + */ + + divide = 90 + multi = 91 + plus = 92 + minus = 93 + point = 85 + equals = 112 + one = 125 + three = 127 + five = 129 + seven = 131 + + /* Create a clipboard object */ + cb = .WindowsClipboard~new + + /* Switch between Scientific and Standard view using the calculator's menu */ + calc = findTheWindow("Calculator") + if calc == .nil then return windowFailure("Calculator") + + calc~ProcessMenuCommand("&View","S&tandard") + call SysSleep 2 + + calc = findTheWindow("Calculator") + if calc == .nil then return windowFailure("Calculator") + + calc~ProcessMenuCommand("&View","&Scientific") + call SysSleep 2 + + calc = findTheWindow("Calculator") + if calc == .nil then return windowFailure("Calculator") + + calc~Title = "Calculator - Open Object Rexx is in charge!" + + -- Do a few calculations and retrieve the results via the clipboard + calc~sendCommand(seven) + calc~sendCommand(plus) + calc~sendCommand(five) + calc~sendCommand(equals) + + -- Empty clipboard so that we can wait until data is available + cb~empty + + /* Copy result to clipboard, wait until the data is available from the + * clipboard and then use paste to display the result. + */ + calc~processMenuCommand("&Edit", "&Copy") + do while cb~IsDataAvailable = 0; nop; end + msg = "Calculator says: 7+5="cb~Paste + j = infoDialog(msg) + + call SysSleep 2 + calc~sendCommand(divide) + calc~sendCommand(one) + calc~sendCommand(Point) + calc~sendCommand(five) + calc~sendCommand(equals) + cb~Empty + + calc~processMenuCommand("&Edit", "&Copy") + do while cb~IsDataAvailable = 0; nop; end + msg = "Calculator says: 7+5/1.5="cb~Paste + j = infoDialog(msg) + + calc~sendCommand(multi) + calc~sendCommand(three) + calc~sendCommand(equals) + cb~Empty + + calc~processMenuCommand("&Edit","&Copy") + do while cb~IsDataAvailable = 0; nop; end + msg = "Calculator says: 7+5/1.5*3="cb~Paste + j = infoDialog(msg) + + call SysSleep 2 + + -- Switch to hexadecimal mode. + calc~pushButton("Hex") + cb~empty + calc~processMenuCommand("&Edit","&Copy") + do while cb~isDataAvailable = 0; nop; end + msg = "Calculator says: 7+5/1.5="cb~Paste " (HEX)" + j = infoDialog(msg) + + call SysSleep 2 + + -- Switch back to decimal mode. + calc~pushButton("Dec") + + -- Copy a number to the clipboard and from there to the calculator to + -- demonstrate another way to enter numbers. + cb~copy("123456789") + calc~processMenuCommand("&Edit", "&Paste") + call SysSleep 2 + + -- Simulate a left mouse button click on the "Grads" radio button. + gradsRB = findDescendent(calc, "Grads") + if gradsRB \== .nil then do + gradsRB~sendMouseClick("LEFT", "DOWN", 2, 2) + gradsRB~sendMouseClick("LEFT", "UP", 2, 2) + end + + call SysSleep 2 + + -- Close the Calculator application by pressing Close in the system menu. + calc~sendSysCommand("Close") + +return 0 + +::routine workWithNotepad + use strict arg notePrg + + -- Start the Notepad program. + "start" notePrg + + np = findTheWindow("Untitled - Notepad") + if np == .nil then return windowFailure("Notepad") + + -- Move Notepad to foreground. + np~toForeground + + -- The edit window is the first (and perhaps only) child window of Notepad. + npe = np~firstChild + + -- The sendText() method sets the text of a window. + npe~sendText("Hello,") + + -- The sendKey() method sends a key press to a window. This can be used to + -- send virtual key pressess to the window. + npe~sendKey("RETURN") + + -- Because we are sending messages to an application running in a separate + -- process, on today's fast, multi-threaded, multi-cored, systems, it is + -- possible for the messages to arrive in the Notepad application in a + -- different order than they are being sent here. This was probably not + -- possible on Windows 3.0 when this example was first developed. + -- + -- To avoid this out of order messaging, we use a helper function from the + -- windowsSystem.frm framework. + j = sendTextWithPause(npe, "This is a sample that mainly demonstrates the use") + j = sendKeyWithPause(npe, "RETURN") + j = sendTextWithPause(npe, "of the WindowsManager class.") + j = sendKeyWithPause(npe, "RETURN") + j = sendKeyWithPause(npe, "RETURN") + + j = sendTextWithPause(npe, "It also introduces the WindowObject, the MenuObject,") + j = sendKeyWithPause(npe, "RETURN") + j = sendTextWithPause(npe, "and the WindowsClipboard classes.") + j = sendKeyWithPause(npe, "RETURN") + j = sendKeyWithPause(npe, "RETURN") + + npe~sendText("In 1 second intervals I'm going to minimize, maximize, restore,") + j = sendKeyWithPause(npe, "RETURN") + npe~sendText("disable, and reenable Notepad.") + j = sendKeyWithPause(npe, "RETURN") + + call SysSleep 3 + np~minimize + call SysSleep 1 + np~maximize + call SysSleep 1 + np~restore + call SysSleep 1 + + -- Change the size of the Notepad window. + np~resize(650, 280) + + -- Make the main window (including the menu) inaccessible. + np~disable + + j = sendKeyWithPause(npe, "RETURN") + j = sendKeyWithPause(npe, "RETURN") + j = sendTextWithPause(npe, "Select a menu item. It won't be possible.") + call SysSleep 5 + + -- Re-enable the main window. + np~enable + + j = sendKeyWithPause(npe, "RETURN") + j = sendTextWithPause(npe, "Now the menu is enabled again.") + call SysSleep 1 + + j = sendKeyWithPause(npe, "RETURN") + j = sendTextWithPause(npe, "You can do the same with the editor window.") + + -- We disable the edit window so it gets grayed. + npe~disable + call SysSleep 4 + + npe~enable + j = sendKeyWithPause(npe, "RETURN") + npe~sendText("Now let's hide the editor window.") + call SysSleep 2 + + -- Let's hide the edit window (not the main window) for a moment.e */ + npe~hide + np~restore + call SysSleep 2 + + npe~restore + npe~sendKey("RETURN") + npe~sendKey("RETURN") + call SysSleep 3 + npe~sendKey("RETURN") + npe~sendKey("RETURN") + npe~sendText("The show is over. Good bye in 3 seconds!") + + -- Get a WindowsManager object, we'll use it below to cancel the Save dialog. + winMgr = .WindowsManager~new + + -- On Vista, the interface to Notepad is slightly changed. + if isVistaOrLater() then buttonName = "Do&n't Save" + else buttonName = "&No" + call SysSleep 2 + + -- Close Notepad by pressing the Close menu item in the system menu. + np~sendSysCommand("Close") + + -- Wait a second for the dialog that asks whether to save the changes. + call SysSleep 1 + fg = winMgr~foregroundWindow + if fg \== .nil, fg~title = "Notepad" then do + call SysSleep .1 + + -- Get the No or Don't Save button. Then set the focus to the button and + -- send the space key to it. This simulates a user pushing the button and + -- has the effect of closing Notepad automatically. + button = findDescendent(fg, buttonName) + if button \== .nil then do + fg~focusItem(button) + button~SendKey("SPACE") + end + else do + msg = 'Could not locate the' buttonName~changestr('&', "") 'button used to ' || '0d0a'x || - + 'discard the text changes. findDescendent() failed' || '0d0a0d0a'x || - + 'You will have to close the Notepad windows manually.' + j = errorDialog(msg) + end + end + else do + msg = 'Failed to connect with the Save Dialog for Notepad' || '0d0a0d0a'x || - + 'You may have to close the Notepad windows manually.' + j = errorDialog(msg) + end + +return 0 + +/** windowFailure() + * A simple helper function to put up an error message box. + */ +::routine windowFailure + use strict arg name + + msg = "Failed to locate the" name "application window." || '0d0a0d0a'x || - + "Ending the" name "demonstration prematurely." + j = errorDialog(msg) + +return .false + diff --git a/modules/windows/oodialog/winsystem/winSystemDlgs.h b/modules/windows/oodialog/winsystem/winSystemDlgs.h new file mode 100644 index 0000000..dfd27a7 --- /dev/null +++ b/modules/windows/oodialog/winsystem/winSystemDlgs.h @@ -0,0 +1,52 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#define IDD_WINDOW_TREE 100 +#define IDC_TREE_WINDOWS 1003 + +#define IDD_MENU_TREE 110 +#define IDC_TREE_MENUS 1103 + +#define IDD_USER_PROMPT 120 +#define IDC_EDIT_NAME 1203 + +#define IDD_WINDOW_LIST 130 +#define IDC_STATIC_DESCRIPTION 1302 +#define IDC_PB_SHOW 1303 +#define IDC_PB_QUIT 1304 +#define IDC_LV_WINDOWS 1306 +#define IDC_PB_REFRESH 1301 diff --git a/modules/windows/oodialog/winsystem/winSystemDlgs.rc b/modules/windows/oodialog/winsystem/winSystemDlgs.rc new file mode 100644 index 0000000..ec413dc --- /dev/null +++ b/modules/windows/oodialog/winsystem/winSystemDlgs.rc @@ -0,0 +1,87 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include "winSystemDlgs.h" +#include +#include + + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +IDD_WINDOW_TREE DIALOGEX 0, 0, 289, 330 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU +CAPTION "Window Hierarchy" +FONT 8, "Ms Shell Dlg 2", 400, 0, 1 +BEGIN + DEFPUSHBUTTON "OK", IDOK, 229, 306, 50, 14 + CONTROL "", IDC_TREE_WINDOWS, WC_TREEVIEW, WS_TABSTOP | WS_BORDER | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_INFOTIP | TVS_FULLROWSELECT, 10, 10, 269, 291 +END + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +IDD_MENU_TREE DIALOGEX 0, 0, 289, 330 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU +CAPTION "Menu Hierarchy" +FONT 8, "Ms Shell Dlg 2", 400, 0, 1 +BEGIN + DEFPUSHBUTTON "OK", IDOK, 229, 306, 50, 14 + CONTROL "", IDC_TREE_MENUS, WC_TREEVIEW, WS_TABSTOP | WS_BORDER | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_INFOTIP | TVS_FULLROWSELECT, 10, 10, 269, 291 +END + +IDD_USER_PROMPT DIALOG 0, 0, 186, 89 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_FIXEDSYS | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU +CAPTION "Select Top Level Window" +FONT 8, "Ms Shell Dlg 2" +BEGIN + LTEXT "Enter the window title of the window whose menu you want to display. You need to use the full and exact title of the window.", IDC_STATIC, 15, 14, 154, 32 + GROUPBOX "", IDC_STATIC, 5, 5, 176, 41 + EDITTEXT IDC_EDIT_NAME, 5, 53, 176, 12, ES_AUTOHSCROLL + DEFPUSHBUTTON "OK", IDOK, 76, 72, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 131, 72, 50, 14 +END + +IDD_WINDOW_LIST DIALOGEX 0, 0, 286, 212 +STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU +CAPTION "Top-level Windows" +FONT 8, "Ms Shell Dlg 2", 400, 0, 1 +BEGIN + CTEXT "Select a top-level window in the list and push the Show button. The selected window and its children will be graphically displayed. Use the Refresh button to re-populate the list.", IDC_STATIC_DESCRIPTION, 10, 10, 266, 35 + GROUPBOX "Window List", IDC_STATIC, 10, 50, 266, 133 + CONTROL "", IDC_LV_WINDOWS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SINGLESEL | LVS_REPORT | LVS_SHOWSELALWAYS, 17, 68, 252, 104 + DEFPUSHBUTTON "Refresh", IDC_PB_REFRESH, 10, 188, 50, 14 + DEFPUSHBUTTON "Show", IDC_PB_SHOW, 171, 188, 50, 14 + PUSHBUTTON "Quit", IDC_PB_QUIT, 226, 188, 50, 14 +END + diff --git a/modules/windows/oodialog/winsystem/windowsSystem.frm b/modules/windows/oodialog/winsystem/windowsSystem.frm new file mode 100644 index 0000000..dd61e1a --- /dev/null +++ b/modules/windows/oodialog/winsystem/windowsSystem.frm @@ -0,0 +1,917 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: windowsSystem.frm + * Type: Framework + * + * Description: A collection of public routines and classes to help work with + * the winsystm.cls package. + * + * This is an example of how to extract common function into a + * package, and the use the package to help in writting similar + * programs. A number of the sample programs that use + * winsystm.cls make use of this framework. + */ + +::requires 'winsystm.cls' +::requires "ooDialog.cls" + +/** findTheWindow() + * Uses the WindowsManager to create a WindowObject representing a top-level + * window currently running on the system. + * + * When an application is started up, it takes some finite amount of time before + * the window for the application is created by the operating system. The + * WindowsManager can not 'find' the aplication window until it has been + * created. This function loops a number of times trying to find the window, + * then eventually gives up + * + * How long to wait for to find the window before giving up can be adjusted by + * the caller. + * + * @param title The title of the window being sought. + * @param loops Optional. The number of loops to perform looking for the + * window. The default is 20. + * @param pause Optional. The time to sleep during each loop. The default + * is .2 of a second. + * + * @return A WindowObject object representing the desired window on + * success. If the function fails, .nil is returned. + * + * @note To find a window, you must use its exact title. + */ +::routine findTheWindow public + use strict arg title, loops = 20, pause = .2 + + windowMgr = .WindowsManager~new + + do loops + j = SysSleep(pause) + wnd = windowMgr~find(title) + if wnd~class == .WindowObject then leave + end + +return wnd + +/** sendTextWithPause() + * Sends text to a window and pauses slightly before returning. + * + * @param wnd A window object that represents the window to send the text to. + * @param text The text to send. + * + * @return The return from SysSleep() + * + * @note Not to go into too much detail about the underlying implmentation of + * winsystm.cls, but a brief explantion. When sending text or a key + * press to a window, a Windows API function is used that returns + * immediately, before the text or key press actually makes it to + * the OS window. In a fast dual-core / multi-core / multi-processor + * system this can result in the window receiving the key presses or text + * in a different order than they are sent by ooRexx. + * + * This function and the sendKeyWithPause() function prevent that out of + * ordering by pausing very slightly after doing the send. This actually + * mimics more closely a user entering the data on a keyboard. Anyone + * familiar with Expect, probably knows that Expect provides a similiar + * function. + */ +::routine sendTextWithPause public + use strict arg wnd, text + wnd~sendText(text) +return SysSleep(.01) + +/** sendKeyWithPause() + * Sends a key press to a window and pauses slightly before returning. + * + * @param wnd A window object that represents the window to send the key + * press to. + * @param key The key press to send. + * + * @return The return from SysSleep() + * + * @see sendTextWithPause() + */ +::routine sendKeyWithPause public + use strict arg wnd, key + wnd~sendKey(key) +return SysSleep(.01) + +/** printChildren() + * Given a window object, enumerates all descendent windows of that window and + * prints the results to the screen. + * + * @param wnd The parent window object. + * @param indent When printing to the console, the amount of indentation. + * + * @return True if this function recursed, otherwise false. + */ +::routine printChildren public + use strict arg wnd, indent + + line = indent || wnd~hwnd ":" wnd~id ":" wnd~wclass ":" wnd~title~left(15) ":" wnd~coordinates + + childs. = wnd~enumerateChildren + + select + when childs.0 == 0 then do + line = line "no children" + say line + return .false + end + + when childs.0 == 1 then do + line = line "1 child" + end + + otherwise do + line = line childs.0 "children" + end + end + -- End select + + say line + + indent = indent || " " + + do i = 1 to childs.0 + childWnd = .WindowObject~new(childs.i.!Handle) + ret = printChildren(childWnd, indent) + end + +return .true + +/** findDescendent() + * Finds a descendent window with the window title specified, if any. + * + * @param wnd The parent window whose descendents are searched. + * @param title The title (label) of the window being searched for. + * + * @return A .WindowObject representing the window if found. If not found then + * .nil is returned. + * + * @note This function is very similar to .WindowObject~findChild(), except + * that this function will search recursively through the window + * hierarchy for any descendent window with the specified label. The + * WindowObject's findChild() on the other hand only looks at the + * immediate children. + */ +::routine findDescendent public + use strict arg wnd, title + + descendent = wnd~findChild(title) + if descendent \== .nil then return descendent + + children. = wnd~enumerateChildren + + do i = 1 to children.0 + childWnd = .WindowObject~new(children.i.!Handle) + + descendent = findDescendent(childWnd, title) + if descendent \== .nil then return descendent + end + +return .nil + +/** isVistaOrLater() + * Simple convenience function to determine if the operating system is at least + * Windows Vista. + * + * @return True if the current OS is Vista or a later version of Windows, + * otherwise false. + */ +::routine isVistaOrLater public + parse value SysVersion() with name ver + return (ver >= 6) + + +/** getPathToSystemExe() + * Gets the complete path to an executable that is a standard application + * shipped with a Windows system. In a Windows distributions, these + * applications are in the system directory. Getting the complete path ensures + * that the correct application is started. + * + * For instance, there are a surprisingly large number of applications named + * 'calc.' If a user has set up her system with a 'calc' program in a directory + * ahead of the system directory in the path, then that calc program can end up + * being started rather than the expected Windows calculator application. + * + * @param prgName The program whose path is being sought. The .exe is + * expected. + * + * @return The fully qualified path name of the program, if it exists in the + * system directory. If not found, then .nil is returned. + */ +::routine getPathToSystemExe public + use strict arg prgName + + shell = .oleObject~new('Shell.Application') + + -- 0x25 is the CSIDL_SYSTEM constant. The CSIDL_XXX constants are used to + -- identify well known directories on Windows. Like the My Documents + -- directory, the All Users Start Menu, etc. We use this constant to get the + -- Windows System folder object, and from that the path to the directory. + csidl_system = '25' + + folderObj = shell~nameSpace(csidl_system~x2d) + sysFolderPath = folderObj~self~path + if sysFolderPath~right(1) \== '\' then sysFolderPath = sysFolderPath'\' + + prgPathName = sysFolderPath || prgName + if \ SysIsFile(prgPathName) then prgPathName = .nil + +return prgPathName + +/** getWindowTree() + * Constructs a data structure that represents the entire window hierarchy of + * a window. + * + * Each node in the structure represents a window. The node is a .directory + * object whose items contain the important attributes of the window. This + * directory object has an item: children, that is an array of nodes + * representing the children windows of the node. + * + * Each node has these indexes: + * + * node~handle + * node~title + * node~windowClass + * node~state + * node~id + * node~coordinates + * node~children + * node~hasChildren + * node~childrenCount + * + * @param wnd The window object to construct a node for. + * + * @return A tree of window nodes representing the window specified and all its + * children. + * + * @note This is a recursive function. + */ +::routine getWindowTree public + use strict arg wnd + + tree = buildWindowDetails(wnd) + child = wnd~firstChild + if child == .nil then return tree + + tree~children = .array~new + tree~hasChildren = .true + do while child \== .nil + tree~children~append(getWindowTree(child)) + tree~childrenCount += 1 + child = child~next + end + +return tree + +/** buildWindowDetails() + * Private helper function for getWindowTree(). + * + * @param wnd The .WindowObject whose details are desired. + * + * @return A directory object whose items reflect a number of attributes of + * a window. + */ +::routine buildWindowDetails + use strict arg wnd + + d = .directory~new + d~handle = wnd~handle + d~text = wnd~title + d~windowClass = wnd~wClass + d~state = wnd~state + d~id = wnd~id + d~coordinates = wnd~coordinates + d~children = .nil + d~hasChildren = .false + d~childrenCount = 0 + +return d + +/** printWindowTree + * Given a tree of window nodes, prints out the tree to the console. + * + * @param tree The tree of window nodes to print. + * @param indent The current indentation. Note that this is a recursive + * function and the indent is increased with each recursion. + * + * @return True if the function has recursed, othewise false. + * + * @see getWindowTree() + * @see printChildren() + * + * @note The function produces the exact same output as printChildren(). Its + * main purpose was to debug getWindowTree(). However, it could serve + * as a useful template if one wanted to change how the information or + * what information is printed to the console. + */ +::routine printWindowTree public + use strict arg tree, indent + + -- A little defensive programming. + if \ tree~isA(.directory) then return .false + + line = indent || tree~handle ":" tree~id ":" tree~windowClass ":" tree~text~left(15) ":" tree~coordinates + + select + when tree~childrenCount == 0 then do + line = line "no children" + say line + return .false + end + + when tree~childrenCount == 1 then do + line = line "1 child" + end + + otherwise do + line = line tree~childrenCount "children" + end + end + -- End select + + say line + + indent = indent || " " + + do child over tree~children + ret = printWindowTree(child, indent) + end + +return .true + +/** showWindowTree() + * Puts up an ooDialog dialog that displays the window hierarchy of a window in + * a tree view control. + * + * @param tree A tree node data structure produced by the getWindowTree() + * function. + * + * @return True if the dialog was shown, false if it was not. + * + * @see getWindowTree() + * + * @note We use the locate() function to get the directory this source code is + * located in. And then, use that value to create a complete path name + * to our resource files. This ensures the .rc and .h files will always + * be found + */ +::routine showWindowTree public + use strict arg tree + + sd = locate() + dlg = .WindowTreeDlg~new(sd"winSystemDlgs.rc", IDD_WINDOW_TREE, , sd"winSystemDlgs.h") + if dlg~initCode == 0 then do + dlg~useTree(tree) + dlg~execute("SHOWTOP") + return .true + end + +return .false + +/** class: WindowTreeDlg + * + * A simple ooDialog dialog class to display the window hierarchy, parent and + * descendent windows, of any window. + * + * The only caveat is that the class requires a window tree structure created by + * the getWindowTree() public routine in this framework. + * + * This is a subclass of RcDialog, meaning the dialog template is defined in a + * resource script file. The dialog template was created by a GUI dialog + * editor. The dialog template is stored in the winSystemDlgs.rc file and has + * a symbolic resource ID of IDD_WINDOW_TREE. The symbolic resource IDs are + * defined in the winSystemDlgs.h file. + * + * @note For an example of how to use this class see the showWindowTree() + * public routine in this framework. + */ +::class 'WindowTreeDlg' public subclass RcDialog + +/** useTree() + * Sets the window tree structure for this dialog. The structure must be set + * prior to executing the dialog, otherwise the dialog will display an empty + * tree view control. + * + * @param windowTree A tree node structure in the same format as that produced + * by the getWindowTree() function. + @ + @ @see getWindowTree() + */ +::method useTree + expose windowTree + use arg windowTree + +/** initDialog() + * Initializes the dialog controls for this dialog. The only control is the + * Tree control. + * + * The ooDialog framework automatically inovkes this method for every dialog + * immediately after the underlying Windows dialog has been created. Since most + * of the initialization of dialog controls requires that the underlying control + * has been created, this makes initDialog() the proper place to do all the + * control initialization. + */ +::method initDialog + expose windowTree + + if windowTree~isA(.directory), windowTree~hasIndex("WINDOWCLASS") then self~doInit(windowTree) + +/** doInit() + * A private method that does the actuall work of initializing the tree control. + * + * @param windowTree The window tree node structure for this dialog. + */ +::method doInit private + use strict arg windowTree + + -- Get the tree-view control object and then invoke the addNode() recursive + -- method to add all the items to the control. + tree = self~newTreeView(IDC_TREE_WINDOWS) + rootNode = self~addNode(tree, "Root", windowTree) + + -- Set the title of this dialog, which will contain the window handle for the + -- window we represent. + title = "The" windowTree~text "(" || windowTree~handle || ") Window Hierarchy" + self~setTitle(title) + + -- Expand the root item in the tree-view control. + tree~expand(rootNode) + +/** addNode() + * A private recursive function that adds each node to the tree control. Each + * node represents a single window in the hiearchy. + * + * @param tree The tree-view control object. + * + * @param root A reference to the current item in the tree-view control we + * are working with. Note that this can also be the keyword: root + * which will signal that this is to be the initial item in the + * tree-view control. Otherwise, it is a reference to an already + * created item in the tree-view control. + * + * @param node The current node in the window tree structure we are working + * with. + */ +::method addNode private + use strict arg tree, root, node + + -- The text displayed for this item. + text = node~handle || ":" node~text + + -- Insert (create) a new item in the tree-view control. Insert it after the + -- 'LAST' sub-item under the item referenced by root in the tree-view control. + -- This item is the window item. + newRoot = tree~insert(root, "LAST", text, , , , node~childrenCount) + + -- Insert sub-items. Each of these sub-items is an attribute of the window + tree~insert(newRoot, , "Text:" node~text) + tree~insert(newRoot, , "Handle:" node~handle) + tree~insert(newRoot, , "Class:" node~windowClass) + tree~insert(newRoot, , "ID:" node~id) + tree~insert(newRoot, , "Coordinates:" node~coordinates) + tree~insert(newRoot, , "State:" node~state) + + -- Now, if the window has children windows, recursively add them to the + -- tree-view control. + if node~hasChildren then do n over node~children + self~addNode(tree, newRoot, n) + end + +return newRoot + +/** class: MenuDetailer + * + * A class to parse and display the details of a menu bar. + * + * In Windows, a menu bar is similar to a top level window in that they both + * have a hierarchy of contained objects. A top-level window can contain other + * windows, which themselves can contain other windows. A menu bar can contain + * submenus, which can contain submenus. + * + * This hierarchy is easily displayed in a tree-like structure, for both windows + * and menus. The function of displaying a menu hierachy is therefore very + * similar to the set of functions used to display a window hierarchy provided + * in this framework. + * + * However, the MenuDetailer is a more object-orientated approach than that used + * for displaying a window hierarchy. The data and the means to manipulate the + * data are all contained within a single object, the MenuDetailer object. + * + * Note that this is a subclass of ooDialog's RcDialog, but the class can be + * used / useful without ever creating an underlying Windows dialog. The + * ooDialog part is only used in the display() method which produces a graphical + * dislpay of the menu tree. + */ +::class 'MenuDetailer' public subclass RcDialog + +::method init + use strict arg wnd + self~newWindow(wnd) + + +/** newWindow() + * This method is called to create a menu tree node structure that represents + * the menu of the specified window. It is used when a new MenuDetailer object + * is created and when / if the user of the class sets a new window. + * + * @param wnd A window object whose menu is to be 'detailed.; + */ +::method newWindow private + expose menubar maxTextLength textFormat mainWindow + use strict arg wnd + + -- Ensure wnd is a WindowObject. + if \ wnd~isA(.WindowObject) then raise syntax 93.948 array ("1 'wnd'", "WindowObject") + + -- Set / reset some state variables. + maxTextLength = 0 + textFormat = .nil + menubar = .nil + mainWindow = wnd + + -- Create the menu tree node structure. + self~createMenubar + +/** createMenubar() + * Creates a menu tree node structure that represents the menu of the main + * window. + * + * Conceptually, a menu consists of a container with some number of menu items, + * where each menu item can, possibly, be a submenu. Typically in Windows, the + * top-level container is called a menubar. A tree is a natural data + * structure to represent this. + * + * The menu tree node structure consists of a directory that represents the + * menubar and has this structure: + * + * menubar~ownerHwnd + * menubar~ownerTitle + * menubar~itemCount + * menubar~menuItems an array of menu items where each menu item is a + * directory. + * + * menuitem~pos + * menuitem~id + * menuitem~text + * menuitem~isSubmenu + * menuitem~isSeparator + * menuitem~isTextItem + * menuitem~isChecked + * menuitem~itemCount + * menuitem~menuItems an array of menu items + * + */ +::method createMenubar private + expose menubar mainWindow + + menubar = .directory~new + menubar~ownerTitle = mainWindow~title + menubar~ownerHwnd = mainWindow~hwnd + + menu = mainWindow~menu + if menu == .nil then do + menubar~itemCount = -1 + menubar~menuItems = .nil + end + else do + menubar~itemCount = menu~items + menubar~menuItems = self~populate(menu) + end + +/** populate() + * A recursive function to create and return an array of menu items. + * + * @param A MenuObject object whose menuitems will be used to create and + * populate an array. + * + * @return The populated array. + * + * @see createMenubar() + */ +::method populate private + expose maxTextLength + use strict arg menu + + maxTextLength = 0 + count = menu~items + + a = .array~new(count) + do i = 0 to count - 1 + d = .directory~new + d~pos = i + d~id = menu~idOf(i) + d~text = menu~textOf(i) + d~isSubmenu = menu~isSubmenu(i) + d~isSeparator = menu~isSeparator(i) + d~isTextItem = \(d~isSeparator | d~isSubmenu) + d~isChecked = menu~isChecked(i) + + if d~text~length > maxTextLength then maxTextLength = d~text~length + + if d~isSubmenu then do + submenu = menu~submenu(i) + d~itemCount = submenu~items + d~menuItems = self~populate(submenu) + end + else do + d~itemCount = 0 + d~menuItems = .nil + end + + a[i + 1] = d + end + +return a + +/** print() + * Outputs a text representation of the menu to the console. + */ +::method print + expose textFormat + + -- If not already created, construct an array of text lines that represents + -- the menu. Then output the lines to the console. + if textFormat == .nil then self~toArray + do l over textFormat + say l + end + +/** getOutline() + * Return the array of text lines representing the menu to the caller. The + * caller can then use the array as they see fit. + */ +::method getOutline + expose textFormat + + -- Return a copy of the array to the caller so that an outsider can not + -- unintentionally or intentionally change our internal data. + if textFormat == .nil then self~toArray + return textFormat~copy + +/** getMenubar() + * Return the menu tree node structure to the caller. The caller can then + * format and / or use the data as desired. + */ +::method getMenubar + expose menubar + + -- Recreate the menubar if needed. + if menubar == .nil then self~createMenubar + + -- Since ooRexx does not have a deep copy, we save a reference to the menuBar + -- object, set our internal reference to the menubar to .nil, and return the + -- saved reference. This allows the caller to change the menubar without + -- changing our internal representation. If we need the menubar structure + -- again, we will re-create it. + populatedMenubar = menubar + menubar = .nil + +return populatedMenubar + +/** setWindow() + * Changes the main window to a new one. + */ +::method setWindow + use strict arg wnd + self~newWindow(wnd) + +/** toArray() + * Transforms the menu tree node structure that represents our menu into an + * array of text lines that represents the menu. + */ +::method toArray private + expose menubar textFormat + + -- Check if we need to recreated the menubar. + if menubar == .nil then self~createMenubar + + textFormat = .array~new + + -- The first line will show data about the main window. It is possible that + -- the window will were initialized with does not have a menu. In addition, + -- many applications now create their menus dynamically. Those types of menus + -- may not contain any menu items until the user actually selects a menu item. + -- For these two cases we return immediately. + + line = menubar~ownerTitle "(" || menubar~ownerHwnd || ")" + if menubar~itemCount == -1 then do + textFormat[1] = line "does not have a menu" + return textFormat + end + else if menubar~itemCount == 0 then do + textFormat[1] = line "menu is not populated" + return textFormat + end + + -- Add the first line, then recursively add a line for every menu item. + textFormat[1] = line + do item over menubar~menuItems + self~addArrayItem(item, " ") + end + +/** addArrayItem() + * A recursive method that adds a line of text for every menu item to an array + * of lines. + * + * @param item A node in the menu tree node structure representing a menu + * item. + * + * @param indent A string of spaces, the length of which shows the depth of + * the menu item within the overall menu. + */ +::method addArrayItem private + expose maxTextLength textFormat + use strict arg item, indent + + -- Build up a line of text for the menu item + line = indent + sep = '-'~copies(maxTextLength) + pos = item~pos~right(2) || ':' + id = '[id:' item~id~right(3) || ']' + + select + when item~isSubmenu then do + line = line || pos id 'popup menu' item~text~left(maxTextLength) + end + when item~isSeparator then do + line = line || pos id 'separator ' sep + end + otherwise do + line = line || pos id 'menu item ' item~text~left(maxTextLength) + if item~isChecked then line = line '[checked]' + end + end + -- End select + + -- Add the line to our array of lines. + textFormat~append(line) + + -- If item is itself a menu, recursively add its menu items to the array. + if item~isSubmenu then do + -- Increase our indent by 2 spaces. + indent = indent || " " + do menuItem over item~menuItems + self~addArrayItem(menuItem, indent) + end + end + +/** display() + * Displays our menu in a graphical format using a tree control in a dialog. + */ +::method display + + -- Initialize our ooDialog superclass. The dialog template is stored in the + -- resource script file: winSystemDlgs.rec with a symbolic ID of IDD_MENU_TREE + -- and the symbolic IDs for the dialog are defined in winSystemDlgs.h + -- + -- Note: We use the locate() function to get the directory this source code + -- is located in. And then, use that value to create a complete path name to + -- our resource files. This ensures the .rc and .h files will always be + -- found. + sd = locate() + self~init:super(sd"winSystemDlgs.rc", IDD_MENU_TREE, , sd"winSystemDlgs.h") + self~execute("SHOWTOP") + +/** initDialog() + * Initializes the dialog controls for this dialog. The only control is the + * Tree control. + * + * The ooDialog framework automatically inovkes this method for every dialog + * immediately after the underlying Windows dialog has been created. Since most + * of the initialization of dialog controls requires that the underlying control + * has been created, this makes initDialog() the proper place to do all the + * control initialization. + * + * @see WindowTreeDlg::initDialog() + */ +::method initDialog + expose menubar + + -- Check if we need to recreate the menubar. + if menubar == .nil then self~createMenubar + + -- Set the dialog title to a subset of what will be the text for the first + -- item in the tree-view control. + rootText = menubar~ownerTitle "(" || menubar~ownerHwnd || ")" + self~setTitle(rootText "Menu Hierarchy") + + -- The tree-view control is populated in a similar manner as was the tree-view + -- control in the WindowTreeDlg class in this framework. See that class for + -- comment if needed. + + -- Get the tree-view object, set the first item, expand it. + tree = self~newTreeView(IDC_TREE_MENUS) + + if menubar~itemCount == -1 then do + rootText = rootText "[window does not have a menu]" + end + else if menubar~itemCount == 0 then do + rootText = rootText "[menu is not populated]" + end + + rootNode = tree~add(rootText, , , "EXPANDED") + + -- If the menubar has menu items, recursively add then to the tree-view + -- control. + if menubar~itemCount > 0 then do item over menubar~menuItems + self~addNode(tree, rootNode, item) + end + +/** addNode() + * Recursively add tree-view items for each menu item in our menu. + * + * @param tree The tree-view control object. + * + * @param root A reference to the current item in the tree-view control we + * are working with. + * + * @param menuItem The current node in the menu tree structure we are working + * with. + * + * @see WindowTreeDlg::initDialog() + */ +::method addNode private + expose maxTextLength + use strict arg tree, root, menuItem + + text = menuItem~pos~right(2) || ':' + + if menuItem~isSeparator then text = text '-'~copies(maxTextLength) + else text = text menuItem~text + + if menuItem~isSubmenu then count = menuItem~itemCount + else count = 0 + + newRoot = tree~insert(root, "LAST", text, , , , count) + + tree~insert(newRoot, , "Text:" menuItem~text) + tree~insert(newRoot, , "ID:" menuItem~id) + tree~insert(newRoot, , "Submenu?" self~logicalToString(menuItem~isSubmenu)) + tree~insert(newRoot, , "Text Item?" self~logicalToString(menuItem~isTextItem)) + tree~insert(newRoot, , "Separator?" self~logicalToString(menuItem~isSeparator)) + tree~insert(newRoot, , "Checked?" self~logicalToString(menuItem~isChecked)) + + if menuItem~isSubmenu then do mi over menuItem~menuItems + self~addNode(tree, newRoot, mi) + end + +return newRoot + +/** logicalToString() + * Simple helper method to convert an ooRexx logical value to a string + * representation. + * + * @param logical The value to convert. + * + * @return The string "true" if logical is strictly true, otherwise the string + * "false" + */ +::method logicalToString private + use strict arg logical + + -- Work with anything sent to us. This uses the short-cut AND operator. Once + -- a test fails, the rest of the tests are not evaluated. If logical is a + -- string object, and the data type of the string object is lOgical, and + -- logical is true then return "true" Othewise return "false" + + if logical~isA(.String), logical~datatype('O'), logical then return 'true' + else return 'false' + diff --git a/modules/windows/oodialog/winsystem/writeWithNotepad.rex b/modules/windows/oodialog/winsystem/writeWithNotepad.rex new file mode 100755 index 0000000..a20dbcb --- /dev/null +++ b/modules/windows/oodialog/winsystem/writeWithNotepad.rex @@ -0,0 +1,186 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Name: writeWithNotepad.rex + * Type: Example ooRexx program + * + * Description: An example of using the winsystm.cls classes to control the + * Notepad application. It is a subset of the usewmgr.rex + * example, intended to be simplier and maybe easier to see what + * is happening. + * + * This example uses some of the public functions provided by + * the windowsSystem.frm package. That framework contains + * functions shared with other example programs shipped with + * ooRexx that use winsystm.cls. + * + * External function Source + * --------------------------------------------------- + * getPathToSystemExe() windowsSystem.frm + * errorDialog() ooDialog + * findTheWindow() windowsSystem.frm + * sendTextWithPause() windowsSystem.frm + * sendKeyWithPause() windowsSystem.frm + * isVistaOrLater() windowsSystem.frm + * getWindowTree() windowsSystem.frm + * showWindowTree() windowsSystem.frm + * findDescendent() windowsSystem.frm + * + * The external functions used by this program allow you to read through the + * code here and get the over-all picture of how the program works. To + * understand the finer details, you will need to look at the implementation + * of the external functions contained in windowsSystem.frm. + */ + +-- Get the full path to notepad to be sure we start the right application. +notepadExe = getPathToSystemExe("notepad.exe") + +-- Quit if we can't get the path. Let the user know why we are quitting. +if notepadExe == .nil then do + msg = "Faild to locate a definitive path to the Windows" || '0d0a'x || - + "Notepad application. This sample can not execute." + return errorDialog(msg) +end + +-- This will start notepad as a separate process. +"start" notepadExe + +-- When Notepad is started without a file name as an argument, its title will be +-- 'Untitled - Notepad' We try to find that window, quitting if we can not. +-- Note that findTheWindow() tries several times to locate the window, but will +-- eventually time out. Again, we let the user know why we are quitting if we +-- do. + +np = findTheWindow("Untitled - Notepad") +if np == .nil then do + msg = "Could not find the Notepad application window." || '0d0a0d0a'x || - + "This sample will have to abort." + return errorDialog(msg) +end + +-- Make sure the size of the Notepad window is wide enough for our text. +np~resize(650, 500) + +-- Move Notepad to the foreground. +np~ToForeground + +-- Get the edit window, which is the first (and perhaps only) child window of +-- the Notepad window. +editWnd = np~FirstChild + +-- Put some text into Notepad, if the user reads it, she will have a clue as to +-- what is going to happen. +j = SysSleep(.01) +j = sendTextWithPause(editWnd, "Hello,") +j = sendKeyWithPause(editWnd, "RETURN") +j = sendKeyWithPause(editWnd, "RETURN") +j = sendTextWithPause(editWnd, "When the Notepad Save dialog window opens, wait a second or two. ") +j = sendKeyWithPause(editWnd, "RETURN") +j = sendTextWithPause(editWnd, "Then a dialog window will open that will allow you to explore the") +j = sendKeyWithPause(editWnd, "RETURN") +j = sendTextWithPause(editWnd, "window hierarchy of the Save dialog. When you close that dialog, ") +j = sendKeyWithPause(editWnd, "RETURN") +j = sendTextWithPause(editWnd, "Notepad will close automatically. (If things work correctly.)") +j = sendKeyWithPause(editWnd, "RETURN") +j = sendKeyWithPause(editWnd, "RETURN") +j = sendTextWithPause(editWnd, "The show is over. Good bye in several seconds.") +j = sendKeyWithPause(editWnd, "RETURN") + +-- Get a WindowsManager object, we'll use it below to cancel the Save dialog. +winMgr = .WindowsManager~new + +-- The Notepad interface is much changed in Vista. +if isVistaOrLater() then buttonName = "Do&n't Save" +else buttonName = "&No" + +-- Pause a little bit to allow the user to read the text. +j = SysSleep(5) + +-- Close Notepad by using the Close item in the system menu of the application. +np~SendSysCommand("Close") + +/* When Notepad closes, it will put up a dialog asking if we want to save the + * changes we just wrote to a file. We will wait a second for the dialog and + * then use the No button (Don't Save button in Vista) to discard our text. + * + * Vista has made this rather interesting. With the Vista Notepad Save dialog, + * the buttons are not immediate children of the dialog. Rather the buttons are + * several layers deep in the window hierarchy. Therefore we need to use the + * findDescendent() function to locate the proper button. + * + * Initially, functions like getWindowTree() and showWindowTree() or + * printWindowTree() were very useful in discovering the interface changes in + * Notepad on Vista. + */ + +-- Wait a second and then grab the foreground window. If we get a window and +-- the window has the title of Notepad, we will assume it is the Save dialog. +-- If we encounter errors, inform the user as to what they were. +j = SysSleep(1) +fg = winMgr~ForegroundWindow +if fg \== .nil, fg~title = "Notepad" then do + j = SysSleep(.1) + + -- Display the window hierarchy of the Save dialog. + tree = getWindowTree(fg) + success = showWindowTree(tree) + + -- Get the No or Don't Save button. Then set the focus to the button and + -- send the space key to it. This simulates a user pushing the button and + -- has the effect of closing Notepad automatically. + button = findDescendent(fg, buttonName) + if button \== .nil then do + fg~focusItem(button) + button~SendKey("SPACE") + end + else do + msg = 'Could not locate the' buttonName~changestr('&', "") 'button used to ' || '0d0a'x || - + 'discard the text changes. findDescendent() failed' || '0d0a0d0a'x || - + 'You will have to close the Notepad windows manually.' + j = errorDialog(msg) + end +end +else do + msg = 'Failed to connect with the Save Dialog for Notepad' || '0d0a0d0a'x || - + 'You may have to close the Notepad windows manually.' + j = errorDialog(msg) +end + +return 0 + +::requires "windowsSystem.frm" diff --git a/modules/windows/rexutils/drives.rex b/modules/windows/rexutils/drives.rex new file mode 100755 index 0000000..854a078 --- /dev/null +++ b/modules/windows/rexutils/drives.rex @@ -0,0 +1,253 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* https://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/*****************************************************************************/ +/* Name: DRIVES.REX */ +/* Type: Open Object Rexx Script */ +/* */ +/* Description: Sample program to display information about drives using the */ +/* Open Object Rexx utility functions SysDriveMap, SysDriveInfo,*/ +/* SysFileSystemType, SysBootDrive */ +/* */ +/*****************************************************************************/ + + +/*****************************************************************************/ +/* Main Programm */ +/*****************************************************************************/ +parse arg InputDrives -- get the input -- + -- +Drives. = "" -- initialize Drives stem -- + -- +call CheckInput -- check input -- + -- +call InfoParsing -- get and parse the drive data -- +call InfoDisplay "BOX" -- display data with box characters -- +--call InfoDisplay "LINE" -- display data without box characters -- + +exit + +/*****************************************************************************/ +/* Procedure : InfoParsing */ +/* */ +/* Description : Get the informations of each drive using the Object REXX */ +/* utility functions. */ +/* */ +/* Parameters : EXPOSE: Drives. - stem to hold all drives informations */ +/* */ +/*****************************************************************************/ +InfoParsing: PROCEDURE EXPOSE Drives. + +UsedDrives = SysDriveMap() -- get all used drives -- + -- +RemoteDrives = SysDriveMap(, 'REMOTE') -- get all remote drives -- + -- +do i = 1 to Drives.0 -- loop over all drives -- + DriveInfo = SysDriveInfo(Drives.i.InputLetter) -- get drive information -- + -- + parse var DriveInfo, -- parse ... -- + Drives.i.OutputLetter, -- drive letter -- + Drives.i.Free, -- free space -- + Drives.i.Total, -- total space -- + Drives.i.Label -- label -- + -- + Drives.i.Label = strip(Drives.i.Label) -- eliminate spaces -- + Drives.i.Free = BeautifyNumber(Drives.i.Free) -- enhance readability of -- + Drives.i.Total = BeautifyNumber(Drives.i.Total) -- the numbers -- + + if Drives.i.OutputLetter = "" & pos(Drives.i.InputLetter, UsedDrives) >0 then do + -- This is a CD-ROM drive, set the label and the drive letter + Drives.i.Label = "CD-ROM" + Drives.i.OutputLetter = Drives.i.InputLetter + end + else do + -- if no available drive set all information data to unknown + if pos(Drives.i.InputLetter, UsedDrives) = 0 then do + Drives.i.OutputLetter = Drives.i.InputLetter + Drives.i.Label = "Unknown-Drive" + Drives.i.Free = "???" + Drives.i.Total = "???" + Drives.i.Location = "???" + Drives.i.Filesys = "???" + end + else do + -- check for remote or local drive + if pos(Drives.i.OutputLetter, RemoteDrives) > 0 then + Drives.i.Location = "remote" + else + Drives.i.Location = "local" + -- get the file system + Drives.i.Filesys = SysFileSystemType(Drives.i.OutputLetter) + end + end +end + +return + + +/*****************************************************************************/ +/* */ +/* Procedure : CheckInput */ +/* */ +/* Description : if no input specified, get all available drives */ +/* parse the input string and ignore all characters which are */ +/* not alphanumeric */ +/* save all alphanumeric characters to "Drives" stem */ +/* */ +/* Parameters : EXPOSE : InputDrives - string from the input */ +/* Drives. - stem for dirves information */ +/* */ +/*****************************************************************************/ + +CheckInput: PROCEDURE EXPOSE InputDrives Drives. + + +if InputDrives = "" then + InputDrives = SysDriveMap() + +InputDrives = translate(InputDrives,' ', ':') +j = 1 +do i = 1 to length(InputDrives) + Drive = substr(InputDrives,i,1) + if datatype(Drive,'A') = 1 then + if datatype(Drive,'N') = 0 then do + Drives.j.InputLetter = translate(Drive) || ":" + Drives.0 = j + j = j + 1 + end +end + +return + + +/*****************************************************************************/ +/* */ +/* Procedure : BeautifyNumber */ +/* */ +/* Description : Insert dots to the numer for better readability like : */ +/* 2.000.000 instead of 2000000 */ +/* */ +/* Parameters : in : Number - number to be beautified */ +/* return : beautified number */ +/* */ +/*****************************************************************************/ +BeautifyNumber: PROCEDURE + +use arg Number + +do i = (length(Number)-3) to 1 by -3 + Number = insert('.', Number, i) +end + +return Number + + +/*****************************************************************************/ +/* */ +/* Procedure : InfoDisplay */ +/* */ +/* Description : Display all drive information in a well formatted form */ +/* */ +/* Parameters : EXPOSE : Drives. - stem which hold all drive information */ +/* in : DisplayType : "BOX" - use box characters */ +/* "" - use box characters */ +/* "LINE" - use '-' */ +/* and '|' */ +/* */ +/*****************************************************************************/ +InfoDisplay: PROCEDURE EXPOSE Drives. + +use arg DisplayType + +-- set the lines for drawing in dependency of the dislay type +if DisplayType = "BOX" | type = "" then do + -- use box characters to display vertical and horizontal lines + DisplayType = "BOX" + HorizontalLine = "ÚÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿" + MidleLine = "ÃÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄ´" + EndLine = "ÀÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÙ" + Vb = "³" -- verical bar character +end +else do + -- use '-' and '|' characters to draw vertical and horizontal lines + HorizontalLine = copies("-", 76) + Vb = "|" +end + +-- display and format the drive information +say HorizontalLine + +say Vb || CENTER('Drive' ,5) ||, + Vb || CENTER('Free' ,16) ||, + Vb || CENTER('Total',16) ||, + Vb || CENTER('Label',14) ||, + Vb || CENTER('Location',8) ||, + Vb || CENTER('Filesystem',10)||, + Vb + +if DisplayType = "BOX" then HorizontalLine = MidleLine + +say HorizontalLine + +do i=1 to Drives.0 + say Vb || CENTER(Drives.i.OutputLetter,5)||, + Vb || right(Drives.i.Free,15) , + Vb || RIGHT(Drives.i.Total,15) , + Vb LEFT(Drives.i.Label,13) ||, + Vb LEFT(Drives.i.Location,7) ||, + Vb LEFT(Drives.i.Filesys,9) ||, + Vb +end + +if DisplayType = "BOX" then HorizontalLine = EndLine + +say HorizontalLine + +-- display additional information +RamDrives = SysDriveMap(,'RAMDISK') +if RamDrives = "" then RamDrives = "No RAM Drives" + +say "" +say "Operating System Version : "SysVersion() +say "Bootdrive : "SysBootDrive() +say "Used drives : "SysDriveMap(,'USED') +say "Local drives : "SysDriveMap(,'LOCAL') +say "RAM drives : "RamDrives +say "Remote drives : "SysDriveMap(,'REMOTE') +say "Drive letters not used : "SysDriveMap(,'FREE') + +return diff --git a/projects/mvs/dasducb.rex b/projects/mvs/dasducb.rex new file mode 100644 index 0000000..66b2b02 --- /dev/null +++ b/projects/mvs/dasducb.rex @@ -0,0 +1,15 @@ +/* testing dasducb */ + +ADDRESS TSO 'RX SYS2.EXEC(DASDUCB)'; /* retrieve dasd information */ + +'EXECIO * DISKR STEMTMP (STEM cuu.' + +DO ix=1 BY 1 TO cuu.0 + PARSE VAR cuu.ix WITH cuu_addr'~'cuu_volser'~'cuu_type'~'cuu_class'~'; + SAY 'CUU: ' cuu_addr , + 'Volume:' cuu_volser , + 'Type: ' cuu_type , + 'Class: ' cuu_class; +END; +ADDRESS TSO 'RX SYS2.EXEC(DSTEMTMP)' +EXIT; diff --git a/projects/mvs/who.rex b/projects/mvs/who.rex new file mode 100644 index 0000000..982cbd4 --- /dev/null +++ b/projects/mvs/who.rex @@ -0,0 +1,16 @@ +/*REXX*/ + +sysuid = sysvar("sysuid") +syspref = sysvar("syspref") +sysproc = sysvar("sysproc") +if syspref = "" then syspref="**NOPREFIX**" +say " userid="sysuid", syspref="syspref", proc="sysproc +terminal = gettrid() +say " VTAM Terminal ID="terminal + +/* LOCATION -- TELLS USER WHERE LOGGEDON ON */ +/* SYSUID -- USER'S IDENTIFICATION */ +/* SYSPREF -- DATA SET NAME PREFIX WHICH THE USER SETS */ +/* USING THE PROFILE COMMAND */ +/* SYSPROC -- LOGON PROCEDURE NAME */ +/* TERMINAL-- VTAM TERMINAL ID AS FOUND BY GETTRID */ \ No newline at end of file diff --git a/projects/oorexx/1plus1.rex b/projects/oorexx/1plus1.rex new file mode 100644 index 0000000..345f008 --- /dev/null +++ b/projects/oorexx/1plus1.rex @@ -0,0 +1,2 @@ +Say '1'+'1' +Say "2" * 2 diff --git a/projects/oorexx/address-test.rex b/projects/oorexx/address-test.rex new file mode 100644 index 0000000..56ce945 --- /dev/null +++ b/projects/oorexx/address-test.rex @@ -0,0 +1,7 @@ +/* Rexx */ + +Address "zsh" "ls -lA" With output stem dir. + +Do i = 1 to dir.0 + say dir.i +end diff --git a/projects/oorexx/contacts.rdbx b/projects/oorexx/contacts.rdbx new file mode 100644 index 0000000..e69de29 diff --git a/projects/oorexx/dist.rex b/projects/oorexx/dist.rex new file mode 100644 index 0000000..b630fd3 --- /dev/null +++ b/projects/oorexx/dist.rex @@ -0,0 +1,56 @@ +/* ---------------------------------------------------------------- */ +/* Calculates the distance between (possibly a series) of */ +/* 2 latitude/longitude pairs. May be used in a pipe. */ +/* ---------------------------------------------------------------- */ +Call RxFuncAdd "MathLoadFuncs","rxmath","MathLoadFuncs" +Call MathLoadFuncs + +/* ---------------------------------------------------------------- */ +/* The following formula's can be used to calculate the distance */ +/* between two points on earth: */ +/* */ +/* d=R*acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2)) */ +/* */ +/* or */ +/* */ +/* d=R*2*asin(sqrt((sin((lat1-lat2)/2))^2 + cos(lat1)*cos(lat2)* */ +/* (sin((lon1-lon2)/2)^2)) */ +/* */ +/* where */ +/* */ +/* R -- the radius of the earth, commonly taken to be: 6378,137 km */ +/* lat1/lat2 -- latitude in degrees (NOT degrees minutes seconds) */ +/* lon1/lon2 -- longitude in degrees (NOT degrees minutes seconds */ +/* */ +/* The first formula is more subject to possible rounding errors */ +/* for short distances and since the route description produced by */ +/* Google Earth/Maps often has points within a couple of meters */ +/* this code uses the second formula. */ +/* */ +/* ---------------------------------------------------------------- */ + +/* -oldradius = 6366710 */ +googleradius = 6378137 /* -- Equatorial earth radius used by Google */ + +Say "Enter 4 values. (FROM) latitude longitude (TO) latitude longitude:" +Parse Value Linein() With flat flon tlat tlon +If (tlat<>'' & tlon<>'') Then Say Distance(flat,flon,tlat,tlon) +Do While Lines()>0 + Parse Value Linein() With tlat tlon . + Say Distance(flat,flon,tlat,tlon) + flat = tlat + flon = tlon +End +Exit + +Distance: Procedure Expose googleradius + Parse Arg flat, flon, tlat, tlon + sinlat = RxCalcSin((flat-tlat)/2) + cosplat = RxCalcCos(flat) + coslati = RxCalcCos(tlat) + sinlon = RxCalcSin((flon-tlon)/2) + sinlatp = (sinlat)**2 + sinlonp = (sinlon)**2 + radians = 2*RxCalcArcSin(RxCalcSqrt(sinlatp + cosplat*coslati*sinlonp),,'R') + distance = (radians*googleradius)~format(,0)/1000 'km' +Return distance /* -- returns distance in thousands of a Km */ diff --git a/projects/oorexx/drawbox.rex b/projects/oorexx/drawbox.rex new file mode 100755 index 0000000..c613faf --- /dev/null +++ b/projects/oorexx/drawbox.rex @@ -0,0 +1,23 @@ +#!/usr/bin/env rexx +/* drawbox.rex - Draw an ncurses box using ooRexx nCurses library */ + +do + /* call ORXCURINITSCR / Initialize ncurses / + call OrxCurNoecho / Disable echoing / + call OrxCurCbreak / Enable immediate input / + */ + /* Create a window: height, width, start_y, start_x */ + win = OrxCurNewwin(10, 20, 5, 10) + call OrxCurBox win, 0, 0 /* Draw box with default ACS characters */ + call OrxCurWrefresh win /* Display the window */ + + call OrxCurGetch /* Wait for keypress */ + call OrxCurEndwin /* Clean up */ +end + +catch error + say "Error:" error~message + call OrxCurEndwin /* Ensure cleanup on error */ +exit + +::requires "ncurses.cls" \ No newline at end of file diff --git a/projects/oorexx/experiment.rex b/projects/oorexx/experiment.rex new file mode 100755 index 0000000..5d66b44 --- /dev/null +++ b/projects/oorexx/experiment.rex @@ -0,0 +1,17 @@ +#!/usr/bin/env rexx +/*************************************************************************/ + + call RxFuncAdd "OrxCurInitscr", "orxncurses", "OrxCurInitscr" + call RxFuncAdd "OrxCurEndwin", "orxncurses", "OrxCurEndwin" + +scr = .Window~new() +scr~clear() +scr~beep() +scr~addstr('I said ATTENTION!') +scr~flash() + + +exit + +/***************** REQUIRES **********************************************/ +::requires "orxncurses" LIBRARY; \ No newline at end of file diff --git a/projects/oorexx/hello.rex b/projects/oorexx/hello.rex new file mode 100644 index 0000000..d55d776 --- /dev/null +++ b/projects/oorexx/hello.rex @@ -0,0 +1,41 @@ +/* Rexx +call RxFuncAdd 'SysGetPid', 'rxunixsys', 'SysGetPid' +call RxFuncAdd 'SysGethostname', 'rxunixsys', 'SysGethostname' +call RxFuncAdd 'SysUname', 'rxunixsys', 'SysUname' +*/ +If RxFuncQuery("SockDropFuncs") then + do + rc = RxFuncAdd("SockLoadFuncs","rxsock","SockLoadFuncs") + rc = SockLoadFuncs() + end + +Say 'Hello, World!' +Say "This PID : " || SysGetPid() +Say "Parent PID : " || SysGetppid() +Say "Hostname : " || SysGethostname() +Say "Platform : " || SysUname() || "." || SysUname("m") +Say "Kernel : " || SysUname("r") +Say "RxSock : " || SockVersion() +Say "OrxNcurses : " || .window~orxncurses_version +say .ooSQLite~version('F') + +Say "The Square Root of 194 is: " || RxCalcSqrt(194,2) + +srcConn = .ooSQLiteConnection~new("contacts.rdbx") +srcConn~busyTimeout(3000) +bu = .ooSQLiteBackup~new(srcConn, ":memory:", .true) +if bu~initCode <> bu~OK then + do + say 'Error opening backup object:' bu~lastErrCode bu~lastErrMsg + srcConn~close + return 99 + end + +exit + +/*** import ***/ +::requires 'ooSQLite.cls' +::requires 'ncurses.cls' +::requires 'rxmath' LIBRARY +::requires "rxunixsys" LIBRARY + diff --git a/projects/oorexx/minimal_ncurses.rex b/projects/oorexx/minimal_ncurses.rex new file mode 100755 index 0000000..bb5b2bb --- /dev/null +++ b/projects/oorexx/minimal_ncurses.rex @@ -0,0 +1,16 @@ +#!/usr/bin/env rexx +/* minimal_ncurses.rex - Draw a box using raw ncurses functions */ + +do + call initscr + call noecho + call cbreak + win = newwin(10, 20, 5, 10) + call box win, 0, 0 + call wrefresh win + call getch + call endwin +end +Exit + +::requires "ncurses.cls" diff --git a/projects/oorexx/mouse_thing.rex b/projects/oorexx/mouse_thing.rex new file mode 100755 index 0000000..5c4dc64 --- /dev/null +++ b/projects/oorexx/mouse_thing.rex @@ -0,0 +1,22 @@ +#!/usr/bin/env rexx + +scr = .window~new() +scr~noecho() +scr~keypad(.true) + +mmask = scr~mousemask(scr~ALL_MOUSE_EVENTS) + +do forever + ch = scr~getch() + if ch = scr~KEY_MOUSE then do + mort = scr~getmouse() + scr~move(1, 1) + scr~clrtoeol() + scr~addstr(mort~y || '/' || mort~x) + scr~refresh() + end + if ch = lf then leave +end +Exit + +::requires 'ncurses.cls' diff --git a/projects/oorexx/move_demo.rex b/projects/oorexx/move_demo.rex new file mode 100755 index 0000000..3b2f53c --- /dev/null +++ b/projects/oorexx/move_demo.rex @@ -0,0 +1,16 @@ +#!/usr/bin/env rexx + +scr = .window~new() +maxyx = scr~getmaxyx() +parse var maxyx maxy maxx . +scr~scrollok(.true) + +do y = 1 to maxy + scr~mvaddstr(y, 1, "This is boring text written to line" y) +end + +scr~getch() + +exit + +::requires 'ncurses.cls' diff --git a/projects/oorexx/ncurses_test.rex b/projects/oorexx/ncurses_test.rex new file mode 100755 index 0000000..af3d1f1 --- /dev/null +++ b/projects/oorexx/ncurses_test.rex @@ -0,0 +1,22 @@ +#!/usr/bin/env rexx +/* test_50cls.rex */ + +scr = .window~new() +scr~start_color() +scr~init_pair(1, scr~COLOR_WHITE, scr~COLOR_BLUE) +msg = " OrxNcurses Version: "||.window~orxncurses_version() +scr~cbreak +scr~noecho +scr~box('|'~c2d(), '-'~c2d()) +scr~beep() +win = scr~subwin(10, 40, 5, 10) +win~box(0, 0) +win~refresh +win~move(2,2) +win~insstr(msg) +/* win~insch(msg)*/ +/* win~addstr(msg)*/ +scr~getch +scr~endwin +exit +::requires "ncurses.cls" diff --git a/projects/oorexx/probe_orxncurses.rex b/projects/oorexx/probe_orxncurses.rex new file mode 100755 index 0000000..0149caf --- /dev/null +++ b/projects/oorexx/probe_orxncurses.rex @@ -0,0 +1,19 @@ +#!/usr/bin/env rexx +/* probe_orxncurses.rex - Test the orxncurses library API */ + +/* Main program */ +do + /* Try version check from docs */ + msg = "Orxncurses version: " || .window~orxncurses_version() + + /* Test basic initialization */ + scr = .window~new() + scr~addstr(msg) + scr~refresh() + scr~getch() + scr~endwin() +end + +exit + +::requires "ncurses.cls" diff --git a/projects/oorexx/rexxcurl.rexx b/projects/oorexx/rexxcurl.rexx new file mode 100644 index 0000000..009f76f --- /dev/null +++ b/projects/oorexx/rexxcurl.rexx @@ -0,0 +1,13 @@ +/* + * This is a demo program for Rexx/CURL + */ +Call RxFuncAdd 'CurlLoadFuncs', 'rexxcurl', 'CurlLoadFuncs' +Call CurlLoadFuncs + +Say 'This is Rexx/CURL:' CurlVariable('VERSION') + +Call CurlQueryFunction 'out.','A' +Say 'Available functions:' +Do i = 1 To out.0 + Say ' 'out.i +End diff --git a/projects/oorexx/stuff.rex b/projects/oorexx/stuff.rex new file mode 100644 index 0000000..3acae26 --- /dev/null +++ b/projects/oorexx/stuff.rex @@ -0,0 +1,21 @@ +/* Rexx */ +Call RxFuncAdd 'SysCrypt', 'rxunixsys','SysCrypt' + +my_msg = "This is a test message I would like to encrypt" +my_salt = get_salt(16) /* the width of the salt. E.g. 16 is for SHA-512 */ +enc_msg = SysCrypt(my_msg, my_salt) + +Say "My Message: " || my_msg +Say "Salt: " || salt +Say "Encrypted: " || enc_msg + +exit + +get_salt: + parse arg width + salt = "" + Loop x = 1 to width + chr = d2c(random(65,90)) /* Alpha Chars A...Z */ + salt = salt || chr + End /* loop */ +return salt diff --git a/projects/oorexx/test.rex b/projects/oorexx/test.rex new file mode 100755 index 0000000..151f9c0 --- /dev/null +++ b/projects/oorexx/test.rex @@ -0,0 +1,4 @@ +say SysGetpwnam('gmgauthier','r') +say "Test complete" +exit +::requires "rxunixsys" LIBRARY diff --git a/projects/oorexx/test_getrexxpackage.rex b/projects/oorexx/test_getrexxpackage.rex new file mode 100755 index 0000000..25f244b --- /dev/null +++ b/projects/oorexx/test_getrexxpackage.rex @@ -0,0 +1,14 @@ +#!/usr/bin/env rexx +/* test_rexxgetpackage.rex */ +do + pkg = RexxGetPackage("orxncurses") + if pkg \= .nil then say "Package: " pkg + else say "No package returned" + call OrxCurInitscr + call OrxCurEndwin +end +catch error + say "Error:" error~message +exit + +::requires "orxncurses" LIBRARY diff --git a/projects/oorexx/test_init.rex b/projects/oorexx/test_init.rex new file mode 100755 index 0000000..d77ef17 --- /dev/null +++ b/projects/oorexx/test_init.rex @@ -0,0 +1,23 @@ +#!/usr/bin/env rexx +/* test_init.rex - Test library initialization */ + +do + /* Register a simple function */ + call RxFuncAdd "OrxCurVersion", "orxncurses", "OrxCurVersion" + + /* Test it */ + version = OrxCurVersion() + say "Version: " version + + /* Try initializing ncurses */ + call RxFuncAdd "OrxCurInitscr", "orxncurses", "OrxCurInitscr" + call RxFuncAdd "OrxCurEndwin", "orxncurses", "OrxCurEndwin" + call OrxCurInitscr + say "Initscr worked!" + call OrxCurEndwin +end + +catch error + say "Error:" error~message + call OrxCurEndwin +exit diff --git a/projects/oorexx/test_orxncurses.rex b/projects/oorexx/test_orxncurses.rex new file mode 100755 index 0000000..11a94b6 --- /dev/null +++ b/projects/oorexx/test_orxncurses.rex @@ -0,0 +1,26 @@ +#!/usr/bin/env rexx +/* test_orxncurses.rex - Test library initialization and basic function */ + +/* Call RxFuncAdd "OrxNcurses","orxncurses","OrxNcurses" */ + +do + /* Try to register the package */ + pkg = RexxGetPackage("orxncurses") + if pkg \= .nil then say "Package registered: " pkg + else say "Package registration failed" + + /* Test a simple function */ + version = OrxCurVersion() + say "Orxncurses version: " version + + /* Try initializing ncurses */ + call OrxCurInitscr + say "Initscr succeeded!" + call OrxCurEndwin +end + +catch error + say "Error:" error~message +exit + +/* ::requires "orxncurses" LIBRARY */ \ No newline at end of file diff --git a/projects/oorexx/test_rxfuncadd.rex b/projects/oorexx/test_rxfuncadd.rex new file mode 100755 index 0000000..8823430 --- /dev/null +++ b/projects/oorexx/test_rxfuncadd.rex @@ -0,0 +1,18 @@ +#!/usr/bin/env rexx +/* test_rxfuncadd.rex - Test RxFuncAdd with new orxncurses */ + +do + /* Register functions */ + call RxFuncAdd "OrxCurInitscr", "orxncurses", "OrxCurInitscr" + call RxFuncAdd "OrxCurEndwin", "orxncurses", "OrxCurEndwin" + + /* Test initialization */ + call OrxCurInitscr + say "Initscr worked!" + call OrxCurEndwin +end + +catch error + say "Error:" error~message + call OrxCurEndwin +exit diff --git a/projects/oorexx/text-attrs.rex b/projects/oorexx/text-attrs.rex new file mode 100755 index 0000000..16e86bc --- /dev/null +++ b/projects/oorexx/text-attrs.rex @@ -0,0 +1,26 @@ +#!/usr/bin/env rexx + +::requires "ncurses.cls" + +lf = .window~ASCII_LF~d2c() +bs = .window~ASCII_BS~d2c() + +text = .array~of('Do', 'you', 'find', 'this', 'silly?') + +scr = .window~new() +do a = 1 to text~items() + do b = 1 to text~items() + if b = a then scr~attrset(scr~A_BOLD + scr~A_UNDERLINE) + scr~addstr(text[b]) + if b = a then scr~attroff(scr~A_BOLD + scr~A_UNDERLINE) + scr~addch(' ') + end + scr~addstr(bs || lf) +end + +/* Forces a pause to wait for input. Poor man's wait. */ +scr~getch +scr~endwin + +Exit + diff --git a/projects/text/jabberwocky.txt b/projects/text/jabberwocky.txt new file mode 100644 index 0000000..fd03221 --- /dev/null +++ b/projects/text/jabberwocky.txt @@ -0,0 +1,38 @@ +Jabberwocky + +'Twas brillig, and the slithy toves +Did gyre and gimble in the wabe: +All mimsy were the borogoves, +And the mome raths outgrabe. + +'Beware the Jabberwock, my son! +The jaws that bite, the claws that catch! +Beware the Jubjub bird, and shun +The frumious Bandersnatch!' + +He took his vorpal sword in hand: +Long time the manxome foe he sought -- +So rested he by the Tumtum tree, +And stood a while in thought. + +And, as in uffish thought he stood, +The Jabberwock, with eyes of flame, +Came whiffling through the tulgey wood, +And burbled as it came! + +One two! One two! And through and through +The vorpal blade went snicker-snack! +He left it dead, and with its head +He went galumphing back. + +'And hast thou slain the Jabberwock? +Come to my arms, my beamish boy! +Oh frabjous day! Callooh! Callay!' +He chortled in his joy. + +'Twas brillig, and the slithy toves +Did gyre and gimble in the wabe: +All mimsy were the borogoves, +And the mome raths outgrabe. + +Lewis Carroll diff --git a/samples/mvs/addcmds.rex b/samples/mvs/addcmds.rex new file mode 100644 index 0000000..c325672 --- /dev/null +++ b/samples/mvs/addcmds.rex @@ -0,0 +1,161 @@ +/* REXX ADDCMDS Add one command table to the currently-resident + copy of ISPCMDS. The user's personal command + table may thus be dynamically spliced to ISPCMDS. + Changes to the user's personal command table may + be implemented at any time by re-running this. + + Written by Frank Clarke in the Dark Ages + + Impact Analysis +. SYSPROC TRAPOUT + + Modification History + 19981027 fxc REXXSKEL at last, v.19980225; + 19991117 fxc upgrade from v.19980225 to v.19991109; + +*/ arg argline +address ISPEXEC /* REXXSKEL ver.19991109 */ +arg parms "((" opts + +signal on syntax +signal on novalue + +call TOOLKIT_INIT /* conventional start-up -*/ +rc = trace(tv) +info = parms /* to enable parsing */ + +"CONTROL ERRORS RETURN" /* I'll handle my own errors */ +call A_INIT /* -*/ +call B_TABLE_OPS /* -*/ + +exit /*@ ADDCMDS */ +/* +. ----------------------------------------------------------------- */ +A_INIT: /*@ */ + if branch then call BRANCH + address ISPEXEC + + parse value "0 0" with, + adds dels del_list + parse value info exec_name with, + tblname . + if tblname = "ADDCMDS" then tblname = "TMPCMDS" + if Length(tblname) < 5 then tblname = tblname"CMDS" + if monitor then say, + "Using" tblname + +return /*@ A_INIT */ +/* +. ----------------------------------------------------------------- */ +B_TABLE_OPS: /*@ */ + if branch then call BRANCH + address ISPEXEC + + "TBQUERY" tblname /* tell me about this table */ + if rc > 12 then do /* doesn't exist, maybe ? */ + zerrsm = "TBQUERY error" + if Symbol("zerrlm") = "LIT" then, + zerrlm = "No additional diagnostics produced." + zerrlm = exec_name "("BRANCH("ID")")", + zerrlm + address ISPEXEC "SETMSG MSG(ISRZ002)" + sw.0error_found = "1"; return + drop zerrlm /* make it a LIT again */ + end + + if rc = 12 then "TBOPEN" tblname "NOWRITE" /* 12 = 'not open' */ + + "TBSORT" tblname "FIELDS(ZCTVERB,C,D)" + do forever /* for every row in the table */ + "TBSKIP" tblname /* get next row */ + if rc > 0 then leave + if monitor then say, + " Working" zctverb + do forever /* found a match on ISPCMDS */ + "TBSCAN ISPCMDS NOREAD ARGLIST(ZCTVERB) CONDLIST(EQ)" + if rc > 0 then leave + if monitor then say, + " Delete from ISPCMDS" + "TBDELETE ISPCMDS" /* get rid of it */ + del_list = del_list zctverb /* make note of it */ + dels = dels + 1 /* count a deleted row */ + end /* forever (inner) */ + "TBADD ISPCMDS" /* ... add a new line */ + adds = adds + 1 /* count an added row */ + "TBTOP ISPCMDS" /* reposition to row 0 */ + end /* forever (outer) */ + + "TBEND " tblname /* close and end */ + + if sw.0show then do /* user asked for a list */ + "TBTOP ISPCMDS" /* reset to top */ + do forever + "TBSKIP ISPCMDS" /* get another row */ + if rc > 0 then leave /* end of table */ + say Left(zctverb,8) Right(zcttrunc,2) Left(zctact,66) + say " " Left(zctdesc,72) + end /* forever */ + end /* SHOW */ + + ZERRSM = "A="adds "D="dels /* short message */ + ZERRLM = adds "lines were added;" dels "lines deleted." + if dels <> 0 & ABS(adds-dels) > 1 then do + ZERRSM = ZERRSM "(!)" + ZERRLM = ZERRLM "Deleted verbs:" del_list + ZERRALRM = "YES" + end + else ZERRALRM = "NO" + address ISPEXEC "SETMSG MSG(ISRZ002)" + +return /*@ B_TABLE_OPS */ +/* +. ----------------------------------------------------------------- */ +LOCAL_PREINIT: /*@ customize opts */ + address TSO + + sw.0show = SWITCH("SHOW") /* user asked for a list ? */ + +return /*@ LOCAL_PREINIT */ +/* +. ----------------------------------------------------------------- */ +HELP: /*@ */ +address TSO;"CLEAR" +if helpmsg <> "" then do ; say helpmsg; say ""; end +ex_nam = Left(exec_name,8) /* predictable size */ +say " "ex_nam" adds a user-command-table to the in-storage copy " +say " of ISPCMDS. Any existing command-table entries " +say " with matching names are deleted before the new " +say " commands are added. " +say " " +say " Syntax: "ex_nam" [cmd-tbl-name] (Defaults)" +say " (( [SHOW] " +say " " +say " " +say " If cmd-tbl-name is not specified, the name defaults " +say " to 'TMPCMDS' for execname=ADDCMDS, and to the name of" +say " the routine for any aliases. " +pull +"CLEAR" +say " Debugging tools provided include:" +say " " +say " MONITOR: displays key information throughout processing." +say " Displays most paragraph names upon entry." +say " " +say " NOUPDT: by-pass all update logic." +say " " +say " BRANCH: show all paragraph entries." +say " " +say " TRACE tv: will use value following TRACE to place" +say " the execution in REXX TRACE Mode." +say " " +say " " +say " Debugging tools can be accessed in the following manner:" +say " " +say " TSO" exec_name" parameters (( debug-options" +say " " +say " For example:" +say " " +say " TSO" exec_name " (( MONITOR TRACE ?R" +address ISPEXEC "CONTROL DISPLAY REFRESH" +exit /*@ HELP */ +/****** REXXSKEL back-end removed to save space. *******/ \ No newline at end of file diff --git a/samples/mvs/alist.rex b/samples/mvs/alist.rex new file mode 100644 index 0000000..9a2da3f --- /dev/null +++ b/samples/mvs/alist.rex @@ -0,0 +1,389 @@ +/* REXX ALIST Display the user's current allocations + + Written by Frank Clarke, Oldsmar, FL + |**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**| + | | + | WARNING: EMBEDDED COMPONENTS. | + | | + |**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**| +*/ +address TSO /* default address */ +tv = "" +signal on syntax +parse source sys_id how_invokt exec_name DD_nm DS_nm as_invokt cmd_env, + addr_spc usr_tokn +if ds_nm <> "?" then do /* explicit invocation */ + say exec_name "cannot be invoked explicitly." + say " " + say " It must be part of your SYSPROC or SYSEXEC allocation," + say " and invoked implicitly because it requires ISPF facilities" + say " and these are incompatible with a command library which is" + say " not part of your defined environment." + say " " + exit + end +if Sysvar("sysispf") = "NOT ACTIVE" then do + arg line + line = line "(( RESTARTED" /* tell the next invocation */ + "ISPSTART CMD("exec_name line")" /* Invoke ISPF if nec. */ + exit /* ...and restart it */ + end + +arg target "((" opts +opts = Strip( opts , "T" , ")" ) /* clip trailing paren */ +if Word(target,1) = "?" then call HELP /* ...and don't come back */ + +parse var opts "TRACE" tv . +parse value tv "O" with tv . +rc = Trace(tv) +address ISPEXEC /* default address for ISPF */ +"CONTROL ERRORS RETURN" + +call A_INIT /* -*/ +call B_GET_ALLOCATIONS /* -*/ +call C_LOAD_TABLE /* -*/ +call D_TABLE_OPS /* -*/ +call E_REDO_ALLOC /* -*/ + +exit /*@ ALIST */ +/* +. ----------------------------------------------------------------- */ +A_INIT: /*@ */ + address TSO + + restarted = WordPos("RESTARTED",opts)>0/* called from READY-mode ? */ + parse value "0 ISR00000 YES" with, + got_one zerrhm zerralrm zerrsm zerrlm + t_nam = "T"Right(Time(s),5,0) /* T32855 maybe #*/ + + parse value "?" with, + ddname dsnames. disp. tk_globalvars , + ddlist , + . + +return /*@ A_INIT */ +/* +. ----------------------------------------------------------------- */ +B_GET_ALLOCATIONS: /*@ */ + address TSO + + tgt_list = "" + + do ii = 1 to Words(target) /* for every target spec */ + this_tgt = Word(target,ii) + if this_tgt = "ISPF" then, /* expand ISPF */ + tgt_list = tgt_list "ISPPLIB ISPMLIB ISPSLIB ISPTLIB", + "ISPTABL ISPLLIB ISPPROF" + else, + if this_tgt = "CMDS" |, /* expand CMDS */ + this_tgt = "COMMANDS" then, + call BA_Q_ALTLIB /* -*/ +/* tgt_list = tgt_list "SYSPROC SYSEXEC" */ + else, /* just add to the list */ + tgt_list = tgt_list this_tgt + end /* ii */ + + ln. = "" /* setup array */ + rc = Outtrap("ln.") /* open trap */ + "LISTA ST" + rc = Outtrap("off") /* close trap */ + call BB_GET_STACKS /* -*/ + + dds_to_realloc = "" + ds_stack. = "" + redo_alloc = "0" + +return /*@ B_GET_ALLOCATIONS */ +/* +. ----------------------------------------------------------------- */ +BA_Q_ALTLIB: /*@ */ + address TSO + + $x = Outtrap("alt.") /* set up outtrap */ + "ALTLIB DISPLAY" /* get ddname-list */ + $x = Outtrap("OFF") /* release trap */ + + do bax = 1 to alt.0 + parse var alt.bax "DDNAME=" baxddn . + tgt_list = tgt_list baxddn + end /* bax */ + +return /*@ BA_Q_ALTLIB */ +/* + Build lists of DSNames by DDName and store in a stem array indexed + by DDName. +. ----------------------------------------------------------------- */ +BB_GET_STACKS: /*@ */ + address TSO + /* Build DDName stack */ + do bbx = 1 to ln.0, /* for each trapped line */ + until Substr(ln.bbx,1,1) <> "-" /* ...skip the header */ + end /* bbx */ + + start = bbx + do bbx = start to ln.0 /* for each trapped line */ + if Left(ln.bbx,1) = ' ' then do /* it's a DDname */ + if Substr(ln.bbx,3,1) <> " " then do /* new DDName */ + parse var ln.bbx ddname disp . + ddlist = ddlist ddname + end /* DDName */ + dsnames.ddname = dsnames.ddname dsname + disp.ddname = disp + end /* DDname */ + else dsname = Word(ln.bbx,1) /* it's a DSName */ + end /* bbx */ + +return /*@ BB_GET_STACKS */ +/* +. ----------------------------------------------------------------- */ +C_LOAD_TABLE: /*@ */ + address ISPEXEC + + if tgt_list = "" then tgt_list = ddlist + + "TBCREATE " t_nam " NAMES(DDNAME DSNAME DISP) NOWRITE" + disp = "?" + + do Words(tgt_list) /* every DDName */ + parse var tgt_list ddname tgt_list + ds_stack.ddname = dsnames.ddname + disp = disp.ddname + do Words(dsnames.ddname) + parse var dsnames.ddname dsname dsnames.ddname + "TBADD" t_nam /* add to table #*/ + got_one = "1" + end /* dsnames */ + end /* Words(tgt_list) */ + +return /*@ C_LOAD_TABLE */ +/* +. ----------------------------------------------------------------- */ +D_TABLE_OPS: /*@ */ + address ISPEXEC + + if got_one then do + call DEIMBED /* expose the panel -*/ + $ddn = $ddn.PLIB + "LIBDEF ISPPLIB LIBRARY ID("$ddn") STACK" + + "TBTOP" t_nam /* */ + "CONTROL DISPLAY SAVE" /* In case of re-invocation */ + do forever + "TBDISPL" t_nam "PANEL(FCALLOC) CURSOR(ACTION) AUTOSEL(NO)" + if rc > 4 then leave + do ztdsels + curact = Translate(action) + "CONTROL DISPLAY SAVE" + select + when curact = "E" then do /* Edit */ + "EDIT DATASET('"dsname"')" + save_rc = rc + end /* Edit */ + when curact = "V" then do /* View */ + "VIEW DATASET('"dsname"') CONFIRM(NO)" + save_rc = rc + end /* View */ + when curact = "B" then do /* Browse */ + "BROWSE DATASET('"dsname"')" + save_rc = rc + end /* Browse */ + when curact = "D" then do /* DUP */ + address TSO "DUP '"dsname"' ID" + save_rc = rc + if rc <> 0 then do + ZERRSM = "RC ="rc + ZERRLM = "DUP ended abnormally" + end + end /* CLONE */ + when curact = "F" then do /* Free */ + redo_alloc = "1" + if WordPos(ddname,dds_to_realloc) = 0 then,/* new DDName */ + dds_to_realloc = dds_to_realloc ddname + dsid = WordPos(dsname,ds_stack.ddname) /* in the list ? */ + if dsid > 0 then, + ds_stack.ddname = DelWord(ds_stack.ddname,dsid,1) + end /* Free */ + when curact = "X" then do /* UnDisplay */ + "TBDELETE" t_nam /* drop this row */ + end /* UnDisplay */ + otherwise nop + end /* Select */ + "CONTROL DISPLAY RESTORE" + if save_rc <> 0 then, + "SETMSG MSG(ISRZ002)" + save_rc = 0 + if ztdsels = 1 then, /* never do the last one */ + ztdsels = 0 + else "TBDISPL" t_nam /* next row #*/ + end /* ztdsels */ + action = "" /* clear for re-display */ + end /* forever */ + "CONTROL DISPLAY RESTORE" /* In case of re-invocation */ + + "LIBDEF ISPPLIB" + "TBCLOSE" t_nam + address TSO "FREE FI("$ddn")" + end /* got_one */ + else do + "TBEND" t_nam /* #*/ + ZERRSM = "No datasets" /* short message */ + ZERRLM = "No datasets were allocated as specified/implied." + "SETMSG MSG(ISRZ002)" + end + +return /*@ D_TABLE_OPS */ +/* +. ----------------------------------------------------------------- */ +E_REDO_ALLOC: /*@ */ + address TSO /* ready for some TSO work */ + + if redo_alloc then do + do fidx = 1 to Words(dds_to_realloc)/* for each DDName */ + ddname = Word(dds_to_realloc,fidx) /* grab it */ + alloc_list = "" /* initialize */ + + if Words(ds_stack.ddname) > 0 then, + do didx = 1 to Words(ds_stack.ddname) /* for each DSName */ + alloc_list = alloc_list "'"Word(ds_stack.ddname,didx)"'" + end + + if alloc_list <> "" then, /* re-ALLOC */ + "ALLOC FI("ddname") DA("alloc_list") SHR REU" + else "FREE FI("ddname")" + end /* fidx */ + end /* redo_alloc */ + +return /*@ E_REDO_ALLOC */ +/* +. ----------------------------------------------------------------- */ +HELP: /*@ */ +address TSO "CLEAR" +say " " +say " ALIST displays a scrollable list of allocated datasets." +say " The list may be limited to specific DDNames or " +say " specific sets of DDNames. " +say " " +say " Syntax: ALIST [ddname-list] [CMDS] [ISPF] " +say " [ ? ] " +say " " +say " [ddname-list] is a blank-delimited list of filenames " +say " to be displayed. " +say " [CMDS] is equivalent to 'SYSPROC SYSEXEC' " +say " [ISPF] is equivalent to 'ISPPLIB ISPMLIB ISPSLIB " +say " ISPTLIB ISPLLIB ISPPROF ISPTABL' " +say " " +say " ALIST may be invoked from READY-mode. " +say " " +exit /*@ HELP */ + +/* ----------------------------------------------------------------- */ +SYNTAX: /*@ */ + errormsg = "REXX error" rc "in line" sigl":" errortext(rc) + say errormsg + say sourceline(sigl) + trace "?r" + nop +exit /*@ SYNTAX */ +/* + Parse out the embedded components at the back of the source code. +. ----------------------------------------------------------------- */ +DEIMBED: Procedure expose, /*@ */ + (tk_globalvars) ddnlist $ddn. daid. + + address TSO + + fb80po.0 = "NEW UNIT(VIO) SPACE(5 5) TRACKS DIR(40)", + "RECFM(F B) LRECL(80) BLKSIZE(0)" + parse value "" with ddnlist $ddn. daid. + + lastln = sourceline() + currln = lastln /* */ + if Left(sourceline(currln),2) <> "*/" then return + + currln = currln - 1 /* previous line */ + "NEWSTACK" + do while sourceline(currln) <> "/*" + text = sourceline(currln) /* save with a short name ! */ + if Left(text,3) = ")))" then do /* package the queue */ + parse var text ")))" ddn mbr . /* PLIB PANL001 maybe */ + if Pos(ddn,ddnlist) = 0 then do /* doesn't exist */ + ddnlist = ddnlist ddn /* keep track */ + $ddn = ddn || Random(999) + $ddn.ddn = $ddn + "ALLOC FI("$ddn")" fb80po.0 + address ISPEXEC "LMINIT DATAID(DAID) DDNAME("$ddn")" + daid.ddn = daid + end + daid = daid.ddn + address ISPEXEC "LMOPEN DATAID("daid") OPTION(OUTPUT)" + do queued() + parse pull line + address ISPEXEC "LMPUT DATAID("daid") MODE(INVAR)", + "DATALOC(LINE) DATALEN(80)" + end + address ISPEXEC "LMMADD DATAID("daid") MEMBER("mbr")" + address ISPEXEC "LMCLOSE DATAID("daid")" + end /* package the queue */ + else push text /* onto the top of the stack */ + currln = currln - 1 /* previous line */ + end /* while */ + "DELSTACK" + +return /*@ DEIMBED */ +/* +)))PLIB FCALLOC +)ATTR + % TYPE(TEXT) INTENS(HIGH) SKIP(ON) + + TYPE(TEXT) INTENS(LOW) SKIP(ON) + _ TYPE(INPUT) INTENS(HIGH) + ! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON) +)BODY EXPAND(||) +%|-| Current Allocations |-| +%COMMAND ===>_ZCMD + %SCROLL ===>_AMT + ++ ++ DDName DSName Disp +)MODEL +_Z+ !DDNAME + !DSNAME + !DISP + +)INIT + .ZVARS = '(ACTION)' + .HELP = FCALLOCH +)REINIT + IF (&MSG = ' ') + &ACTION = ' ' + REFRESH (&ACTION) +)END +)))PLIB FCALLOCH +)ATTR + % TYPE(TEXT) INTENS(HIGH) SKIP(ON) + + TYPE(TEXT) INTENS(LOW) SKIP(ON) + _ TYPE(INPUT) INTENS(HIGH) + ! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON) + @ TYPE(OUTPUT) INTENS(LOW) SKIP(ON) +)BODY EXPAND(��) +%TUTORIAL �-� Current Allocations �-� TUTORIAL +%Next Selection ===>_ZCMD + ++ + Panel FCALLOC shows the current allocations for the DDNames you specified + (or ALL DDNames). + + For each shown dataset you may select among several actions: + + %B+-%BROWSE +Browse the selected dataset. + + %E+-%EDIT +Edit the selected dataset. + + %V+-%VIEW +View the selected dataset. + + %D+-%DUP +You may make a copy (either filled or empty) of the + selected dataset. Subroutine DUP will be called to + perform this function. + + %F+-%FREE +This is effective only for DDNames which are not under + the control of ISPF since those files are necessarily + OPEN while ISPF is active. + +)PROC +)END +*/ diff --git a/samples/mvs/blox.rex b/samples/mvs/blox.rex new file mode 100644 index 0000000..ac0e817 --- /dev/null +++ b/samples/mvs/blox.rex @@ -0,0 +1,214 @@ +/* REXX BLOX create block letters from an input string. + for each of eight lines + for each letter in string + get pattern for letter + get sub-pattern for this line + build slug + attach to line + write the line + + Written by Frank Clarke, Oldsmar, FL + +*/ +address TSO +signal on syntax + +tv="" ; odsn="" /* ensure values */ +sav = "" +parse upper arg instr "((" parms /* get parameters */ +if instr="" & parms="" then call HELP /* no parms at all */ +parms = Strip(parms,T,")") /* clip trailing paren */ + +parse value KEYWD("TRACE") "O" with tv . +odsn = KEYWD("OUTPUT") /* output to file ? */ +if Pos("(",odsn) > 0 then, /* has a left banana */ +if Pos(")",odsn) = 0 then, /* but no right banana */ + odsn = Space(odsn")",0) /* add one */ + +prompt = \SWITCH("NOPROMPT") +diagnose = SWITCH("DIAGNOSE") +instr = Strip(instr) /* clean the input */ +rc = Trace(tv) + +if odsn <> "" then do /* was a value */ + "ALLOC FI(BLOXDD) DA("odsn") SHR REU" + if rc > 0 then do /* doesn't exist ? */ + "ALLOC FI(BLOXDD) DA("odsn") NEW REU SPACE(1) TRACKS", + " RECFM(V B) LRECL(121) BLKSIZE(1210) UNIT(SYSDA)" + if rc > 0 then do /* ...and couldn't create it! */ + say "Allocation failed for "odsn"." + exit + end /* alloc NEW */ + end /* alloc SHR */ + end /* alloc dataset */ +else "ALLOC FI(BLOXDD) DA(*) SHR REU" /* to the terminal */ + +call SET_PATN /* -*/ +if tv = "O" then "CLEAR" /* clear screen */ + +if instr = "" then do /* no input ? */ + say ":" /* initial prompt */ + "NEWSTACK" + pull instr + "DELSTACK" + end + +do forever + do while instr <> "" + if length(instr) > 8 then do /* too long */ + parse var instr instr 9 sav /* save the excess */ + end + + do i = 1 to 7 /* for 7 lines */ + outline="" /* clear it */ + do j = 1 to Length(instr) /* for each letter */ + ltr = Substr(instr,j,1) /* isolate it */ + ltrpos = Pos(ltr,choices) /* where in the array ? */ + if ltrpos = 0 then ltrpos = 47 /* set to blank */ + byte = Substr(patn.ltrpos,i*2-1,2) + if diagnose then say ltr byte X2B(byte) + slug = X2B(byte) /* character-to-binary */ + slug = Translate(slug," ","0") /* off -> blank */ + slug = Translate(slug,ltr,"1") /* on -> letter */ + outline = outline slug /* splice to the line */ + end /* j for length(instr) */ + queue outline /* into the queue */ + end /* i for 7 lines */ + instr = "" + queue " " /* blank line */ + queue " " /* blank line */ + + rc = Trace("O") + rc = Trace(tv) + if sav <> "" then do /* was there excess ? */ + instr = sav /* restore it */ + sav = "" /* indicate "no excess" */ + end + end /* while instr filled */ + + if prompt then, + if instr = "" then do /* no more input ? */ + say ":" /* prompt for more */ + "NEWSTACK" + pull instr + "DELSTACK" + end + if instr = "" then leave /* prompt was refused */ +end /* forever */ + +rc = Trace("O") ; rc = Trace(tv) +"EXECIO" queued() "DISKW BLOXDD (FINIS" /* flush to output */ +"FREE FI(BLOXDD)" + +exit +/* +. ----------------------------------------------------------------- */ +SET_PATN: /*@ */ + patn.="" /* storage for patterns */ + patn.1 = "081422417F4141" /* A */ + patn.2 = "7E41417E41417E" /* B */ + patn.3 = "3E41404040413E" /* C */ + patn.4 = "7C42414141427C" /* D */ + patn.5 = "7F40407C40407F" /* E */ + patn.6 = "7F40407C404040" /* F */ + patn.7 = "7E41404047417E" /* G */ + patn.8 = "4141417F414141" /* H */ + patn.9 = "1C08080808081C" /* I */ + patn.10 = "7F02020202423C" /* J */ + patn.11 = "41424478444241" /* K */ + patn.12 = "4040404040407F" /* L */ + patn.13 = "41635549414141" /* M */ + patn.14 = "41615149454341" /* N */ + patn.15 = "3E41414141413E" /* O */ + patn.16 = "7E41417E404040" /* P */ + patn.17 = "3E41414145423D" /* Q */ + patn.18 = "7E41417E444241" /* R */ + patn.19 = "3E41403E01413E" /* S */ + patn.20 = "7F080808080808" /* T */ + patn.21 = "4141414141413E" /* U */ + patn.22 = "41414141221408" /* V */ + patn.23 = "41414141494936" /* W */ + patn.24 = "41221408142241" /* X */ + patn.25 = "41221408080808" /* Y */ + patn.26 = "7F02040810207F" /* Z */ + patn.27 = "3E43454951613E" /* 0 */ + patn.28 = "0818080808083E" /* 1 */ + patn.29 = "3E41020408103E" /* 2 */ + patn.30 = "7F020C0201413E" /* 3 */ + patn.31 = "2040487F080808" /* 4 */ + patn.32 = "7F40407E01017E" /* 5 */ + patn.33 = "0408103E41413E" /* 6 */ + patn.34 = "7F020408080808" /* 7 */ + patn.35 = "3E41413E41413E" /* 8 */ + patn.36 = "3E41413E040810" /* 9 */ + patn.37 = "22227F227F2222" /* # */ + patn.38 = "143E403E013E14" /* $ */ + patn.39 = "21522408122542" /* % */ + patn.40 = "0018241825423D" /* & */ + patn.41 = "0022143E142200" /* * */ + patn.42 = "04081010100804" /* ( */ + patn.43 = "10080404040810" /* ) */ + patn.44 = "0000003E000000" /* - */ + patn.45 = "00181800181800" /* : */ + patn.46 = "00000000000000" /*blank */ + patn.47 = "00181800181808" /* ; */ + patn.48 = "3E410104080008" /* ? */ + choices ="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#$%&*()-: ;?" +return /*@ SET_PATN */ +/* +. ----------------------------------------------------------------- */ +HELP: /*@ */ +"CLEAR" /* clear screen */ +say " " +say " BLOX is a REXX routine which will build 8x7 block letters " +say " from text you specify. " +say " " +say " BLOX can handle strings to length=8 and will write either to " +say " the screen-face or to a file you name. Syntax for BLOX is: " +say " BLOX " +say " " +say " : OUTPUT output-dsname " +say " " +exit /*@ HELP */ + +/*-------------------------------------------------------------------*/ +KEYWD: Procedure expose, /*@ */ + kw parms +arg kw . +if Wordpos(kw,parms) = 0 then, + kw_val = "" +else, +if Wordpos(kw,parms) = 1 then, + kwa = kw" " +else kwa = " "kw" " +parse var parms . value(kwa) kw_val . +if kw_val <> "" then parms = Delword(parms,Wordpos(value(kw),parms),2) +return kw_val /*@ KEYWD */ + +/*-------------------------------------------------------------------*/ +SWITCH: /*@ */ +arg kw . +sw_val = Wordpos(value(kw),parms) > 0 +if sw_val then parms = Delword(parms,Wordpos(value(kw),parms),1) +return sw_val /*@ SWITCH */ + +/*-------------------------------------------------------------------*/ +SYNTAX: /*@ */ + errormsg = "REXX error" rc "in line" sigl":" errortext(rc) + say errormsg + say sourceline(sigl) + Trace "?R" + nop +exit /*@ SYNTAX */ + +/* Work area for creating new patterns: */ + +/* ....... */ +/* ....... */ +/* ....... */ +/* ....... */ +/* ....... */ +/* ....... */ +/* ....... */ +/* ....... */ +/* ....... */ \ No newline at end of file diff --git a/samples/mvs/cmds.rex b/samples/mvs/cmds.rex new file mode 100644 index 0000000..cf95efa --- /dev/null +++ b/samples/mvs/cmds.rex @@ -0,0 +1,194 @@ +/* REXX COMMANDS Show the contents of xxxCMDS and allow + selection and parameter entry. + |**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**| + | | + | WARNING: EMBEDDED COMPONENTS. | + | | + |**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**| +*/ +address TSO +arg line +exec_name = Sysvar(Sysicmd) +if Sysvar(sysispf) = "NOT ACTIVE" then do + line = line "(( RESTARTED" /* tell the next invocation */ + "ISPSTART CMD("exec_name line")" /* Invoke ISPF if nec. */ + exit /* ...and restart it */ + end +restarted = WordPos("RESTARTED",opts)>0/* called from READY-mode ? */ +tv = "" +arg parms "((" opts +opts = Strip(opts,"T",")") /* lop trailing banana */ + +parse var opts "TRACE" tv . +parse value tv "O" with tv . /* guarantee a value */ +rc = Trace(tv) + +if parms = "?" then call HELP +parse value parms "ISP" with cmdtblID . +$tn$ = cmdtblID"CMDS" /* ISPCMDS by default */ + +address ISPEXEC +"CONTROL ERRORS RETURN" +call DEIMBED /* extract panel FCCMDSP -*/ +$ddn = $ddn.PLIB +"LIBDEF ISPPLIB LIBRARY ID("$ddn") STACK" +"TBTOP" $tn$ +do forever + "TBDISPL" $tn$ "PANEL(FCCMDSP) CURSOR(ACTION) AUTOSEL(NO)" + if rc > 4 then leave + do ztdsels + select + when action = "S" then + do /* Select */ + "CONTROL DISPLAY SAVE" /* in case we display s'thing */ + (zctact) + "CONTROL DISPLAY RESTORE" /* return from display */ + end + when WordPos(action,"D") > 0 then "TBDELETE" $tn$ + when WordPos(action,"E B") > 0 then call F_FIXTBL /* -*/ + otherwise nop + end /* Select */ + if ztdsels = 1 then ztdsels = 0 + else "TBDISPL" $tn$ /* next row */ + end /* ztdsels */ + action = "" /* clear for re-display */ +end /* forever */ +"LIBDEF ISPPLIB" + +if restarted then do + @@ = OutTrap("ll.") + exit 4 + end +exit /*@ COMMANDS */ +/* +. ----------------------------------------------------------------- */ +F_FIXTBL: /*@ */ + address ISPEXEC + + save. = "" + parse value zctverb zcttrunc zctact with , + save.vb save.tr save.act + save.desc = zctdesc + do forever + "DISPLAY PANEL(FCCMDFIX)" + if rc > 0 then leave + end + if save.vb = zctverb then, + if save.tr = zcttrunc then, + if save.act = zctact then, + if save.desc = zctdesc then return + "TBMOD" $tn$ + +return /*@ F_FIXTBL */ +/* +. ----------------------------------------------------------------- */ +HELP: /*@ */ +say "HELP for" Sysvar(Sysicmd) "not available" +exit /*@ HELP */ +/* + Parse out the embedded components at the back of the source code. + + The components are enclosed in a comment whose start and end are on + individual lines for easier recognition. + + Each component is identified by a triple-close-paren ")))" in + column 1 followed by a DDName and a membername. The text of the + component begins on the next line. + + There are no restrictions on the DDName, but it is probably a good + idea to pick a name which relates to its use so that mainline + processing can, for example, determine what sort of LIBDEF to do. + Note also that a 3-digit random number will be generated for each + DDName to guard against the possibility that processing may be + interleaved or recursive. It is up to the programmer to add the + code to properly LIBDEF each component type. +. ----------------------------------------------------------------- */ +DEIMBED: Procedure expose, /*@ */ + ddnlist $ddn. daid. + + address TSO + + fb80po.0 = "NEW UNIT(VIO) SPACE(5 5) TRACKS DIR(40)", + "RECFM(F B) LRECL(80) BLKSIZE(0)" + parse value "" with ddnlist $ddn. daid. + + lastln = sourceline() + currln = lastln /* */ + if Left(sourceline(currln),2) <> "*/" then return + + currln = currln - 1 /* previous line */ + "NEWSTACK" + address ISPEXEC + do while sourceline(currln) <> "/*" + text = sourceline(currln) /* save with a short name ! */ + if Left(text,3) = ")))" then do /* package the queue */ + parse var text ")))" ddn mbr . /* PLIB PANL001 maybe */ + if Pos(ddn,ddnlist) = 0 then do /* doesn't exist */ + ddnlist = ddnlist ddn /* keep track */ + $ddn = ddn || Random(999) + $ddn.ddn = $ddn + address TSO "ALLOC FI("$ddn")" fb80po.0 + "LMINIT DATAID(DAID) DDNAME("$ddn")" + daid.ddn = daid + end + daid = daid.ddn + "LMOPEN DATAID("daid") OPTION(OUTPUT)" + do queued() + parse pull line + "LMPUT DATAID("daid") MODE(INVAR) DATALOC(LINE) DATALEN(80)" + end + "LMMADD DATAID("daid") MEMBER("mbr")" + "LMCLOSE DATAID("daid")" + end /* package the queue */ + else push text /* onto the top of the stack */ + currln = currln - 1 /* previous line */ + end /* while */ + address TSO "DELSTACK" + +return /*@ DEIMBED */ +/* +)))PLIB FCCMDSP +)ATTR + % TYPE(TEXT) INTENS(HIGH) SKIP(ON) + + TYPE(TEXT) INTENS(LOW) SKIP(ON) + _ TYPE(INPUT) INTENS(HIGH) CAPS(ON) + ! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON) +)BODY EXPAND(ºº) +%º-º Current Command Table Contents º-º +%COMMAND ===>_ZCMD %SCROLL ===>_AMT + ++ ++ CmdName CmdDescription +)MODEL +_Z+ !ZCTVERB + !ZCTDESC +)INIT + .ZVARS = '(ACTION)' +)REINIT + IF (&MSG = ' ') + &ACTION = ' ' + REFRESH (&ACTION) +)END +)))PLIB FCCMDFIX +)ATTR + % TYPE(TEXT) INTENS(HIGH) SKIP(ON) + + TYPE(TEXT) INTENS(LOW) SKIP(ON) + _ TYPE(INPUT) INTENS(HIGH) CAPS(ON) + } TYPE(INPUT) INTENS(HIGH) CAPS(OFF) + ! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON) +)BODY EXPAND(ºº) +%º-º Current Command Table Line Contents º-º +%COMMAND ===>_ZCMD + %SCROLL ===>_AMT + ++ ++ Verb ===>_zctverb + + ++ Truncation ===>_z+ + ++ Action ===>_zctact + ++ Description ===>}zctdesc + +)INIT + .ZVARS = '(ZCTTRUNC)' +)PROC +)END +*/ \ No newline at end of file diff --git a/samples/mvs/cpuid.rex b/samples/mvs/cpuid.rex new file mode 100644 index 0000000..e7b52e6 --- /dev/null +++ b/samples/mvs/cpuid.rex @@ -0,0 +1,129 @@ +/* CPUID -- Display CPU information from REXX */ +/* article in TSO TIMES, Fall 1993, by John Andrisan */ +/* of IBM ISSC subdivision in Long Beach California */ +/*********************************************************************/ +/* A TSO REXX Exec to get information aobut CPUs from the MVS */ +/* control blocks: DVT, SMCA, CSD, PCCAVT, and PCCA; then show CPU */ +/* number, id serial number, type, SMF id letter, and anything else */ +/* that looks interesting. */ +/* */ +/* The control block chain that I want to follow: */ +/* location 10x --> CVT */ +/* CVT+C4x --> SMCA */ +/* SMCA+16 contains the SMF id */ +/* CVT+294x --> CSD */ +/* CSD+4, +8 and + 10 contain */ +/* some interesting cpu counts */ +/* CVT+2FCx --> PCCAVT */ +/* PCCAVT+0 --> PCCA for CPU 0 */ +/* PCCAVT+4 --> PCCA for CPU 1 */ +/* ... etc. */ +/* PCCAVT+60 --> PCCA for CPU 15 */ +/* PCCA+4 contains the cpu id, serial#, type */ +/* PCCA+24 --> virtual PSA */ +/* PCCA+28 --> real PSA */ +/*********************************************************************/ +/* ---------begin available "The REXX Macros Toolbox" only portion*/ + "CLS" /* clear screen*/ + say '----- information obtained via WHICH CPU ------' + "WHICH CPU" + say ' ' + say '----- information from CPUID -- Display CPU information' +/* ------------ end available "The REXX Macros Toolbox" only portion*/ +arg what . +if what='?' then do /* offer the user some help */ + say ' use: COMMAND ===> CPUID' + say ' No parms are required' + say ' You will be shown the SMF id letter defining this system,' + say ' the CPU id, serial number, and CPU type of each CPU,' + say ' This exec (CPUID) only works on TSO.' +end +if address() /='TSO' then do + say 'This exec only works in MVS/TSO.' + exit 4 +end +call init /* set up some constants */ +CVT=storage('10',4) +CVT=bitand(CVT,'7FFFFFFF'x) /* zero high bit */ +SMCA=storage(d2x(c2d(CVT)+x2d('C4')),4) /* get to SMCA */ +SMCA=bitand(SMCA,'7FFFFFFF'x) +SMCASID=storage(d2x(c2d(SMCA)+16),4) +say 'SMF id=' SMCASID +CSD=storage(d2x(c2d(CVT)+x2d('294')),4) /* get to CSD */ +CSD=bitand(CSD,'7FFFFFFF'x) /* zero high bit */ + /* the counts shown next may change whil you run*/ +nr_cpus=c2d(storage(d2x(c2d(CSD)+10),2)) /* get nr cur alive */ +say 'nr cpus currently alive:' nr_cpus /* whatever that is */ +job_avail_cpus=x2b(c2x(storage(d2x(c2d(csd)+4),2))) +say count_bits(job_avail_cpus) 'available for jobs' +srb_avail_cpus=x2b(c2x(storage(d2x(c2d(csd)+8),2))) +say count_bits(srb_avail_cpus) 'available for srbs' +cur_alive_cpus=x2b(c2x(storage(d2x(c2d(CSD)+10),2))) +say count_bits(cur_alive_cpus) 'currently alive' +say ' ' +PCCAAVT=storage(d2x(c2d(CVt)+x2d('2FC')),4) /* get to PCCAVT */ +PCCAAVT=bitand(PCCAAVT,'7FFFFFFF'x) /* zero high bit*/ + +say '-----CPU-------------- PSA PSA ' +say '# ver id serial type vaddr raddr status:' +do i=0 to 60 by 4 + PCCA=storage(d2x(c2d(PCCAAVT)+i),4) /* get the i-th PCCA */ + PCCA=bitand(PCCA,'7FFFFFFF'x) /* zero high bit */ + if PCCA=='00000000'x then iterate i /* avoid empty entry */ + info=storage(c2x(PCCA),32) + if substr(job_avail_cpus,i%4+1,1)='1' then jobs='jobs' + else jobs='no-jobs' + if substr(srb_avail_cpus,i%4+1,1)='1' then srbs='srbs' + else jobs='no-srbs' + if substr(cur_alive_cpus,i%4+1,1)='1' then alive='alive' + else alive='no-alive' + /* as run "The REXX Macros Toolbox" 1993/12/16 + SMF id= H901 + nr cpus currently alive: 5 + 5 available for jobs + 5 available for srbs + 2 currently alive + + -----CPU-------------- PSA PSA + # ver id serial type vaddr raddr status: + 00 52 0 12495 3090 8000F6F0 00157240 jobs srbs no-alive + 01 52 1 12495 3090 7800F9F0 00134030 jobs srbs no-alive + 02 52 2 12495 3090 0000F980 0002F040 jobs srbs no-alive + 03 52 3 12495 3090 0000F960 00068040 jobs srbs no-alive + 04 52 4 12495 3090 1000F7F0 000A2040 jobs srbs no-alive + 05 a: 9 & 00070C30 0080007B no-srbs srbs no-alive + */ + say , + /*cpu number:*/ right(i%4,2,'0')' ', + /*cpu ver : */ substr(info,5,2)' ', + /*cpuid: */ substr(info,7,1), + /*cpu serial:*/ substr(info,8,5)' ', + /*cpu type: */ substr(info,13,4)' ', + /*PSA vaddr:*/ c2x(substr(info,24,4))' ', + /*PSA raddr:*/ c2x(substr(info,28,4))' ', + /* the status shown next may change while you run*/, + /*status:*/ jobs srbs alive +end +exit 0 +/* ------------------- subroutines ---------------------- */ +count_bits: + arg bit_string . + bit_sum = 0 + do bit=1 to length(bit_string) + if substr(bit_string,bit,1)='1' then bit_sum=bit_sum + 1 + end + return(bit_sum) + X2B: /* X2B is a function for hex to binary string conversion*/ + arg arg . + bitout='' + do i=1 to length(arg) + t=substr(arg,i,1) + bitout=bitout||hex.t + end + return bitout + init: /* constants needed in x2b */ + hex.0='0000'; hex.1='0001'; hex.2='0010'; hex.3='0011'; + hex.4='0100'; hex.5='0101'; hex.6='0110'; hex.7='0111'; + hex.8='1000'; hex.9='1001'; hex.A='1010'; hex.B='1011'; + hex.C='1100'; hex.D='1101'; hex.E='1110'; hex.F='1111'; + return \ No newline at end of file diff --git a/samples/mvs/free.clist b/samples/mvs/free.clist new file mode 100644 index 0000000..decc032 --- /dev/null +++ b/samples/mvs/free.clist @@ -0,0 +1,10 @@ + PROC 1 FREE$DS CONTROL LIST + /*CONLIST SYMLIST + /* PURPOSE: "FREE" DATASET AND "WHOGOT" DATASET + /* CONTRIBUTED: F. DAVID MCRITCHIE 1985/02/04 + IF &SUBSTR(1:1,&FREE$DS.) = &STR(') THEN DO + SET L = &LENGTH(&FREE$DS.) + SET FREE$DS = &SUBSTR(2:&EVAL(&L - 1),&FREE$DS) + END + FREE DS('&FREE$DS') + WHOGOT &FREE$DS diff --git a/samples/mvs/gettrid.rex b/samples/mvs/gettrid.rex new file mode 100644 index 0000000..2325c0d --- /dev/null +++ b/samples/mvs/gettrid.rex @@ -0,0 +1,60 @@ +/* REXX - + statistics 0122-92148-93314-0817-00056-00087-00000-REXX + sys6.cbt.file078(rexx) + returns the name of the terminal -- e.g. + terminal = gettrid(); say terminal + +------------------------------------------------------------------+ + | Name: GETTRID | + | Type: REXX exec | + | Purpose: Extract the ACEETRID from the RACF ACEE. | + | Release: MVS/ESA v4.2.2 and TSO/E v2.4 | + | Programmer: John Kalinich | + | Date: 3/10/93 | + | Abstract: A sub-function to extract the VTAM terminal id from | + | the RACF Accessor Environment Element. The ACEE is | + | not fetch protected. This function works in ACF2 | + | systems. | + | | + | Call Format: GETTRID() | + | | + | Logic: Extracts address of ASCB (PSAAOLD at x'224') | + | Extracts address of ASXB (ASCB+x'6C') | + | Extracts address of ACEE (ASXB+x'C8') | + | Extracts ACEETRID | + +------------------------------------------------------------------+ */ +trace + +ascb_ptr = get_ptr(224,0) +asxb_ptr = get_ptr(ascb_ptr,'6c') +acee_ptr = get_ptr(asxb_ptr,'c8') +aceetrid = get_data(acee_ptr,'40',8) +exit aceetrid + +/* +-----------------------------------------+ + | Procedures and functions defined below. | + +-----------------------------------------+ */ + +get_ptr: procedure + /* +-----------------------------------------+ + | returns a 4 byte pointer as hexadecimal | + | string at address addr+offset. | + | ADDR and OFFSET must be HEX strings. | + +-----------------------------------------+ */ + arg addr, offset + temp = d2x(x2d(addr) + x2d(offset)) + return c2x(storage(temp,4)) + exit + +get_data: procedure + /* +-----------------------------------------+ + | returns LENGTH bytes at ADDR+OFFSET as | + | an EBCDIC string. | + | ADDR and OFFSET must be HEX strings. | + | LENGTH must be a decimal string. | + +-----------------------------------------+ */ + arg addr, offset, length + temp = d2x(x2d(addr) + x2d(offset)) + return storage(temp,length) + exit +/* J. KALINICH, X4521 */ +/* EXEC TO GET THE RACF ACEE TERMINAL ID */ \ No newline at end of file diff --git a/samples/mvs/gotdsn.clist b/samples/mvs/gotdsn.clist new file mode 100644 index 0000000..0252643 --- /dev/null +++ b/samples/mvs/gotdsn.clist @@ -0,0 +1,29 @@ +PROC 1 DSN INFORM +/* GOTDSN: DETERMINE IF THE PERSON TESTING HAS THE DSNAME ALLOCATED +/* NO PROVISION MADE FOR MEMBERNAME +/* CONTRIBUTED: DAVID MCRITCHIE, "THE REXX MACROS TOOLBOX", 1989/09/04 +SET INFORM = &SYSCAPS(&INFORM.) +SET SYSOUTTRAP = 400 +LISTALC STA +SET N = &SYSOUTLINE +SET SYSOUTTRAP = 0 +SET I = 1 +SET LP = &STR(( +DO WHILE &I <= &N + SET DX = &STR(&&SYSOUTLINE&I..) + SET DX = &STR(&DX.) + SET IX = &SYSINDEX(&STR(&LP.),&STR(&DX.)) + IF &IX ^= 0 THEN SET DX = &SUBSTR(1:&EVAL(&IX. - 1),&STR(&DX.)) + /* WRITE &IX. _ &DX. _ &DSN. _ &LP. + IF X&SUBSTR(1:1,&STR(&DX.)) = X&STR( ) THEN GOTO NIX + IF X&STR(&DX.). = X&STR(&DSN.). THEN DO + IF INFORM = &INFORM THEN - + WRITE GOTDSN -- YES YOU ARE ALLOCATED TO &DSN. <---<< + EXIT CODE(0) + END +NIX: - + SET I = &I. + 1 +END +IF INFORM = &INFORM THEN - + WRITE GOTDSN -- YOU ARE NOT ALLOCATED TO &DSN. +EXIT CODE(4) \ No newline at end of file diff --git a/samples/mvs/iplinfo.rex b/samples/mvs/iplinfo.rex new file mode 100644 index 0000000..0f55092 --- /dev/null +++ b/samples/mvs/iplinfo.rex @@ -0,0 +1,3586 @@ +/* REXX */ +/* */ +/* AUTHOR: Mark Zelden */ +/* */ +/* Trace ?r */ +/* */ +/*********************************************************************/ +/* */ +/* D I S C L A I M E R */ +/* ------------------- */ +/* */ +/* This program is FREEWARE. Use at your own risk. Neither Mark */ +/* Zelden, nor other contributing organizations or individuals */ +/* accept any liability of any kind howsoever arising out of the use */ +/* of this program. You are free to use and modify this program as */ +/* you desire, however, the author does ask that you leave his name */ +/* in the source and give credit to him as the original programmer. */ +/* */ +/*********************************************************************/ +/* IPLINFO: DISPLAY SYSTEM INFORMATION ON TERMINAL */ +/*********************************************************************/ +/* */ +/* IPLINFO can be called as an interactive exec / ISPF edit macro */ +/* or in batch to display various system information. The result */ +/* will be displayed in an ISPF browse data set if ISPF is active. */ +/* */ +/* IPLINFO can also be called as a REXX function to return from 1 */ +/* to 20 variables used in the exec at their final value. If more */ +/* than one variable is requested the variables are returned with */ +/* a blank or user defined delimiter between each variable so they */ +/* may be parsed if desired. */ +/* */ +/* See below for the sytax of each method. */ +/* */ +/*********************************************************************/ +/* */ +/* EXECUTION SYNTAX: */ +/* */ +/* TSO %IPLINFO MVS Information */ +/* Virtual Storage Map */ +/* Static System Symbols */ +/* Subsystem Information */ +/* APF Library List */ +/* */ +/*********************************************************************/ +/* */ +/* FUNCTION SYNTAX: */ +/* */ +/* IPLINFO(VAR,var1_name) */ +/* IPLINFO(VAR,var1_name,var2_name,var3_name, ... var20_name) */ +/* */ +/* Examples: */ +/* sysname = IPLINFO(VAR,GRSNAME) */ +/* pvtsize = IPLINFO(VAR,GDAPVTSZ) */ +/* */ +/* */ +/* /* REXX one line IPL information using IPLINFO rexx function */ */ +/* IPL_SUM = IPLINFO(VAR,ipldate,ipltime,iplvol,ipladdr,iplparm) */ +/* Parse var IPL_SUM ipldate ipltime iplvol ipladdr iplparm */ +/* Say 'Date:'ipldate ' Time:'ipltime ' Vol:'iplvol , */ +/* ' Load addr:'ipladdr ' LOADPARM:'iplparm */ +/* */ +/* */ +/* NOTE: The default delimeter between returned variables is a */ +/* blank. However, this can be problematic when the returned */ +/* value contains a blank or is null. You can optionally */ +/* change the delimiter from a blank to one of your choice */ +/* by using "VAR2" instead of "VAR" in the function call and */ +/* specifying the delimiter character(s) as the next operand */ +/* prior to the list of variables you want returned. */ +/* */ +/* */ +/* FUNCTION SYNTAX - "VAR2" / USER DEFINED DELIMITER: */ +/* */ +/* IPLINFO(VAR2,'dlm',var1_name) */ +/* IPLINFO(VAR2,'dlm',var1_name,var2_name,var3_name, ... var20_name) */ +/* */ +/* Example: */ +/* /* REXX one line IPL information using IPLINFO rexx function */ */ +/* IPL_SUM = IPLINFO(VAR2,'@@',ipldate,ipltime,iplvol, , */ +/* ipladdr,iplparm) */ +/* Parse var IPL_SUM ipldate '@@' ipltime '@@' iplvol '@@' , */ +/* ipladdr '@@' iplparm */ +/* Say 'Date:'ipldate ' Time:'ipltime ' Vol:'iplvol , */ +/* ' Load addr:'ipladdr ' LOADPARM:'iplparm */ +/* */ +/*********************************************************************/ +/* */ +/* NOTE: The dynamic APF and dynamic LNKLST code in this exec */ +/* use undocumented IBM control blocks and may break at */ +/* any time! */ +/* ... tested on MVS ESA V4.3 up through z/OS 2.3. */ +/* */ +/* NOTE: The LNKLST SET displayed is the LNKLST SET of the address */ +/* space running this exec, not necessarily the most */ +/* current one. For the current LNKLST SET either: */ +/* 1) Run this exec in batch. */ +/* 2) Log off and on TSO before executing this exec. */ +/* 3) Issue SETPROG LNKLST,UPDATE,JOB=userid (B4 execution) */ +/* */ +/* NOTE: The APF flag in the LNKLST display is the status if the */ +/* data set is accessed VIA LNKLST. Therefore, if IEASYSxx */ +/* specifies LNKAUTH=LNKLST, all entires are marked as APF=Y. */ +/* */ +/*********************************************************************/ +LASTUPD = '09/24/2020' /* date of last update */ +/*********************************************************************/ +/* */ +/* B E G I N C U S T O M I Z A T I O N S E C T I O N */ +/* */ +/* You may changes the variables below to your preference. */ +/* You may only choose the options that are commented out. */ +/* */ +/* DATEFMT - Controls date format: ISO ; USA ; EUR */ +/* VMAP - Controls VMAP order: HIGHFIRST ; LOWFIRST */ +/* */ +/*********************************************************************/ +DATEFMT = 'ISO' /* ISO 8601 format YYYY-MM-DD (new default) */ +/* DATEFMT = 'USA' */ /* USA format MM/DD/YYYY (original format) */ +/* DATEFMT = 'EUR' */ /* EUR format DD/MM/YYYY */ +/*********************************************************************/ +VMAP = 'HIGHFIRST' /* new default - show VMAP from top down */ +/* VMAP = 'LOWFIRST' */ /* the old way - show from bottom up */ +/* Please let me know if you "need" the old way (LOWFIRST) as I */ +/* will probably remove the duplicate code in the future. */ +/*********************************************************************/ +/* */ +/* E N D C U S T O M I Z A T I O N S E C T I O N */ +/* */ +/*********************************************************************/ +Signal On Syntax name SIG_ALL /* trap syntax errors */ +Signal On Novalue name SIG_ALL /* trap uninitialized variables */ +Arg OPTION,VAR.1,VAR.2,VAR.3,VAR.4,VAR.5,VAR.6,VAR.7,VAR.8,VAR.9, , + VAR.10,VAR.11,VAR.12,VAR.13,VAR.14,VAR.15,VAR.16,VAR.17,VAR.18, , + VAR.19,VAR.20,VAR.21 +Parse source . EXEC_TYPE . . . . . ENV . . +MML = Substr(LASTUPD,1,2) /* MM from MM/DD/YYYY */ +DDL = Substr(LASTUPD,4,2) /* DD from MM/DD/YYYY */ +YYYYL = Substr(LASTUPD,7,4) /* YYYY from MM/DD/YYYY */ +If DATEFMT = 'USA' then , /* USA format date? */ + LASTUPD = LASTUPD /* date as MM/DD/YYYY */ +If DATEFMT = 'EUR' then , /* EUR format date? */ + LASTUPD = DDL'/'MML'/'YYYYL /* date as DD/MM/YYYY */ +If DATEFMT = 'ISO' then , /* ISO format date? */ + LASTUPD = YYYYL'-'MML'-'DDL /* date as YYYY-MM-DD */ +SYSISPF = 'NOT ACTIVE' /* set SYSISPF=NOT ACTIVE */ +FUNCDLM = ' ' /* Delimiter default for function call */ +If ENV <> 'OMVS' then /* are we under unix ? */ + If Sysvar('SYSISPF')='ACTIVE' then do /* no, is ISPF active? */ + If Pos('NOB',OPTION) = 0 then , /* NOBrowse not used? */ + Address ISREDIT "MACRO (OPTION)" /* YES,allow use as macro */ + OPTION = Translate(OPTION) /* ensure upper case for edit macro */ + Address ISPEXEC "VGET ZENVIR" /* ispf version */ + SYSISPF = 'ACTIVE' /* set SYSISPF = ACTIVE */ + End +/*********************************************************************/ +/* Process options */ +/*********************************************************************/ +BROWSEOP = 'YES' /* default is to browse OP under ISPF */ +EDITOP = 'NO' /* output is not in edit mode */ +/*********************************************************************/ +If SYSISPF = 'NOT ACTIVE' & Pos('EDI',OPTION) <> 0 then /* EDIT is */ + call INVALID_OPTION /* not valid if ISPF isn't active */ +If OPTION = '' then OPTION = 'ALL' /* Default option. Change to IPL */ + /* or something else - may want to change help panel if changed */ +If Abbrev('NOBROWSE',OPTION,3) = 1 then , /* NOBROWSE only opt? */ + OPTION = 'ALL NOBROWSE' /* yes, use all option */ +If Abbrev('EDIT',OPTION,3) = 1 then , /* EDITonly opt? */ + OPTION = 'ALL EDIT' /* yes, use all option */ +If Abbrev('NOBROWSE',Word(OPTION,2),3) = 1 then do /* NOBROWSE USED? */ + OPTION = Word(OPTION,1) /* separate out option */ + BROWSEOP = 'NO' /* set BROWSEOP flag to NO */ +End +If Abbrev('EDIT',Word(OPTION,2),3) = 1 then do /* EDIT USED? */ + OPTION = Word(OPTION,1) /* separate out option */ + EDITOP = 'YES' /* set EDITOP flag to YES */ +End +/*********************************************************************/ +If OPTION <> 'IPL' & , /* check for IPL option */ + Abbrev('VERSION',OPTION,3) <> 1 & , /* check for VERsion option */ + Abbrev('STORAGE',OPTION,3) <> 1 & , /* check for STOrage option */ + Abbrev('STORE',OPTION,3) <> 1 & , /* check for STOre option */ + Abbrev('MEMORY',OPTION,3) <> 1 & , /* check for MEMory option */ + OPTION <> 'CPU' & , /* check for CPU option */ + OPTION <> 'IPA' & , /* check for IPA option */ + Abbrev('SYMBOLS',OPTION,3) <> 1 & , /* check for SYMbols option */ + Abbrev('VMAP',OPTION,3) <> 1 & , /* check for VMAp option */ + Abbrev('PAGE',OPTION,3) <> 1 & , /* check for PAGe option */ + Abbrev('ASM',OPTION,3) <> 1 & , /* check for ASM option */ + Abbrev('AUX',OPTION,3) <> 1 & , /* check for ASM option */ + OPTION <> 'SMF' & , /* check for SMF option */ + OPTION <> 'SSI' & , /* check for SSI option */ + OPTION <> 'SSN' & , /* check for SSN option */ + OPTION <> 'SUB' & , /* check for SUB option */ + Abbrev('SUBSYSTEMS',OPTION,3) <> 1 & , /* check for SUB option */ + Abbrev('ASID',OPTION,3) <> 1 & , /* check for ASId option */ + Abbrev('ASVT',OPTION,3) <> 1 & , /* check for ASVt option */ + OPTION <> 'LPA' & , /* check for LPA option */ + Abbrev('LNKLST',OPTION,3) <> 1 & , /* check for LNKlst option */ + Abbrev('LINKLIST',OPTION,3) <> 1 & , /* check for LINklist option*/ + OPTION <> 'APF' & , /* check for APF option */ + OPTION <> 'SVC' & , /* check for SVC option */ + OPTION <> 'ALL' & , /* check for ALL option */ + Substr(OPTION,1,3) <> 'VAR' , /* check for VAR option */ + then call INVALID_OPTION /* no valid option... */ +Numeric digits 20 /* dflt of 9 not enough */ + /* 20 can handle 64-bit */ +Call COMMON /* control blocks needed by multiple routines */ +Call HEADING /* Heading sub-routine */ +Select + When OPTION = 'ALL' | Substr(OPTION,1,3) = 'VAR' then do + Call IPL /* IPL information */ + Call VERSION /* Version information */ + Call STOR /* Storage information */ + Call CPU /* CPU information */ + Call IPA /* Initialization info. */ + Call SYMBOLS /* Symbols information */ + Call VMAP /* Virt. Storage Map */ + Call PAGE /* Page DSN information */ + Call SMF /* SMF DSN information */ + Call SUB /* Subsystem information */ + Call ASID /* ASID usage information*/ + Call LPA /* LPA List information */ + Call LNKLST /* LNKLST information */ + Call APF /* APF List information */ + Call SVC /* SVC information */ + End /* when OPTION = 'ALL' */ + When Abbrev('VERSION',OPTION,3) = 1 then call VERSION + When Abbrev('STORAGE',OPTION,3) = 1 then call STOR + When Abbrev('STORE',OPTION,3) = 1 then call STOR + When Abbrev('MEMORY',OPTION,3) = 1 then call STOR + When Abbrev('SYMBOLS',OPTION,3) = 1 then call SYMBOLS + When Abbrev('VMAP',OPTION,3) = 1 then call VMAP + When Abbrev('ASM',OPTION,3) = 1 then call PAGE + When Abbrev('AUX',OPTION,3) = 1 then call PAGE + When Abbrev('SSI',OPTION,3) = 1 then call SUB + When Abbrev('SSN',OPTION,3) = 1 then call SUB + When Abbrev('SUBSYSTEMS',OPTION,3) = 1 then call SUB + When Abbrev('PAGE',OPTION,3) = 1 then call PAGE + When Abbrev('ASID',OPTION,3) = 1 then call ASID + When Abbrev('ASVT',OPTION,3) = 1 then call ASID + When Abbrev('LNKLST',OPTION,3) = 1 then call LNKLST + When Abbrev('LINKLIST',OPTION,3) = 1 then call LNKLST + Otherwise interpret "Call" OPTION +End /* select */ +/*********************************************************************/ +/* Done looking at all control blocks */ +/*********************************************************************/ +/*********************************************************************/ +/* IPLINFO called as a function with an alternate delimiter. */ +/* Return variable names and exit */ +/*********************************************************************/ +If Substr(OPTION,1,4) = 'VAR2' & EXEC_TYPE='FUNCTION' then do + "DROPBUF" /* remove data stack */ + FUNCDLM = VAR.1 /* function delimiter */ + ALL_VARS = Value(VAR.2) /* at least one var */ + Do V = 3 to 21 /* check for others */ + If VAR.V = '' then leave /* done, leave loop */ + Else ALL_VARS = ALL_VARS || , /* concat additional */ + FUNCDLM || Value(VAR.V) /* var + dlm at end */ + End /* end Do V */ + Return ALL_VARS /* return vars */ +End +/*********************************************************************/ +/* IPLINFO called as a function. Return variable names and exit */ +/*********************************************************************/ +If Substr(OPTION,1,3) = 'VAR' & EXEC_TYPE='FUNCTION' then do + "DROPBUF" /* remove data stack */ + ALL_VARS = Value(VAR.1) /* at least one var */ + Do V = 2 to 20 /* check for others */ + If VAR.V = '' then leave /* done, leave loop */ + Else ALL_VARS = ALL_VARS || , /* concat additional */ + FUNCDLM || Value(VAR.V) /* var + dlm at end */ + End /* end Do V */ + Return ALL_VARS /* return vars */ +End +/*********************************************************************/ +/* If ISPF is active and the BROWSEOP option is set (default) then */ +/* browse the output - otherwise write to the terminal */ +/*********************************************************************/ +If SYSISPF = 'ACTIVE' & BROWSEOP = 'YES' , /* ISPF active and */ + then call BROWSE_ISPF /* BROWSEOP option set? */ +Else do queued() /* ISPF is not active */ + Parse pull line /* pull queued lines */ + Say line /* say lines */ +End /* else do */ +Exit 0 /* End IPLINFO - RC 0 */ +/*********************************************************************/ +/* End of main IPLINFO code */ +/*********************************************************************/ +/*********************************************************************/ +/* Start of sub-routines */ +/*********************************************************************/ +INVALID_OPTION: /* Invalid option sub-routine */ +If SYSISPF = 'ACTIVE' then do + Queue ' ' + Queue ' ******************************************************' + If OPTION <> '?' then, + Queue ' * Invalid IPLINFO option. *' + Queue ' * Please hit PF1/HELP two times for valid options. *' + Queue ' ******************************************************' + Queue ' ' + OPTION = 'Invalid' + Call BROWSE_ISPF + Exit 16 + End +Else do + Call CKWEB /* call CKWEB sub-routine */ + Say Copies('*',79) + Say " " + If OPTION <> '?' then, + Say "Invalid IPLINFO option." + Say " " + Say "EXECUTION SYNTAX: %IPLINFO