From f3dc5b01be03bd6b4fc16f72fe9b1ae0fa42268d Mon Sep 17 00:00:00 2001 From: Jim Nelson Date: Fri, 15 Dec 2023 17:28:21 -0700 Subject: [PATCH] Thor 1.46.17 - Released 2023-12-16 * Bug in RunThor fixed (#219) * Added missing icon file (#235) * Remove references to Sys(3054) - (Issue #210) * Minor change to order of items in Contributing.md (Issue #229) * Clicking on column headers in CFU works for all relevant columns, resets to default for others. --- .github/CONTRIBUTING.md | 4 +- Change Log.md | 7 + Docs/Thor_running.md | 66 +- .../thor_proc_aftercomponentinstall.prg | 2 - .../thor_proc_beforecomponentinstall.prg | 2 - .../thor_proc_check_for_updates.prg | 79 - .../thor_proc_checkforupdate.prg | 7 - .../thor_proc_checkinternetconnection.prg | 27 - .../thor_proc_downloadandextracttopath.prg | 28 - .../thor_proc_downloadandinstallupdates.prg | 531 ---- .../thor_proc_downloadfilefromurl.prg | 137 - .../thor_proc_expand_bitly_url.prg | 27 - .../Procs_For_Thor/thor_proc_extractfiles.prg | 91 - .../thor_proc_extractfilesfromzip.prg | 39 - .../thor_proc_extracttopath.prg | 35 - .../thor_proc_getavailableversioninfo.prg | 80 - .../thor_proc_getupdatelist.prg | 124 - .../thor_proc_getupdaterobject.prg | 49 - .../thor_proc_getupdaterobject2.prg | 50 - .../Procs_For_Thor/thor_proc_messagebox.prg | 15 - .../thor_proc_scopeprocessor.prg | 126 - .../thor_proc_scopeprocessor.vc2 | 2300 ----------------- .../thor_proc_scopeprocessor.vct | Bin 282870 -> 0 bytes .../thor_proc_scopeprocessor.vcx | Bin 14113 -> 0 bytes .../Procs_For_Thor/thor_proc_setlibrary.prg | 24 - .../thor_proc_updatewaitwindow.prg | 3 - .../thor_proc_writetocfulog.prg | 46 - Installed Files/Source/basecontrols.vc2 | 2 +- Installed Files/Source/basecontrols.vct | Bin 47489 -> 59263 bytes Installed Files/Source/basecontrols.vcx | Bin 5828 -> 6156 bytes .../Source/createinternaltools.prg | 97 - Installed Files/Source/createrunthorprg.PRG | 131 +- .../Source/insertprgtextfromtemplatefiles.prg | 18 - Installed Files/Source/thor_utils.vc2 | 3 + Installed Files/Source/thor_utils.vct | Bin 53607 -> 53689 bytes Installed Files/Source/thor_utils.vcx | Bin 2013 -> 2013 bytes Installed Files/Source/thorversion.h | 8 +- .../Thor/Tools/Procs/checkforupdates.sc2 | 29 +- .../Thor/Tools/Procs/checkforupdates.sct | Bin 28127 -> 29259 bytes .../Thor/Tools/Procs/checkforupdates.scx | Bin 4303 -> 4303 bytes Installed Files/Thor/Tools/Procs/thor.ico | Bin 0 -> 2238 bytes .../thor_proc_downloadandinstallupdates.prg | 2 +- .../thor_tool_thorinternalmanageplugins.sc2 | 1 - .../thor_tool_thorinternalmanageplugins.sct | Bin 16887 -> 16856 bytes .../thor_tool_thorinternalmanageplugins.scx | Bin 2559 -> 2559 bytes README.md | 2 +- ThorUpdater/_ThorVersionFile.txt | 2 +- 47 files changed, 145 insertions(+), 4049 deletions(-) delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_aftercomponentinstall.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_beforecomponentinstall.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_check_for_updates.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_checkforupdate.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_checkinternetconnection.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_downloadandextracttopath.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_downloadandinstallupdates.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_downloadfilefromurl.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_expand_bitly_url.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_extractfiles.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_extractfilesfromzip.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_extracttopath.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_getavailableversioninfo.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_getupdatelist.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_getupdaterobject.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_getupdaterobject2.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_messagebox.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.vc2 delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.vct delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.vcx delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_setlibrary.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_updatewaitwindow.prg delete mode 100644 Installed Files/Source/Procs_For_Thor/thor_proc_writetocfulog.prg delete mode 100644 Installed Files/Source/createinternaltools.prg delete mode 100644 Installed Files/Source/insertprgtextfromtemplatefiles.prg create mode 100644 Installed Files/Thor/Tools/Procs/thor.ico diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 12d4f606..ee748f4a 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -21,13 +21,13 @@ Here are the steps to updating to a new version: 1. Update the AvailableVersion property in _ThorUpdater\\_ThorVersionFile.txt_. Be certain that the value be identical to the value of the `ccThorInternalVERSION` constant in _ThorVersion.h_. 1. Update the version number and date at the top of _README.md_ 1. Describe the changes in _Change Log.md_. -1. Run FoxBin2Prg to create the text files in folder _Installed Files_ - - `DO foxbin2prg.prg WITH 'BIN2PRG','*.*'` 1. Run _BuildThor.PRG_ in folder _"Installed Files\Source"_ to re-create the APP. You will need to this in an environment where Thor is no longer running: - `Cancel()` - `Close All` - `Clear All` - `Release All` +1. Run FoxBin2Prg to create the text files in folder _Installed Files_ + - `DO foxbin2prg.prg WITH 'BIN2PRG','*.*'` --- #### If updating version info for VFPX Projects / CFU (most projects) or creating an updater for a new projects --- diff --git a/Change Log.md b/Change Log.md index c002f31f..79ab2d01 100644 --- a/Change Log.md +++ b/Change Log.md @@ -1,5 +1,12 @@ # Thor Change Log +### Thor 1.46.17 - Released 2023-12-16 +* Bug in RunThor fixed (#219) +* Added missing icon file (#235) +* Remove references to Sys(3054) - (Issue #210) +* Minor change to order of items in Contributing.md (Issue #229) +* Clicking on column headers in CFU works for all relevant columns, resets to default for others. + ### Thor 1.46.16 - Released 2023-12-05 * Corrections to Thor installation page (Issue 226) * Modifications to CFU diff --git a/Docs/Thor_running.md b/Docs/Thor_running.md index c1372c3c..f181dd0b 100644 --- a/Docs/Thor_running.md +++ b/Docs/Thor_running.md @@ -1,33 +1,33 @@ -Running Thor -=== - -**Thor** needs to be started only once each IDE session, since it survives Clear All. - -There is a change in the recommended method for starting Thor, beginning with version 1.10.019, released Nov. 17.  This change allows ‘Check For Updates’ to be called automatically in the first IDE session of the day, at an interval of your choosing. - -There is a PRG named RunThor.PRG, which is created in the Thor sub-folder and which can be copied anywhere (such as to a folder in the path).  It is to be called like this: - - Do RunThor with tnDays, tlInstallAllUpdates - -This should be placed as early in the setup for your IDE as possible, certainly before any call to StartPEMEditor, so that any new updates can be downloaded before any other programs are running.  Remember that ‘Check for Updates’ performs a ‘Clear All’ if any updates are installed. - -The parameter tnDays is the interval in days between calls to ‘Check for Updates’.  A value of 1 means that it will be performed in your first IDE session of each day; a value of 7 means once a week. - -The parameter tlInstallAllUpdates is to be set to .T. if you want the updates to proceed without bothering to ask you whether you want to install them. - -The old mechanism for starting Thor, by calling Thor.App directly (see below), still works, but cannot invoke the ‘Check For Updates’ process. - - Do Thor.APP - -**Note**: The distinction here is that Thor.APP cannot be moved from its installation folder (if so, it has to be re-installed).  RunThor.PRG **can** be moved, as it contains an explicit reference to the folder where Thor.APP is installed. - -Thor.App can also be called with a single parameter for a variety of related tasks: - -Parameter|Description ----|--- -(none)|Runs Thor: Creates system menus and sub-menus, popup menus, and assigns hot keys to tools and popup menus. -‘Edit’|Opens the Thor form -‘Help’|Opens the Thor help page … [Thor Help](Thor_help.md) -‘Clear HotKeys’|Removes all hot key assignments. -‘Install’|Installs the current version of ‘Thor’. -‘Run’|Same as no parameter (deprecated) +Running Thor +=== + +**Thor** needs to be started only once each IDE session, since it survives Clear All. + +The recommended method for starting Thor, calling `RunThor.PRG` instead of `Thor.App`, allows ‘Check For Updates’ to be called automatically in the first IDE session of the day, at an interval of your choosing. + +`RunThor.PRG` is created in the Thor sub-folder and can be copied anywhere (such as to a folder in the path) since it contains an explicit reference to the folder where Thor is installed. It is to be called like this: + + Do RunThor with tnDays, tlInstallAllUpdates + +This should be placed as early in the setup for your IDE as possible so that any new updates can be downloaded before any other programs are running. Remember that ‘Check for Updates’ performs a ‘Clear All’ if any updates are installed. + +The parameter `tnDays` is the interval in days between calls to ‘Check for Updates’. A value of 1 means that it will be performed in your first IDE session of each day; a value of 7 means once a week. If the parameter is missing or is not a positive number, ‘Check For Updates’ is not called. + +The parameter `tlInstallAllUpdates` is to be set to .T. if you want the updates to proceed without bothering to ask you whether you want to install them. + +The old mechanism for starting Thor, by calling Thor.App directly (see below), still works, but cannot invoke the ‘Check For Updates’ process. + + Do Thor.APP + +**Note**: The distinction here is that `Thor.APP` cannot be moved from its installation folder (if so, it has to be re-installed). `RunThor.PRG` **can** be moved, as it contains an explicit reference to the folder where `Thor.APP` is installed. + +`Thor.App` can also be called with a single parameter for a variety of related tasks: + +Parameter|Description +---|--- +(none)|Runs Thor: Creates system menus and sub-menus, popup menus, and assigns hot keys to tools and popup menus. +‘Edit’|Opens the Thor form +‘Help’|Opens the Thor help page … [Thor Help](Thor_help.md) +‘Clear HotKeys’|Removes all hot key assignments. +‘Install’|Installs the current version of ‘Thor’. +‘Run’|Same as no parameter (deprecated) diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_aftercomponentinstall.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_aftercomponentinstall.prg deleted file mode 100644 index 200d26a9..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_aftercomponentinstall.prg +++ /dev/null @@ -1,2 +0,0 @@ -Lparameters tcApplicationName, tcInstallationFolder, tcZipFile - diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_beforecomponentinstall.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_beforecomponentinstall.prg deleted file mode 100644 index 58987fd8..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_beforecomponentinstall.prg +++ /dev/null @@ -1,2 +0,0 @@ -Lparameters tcApplicationName, tcInstallationFolder - diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_check_for_updates.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_check_for_updates.prg deleted file mode 100644 index e7ab8e5a..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_check_for_updates.prg +++ /dev/null @@ -1,79 +0,0 @@ -Local laFiles[1], lcToolFolder, lcUpdateFolder, llAutoRun, lnFileCount, lnI, lnReturn - -*** DH 2021-12-28: changed URL from VFPXRepository to GitHub -#Define UpdaterURL 'https://raw.githubusercontent.com/VFPX/Thor/master/ThorUpdater/Updates.zip' - -WritetoCFULog('Begin CFU - ' + Transform(Datetime())) - -If Not Execscript (_Screen.cThorDispatcher, 'Thor_Proc_CheckInternetConnection') - Messagebox ('No Internet Connection Found!', 16, 'No Internet Connection', 0) - Return .F. -Endif - -WritetoCFULog('Checking for updates to Thor', .T.) - -If Execscript (_Screen.cThorDispatcher, 'Thor_Proc_DownloadAndInstallUpdates', .T.) >= 0 - - lcToolFolder = Execscript (_Screen.cThorDispatcher, 'Tool Folder=') - WritetoCFULog('Erasing Thor FXP files...') - EraseFXPFiles (lcToolFolder) - WritetoCFULog('Erasing Thor FXP files from Thor Procs folder...') - EraseFXPFiles (lcToolFolder + 'Procs') - WritetoCFULog('Erasing Thor FXP files from Thor MyTools folder...') - EraseFXPFiles (lcToolFolder + 'My Tools') - - lcUpdateFolder = Addbs (lcToolFolder) + 'Updates\' - lnFileCount = Adir (laFiles, lcUpdateFolder + '*.PRG') - WritetoCFULog('Processing (' + transform(lnFileCount) + ') Thor updater programs...') - - For lnI = 1 To lnFileCount - If Not Upper (laFiles[lnI, 1]) == Upper ('Thor_Update_Thor.PRG') - Erase (lcUpdateFolder + laFiles[lnI, 1]) - Endif - Endfor - *** Download the zip of Updaters, and install them - lnReturn = Execscript (_Screen.cThorDispatcher ; - , 'Thor_Proc_DownloadAndExtractToPath' ; - , UpdaterURL + '?=' + Sys(2015) ; - , lcToolFolder ; - , .T. ; - , 'Updates') - - *** Check if called from RunThor, meaning it is from AutoRun - llAutoRun = .F. - For lnI = 1 To Program (-1) - llAutoRun = llAutoRun Or 'RUNTHOR' $ Upper (Sys(16, lnI)) - Endfor - - WritetoCFULog('Checking for updates to all other apps', .T.) - - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_DownloadAndInstallUpdates', .F., llAutoRun) - - Execscript (_Screen.cThorDispatcher, 'Run') - -Endif - -Execscript (_Screen.cThorDispatcher, 'Thor_Tool_ThorInternalThorNews', 'Check For Updates') - -Wait Clear - -Return - - -Procedure EraseFXPFiles (tcFolder) - Local lcFolder, lnCount, lnI, loException - lcFolder = Addbs (tcFolder) - lnCount = Adir (laFiles, lcFolder + '*.FXP') - For lnI = 1 To lnCount - Try - Erase (lcFolder + laFiles[lnI, 1]) - Catch To loException - - Endtry - Endfor -Endproc - - -Procedure WritetoCFULog(tcText, tlDivider) - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WritetoCFULog(', tcText, tlDivider) -EndProc diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_checkforupdate.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_checkforupdate.prg deleted file mode 100644 index 09c9ed2a..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_checkforupdate.prg +++ /dev/null @@ -1,7 +0,0 @@ -Lparameters toUpdateInfo - -*-- Get the available version from the cloud. (2011-11-07 M. Slay - Revised to pass in UpdateInfo object -toUpdateInfo = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_GetAvailableVersionInfo', toUpdateInfo) - -Execscript (_Screen.cThorDispatcher, 'Result=', toUpdateInfo) -Return toUpdateInfo \ No newline at end of file diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_checkinternetconnection.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_checkinternetconnection.prg deleted file mode 100644 index 6cc459ee..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_checkinternetconnection.prg +++ /dev/null @@ -1,27 +0,0 @@ -* Thanks for the fox wiki http://fox.wikis.com/wc.dll?Wiki~IsSystemConnectedToInternet it was easy to modify the prg - -#Define FLAG_ICC_FORCE_CONNECTION 1 - -Local lcUrl, llResult -*Declare Long InternetCheckConnection In Wininet.Dll String Url, Long dwFlags, Long Reserved -Declare SHORT InternetGetConnectedState IN wininet; - INTEGER @ lpdwFlags,; - INTEGER dwReserved - -*!* Fast and reliable web site -*!* lcUrl = 'http://www.google.com' && or maybe better to check for the in this case correct web site? -*!* Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Checking internet connection by contacting ' + lcUrl) - -*!*If InternetCheckConnection (lcUrl, FLAG_ICC_FORCE_CONNECTION, 0) # 0 -Local lnFlags -lnFlags = 0 - -If InternetGetConnectedState(@lnFlags, 0) = 1 - llResult = .T. - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Internet connection test passed.') -Else - llResult = .F. - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Internet connection test FAILED!!!') -EndIf - -Return ExecScript(_Screen.cThorDispatcher, 'Result=', llResult) diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_downloadandextracttopath.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_downloadandextracttopath.prg deleted file mode 100644 index 1d188dd9..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_downloadandextracttopath.prg +++ /dev/null @@ -1,28 +0,0 @@ -Lparameters tcSourceFileURL, tcInstallPath, tlShowCopyErrorDialog, tcAppName - -#Define ERROR_DOWNLOADING_FILE -1 -#Define ERROR_EXTRACTING_FILE -2 -#Define ERROR_INSTALLING_FILES -3 - -Local lcDownloadDestinationFile, lcDownloadPath, lcTempName, llReturn, lnReturn - -*--- Download the file to temp folder --------------------------- -_Screen.AddProperty ('cThorLastZipFile', '') - -lcDownloadPath = Sys(2023) && Store ZIP file to user's Temp folder -lcTempName = 'Thor_ToolInstaller_' + Evl (tcAppName, 'X') + Sys(2015) -lcDownloadDestinationFile = Addbs (lcDownloadPath) + lcTempName + '.zip' && create a random name for the ZIP file - -llReturn = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_DownloadFileFromURL', tcSourceFileURL, lcDownloadDestinationFile) - -If Not llReturn - Return Execscript (_Screen.cThorDispatcher, 'Result=', ERROR_DOWNLOADING_FILE) -Endif - -_Screen.AddProperty ('cThorLastZipFile', lcDownloadDestinationFile) - -*-- Extract to temp folder and then to target install folder ---------- -lnReturn = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_ExtractToPath' ; - , lcDownloadDestinationFile, lcTempName, tcAppName, tcInstallPath, tlShowCopyErrorDialog) - -Return Execscript (_Screen.cThorDispatcher, 'Result=', lnReturn) diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_downloadandinstallupdates.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_downloadandinstallupdates.prg deleted file mode 100644 index fa0acdcd..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_downloadandinstallupdates.prg +++ /dev/null @@ -1,531 +0,0 @@ -Lparameters tlIsThor, llAutoRun - -Local lnReturn -lnReturn = CheckForUpdates_Main (tlIsThor, llAutoRun) - -Execscript (_Screen.cThorDispatcher, 'Result=', lnReturn) - -Return - - - -*************************************************************** -#Define ccUpdateDelimiter Chr(0) -#Define ccPropertyDelimiter Chr(1) -#Define ccFieldDelimiter Chr(2) - -#Define ccCR Chr(13) -#Define ccLF Chr(10) - -#Define EmptyVerDate Date(2001,1,1) -#Define DaysForRecentReleases 60 -*************************************************************** - -Procedure CheckForUpdates_Main (tlIsThor, llAutoRun) - - Local lcCol, lcRow, lnCurrentUpdateCount, lnResult, loUpdateList - - WritetoCFULog('Getting list of Updaters') - loUpdateList = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_GetUpdateList', tlIsThor) - lnCurrentUpdateCount = loUpdateList.Count - - If lnCurrentUpdateCount = 0 - Return 0 - Endif - - loUpdateList = GetAvailableVersionInfo (loUpdateList) - Wait Clear - If 'O' # Vartype (loUpdateList) && failure to get update list? - WritetoCFULog('Aborting ... no update list found') - Return - 1 - Endif - - If tlIsThor - loUpdateList = SelectFromUpdateList (loUpdateList) - lnResult = CheckIfReadyToGo (loUpdateList) - Else - loUpdateList = SelectUpdates (loUpdateList, llAutoRun) - Use In (Select ('crsr_ThorUpdates')) - If Type ('loUpdateList') = 'O' And loUpdateList.Count > 0 - lnResult = 1 - Else - lnResult = 0 - Endif - Endif - - If lnResult = 1 - loUpdateList = ClearAll (loUpdateList) - InstallUpdates (loUpdateList) - - Wait Clear - ? 'Updating complete' - - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_MessageBox', 'Updating completed', 0, 'Thor Updates...') - Return 1 - Else - WritetoCFULog('Exiting ... no updates selected') - Endif - - Return lnResult - -Endproc - - -Procedure GetAvailableVersionInfo (toUpdateList) - - Local loUpdateList As 'Collection' - Local laMembers[1], lcName, lnI, lnJ, loNewVersionInfo, loUpdateInfo - - loUpdateList = Createobject ('Collection') - - For lnI = 1 To toUpdateList.Count - loUpdateInfo = toUpdateList[lnI] - If loUpdateInfo.NeverUpdate # 'Y' - WritetoCFULog('Getting available version info for ' + loUpdateInfo.ApplicationName) - loUpdateInfo = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_GetAvailableVersionInfo', loUpdateInfo) - Endif - If loUpdateInfo.ErrorCode = 0 - loUpdateList.Add (loUpdateInfo) - Endif - Endfor - - Wait Clear - Return loUpdateList - -Endproc - - -Procedure SelectFromUpdateList (toUpdateList) - - Local laMembers[1], lcName, lnI, lnJ, loNewVersionInfo, loUpdateInfo, loUpdateList - - loUpdateList = Createobject ('Collection') - - For lnI = 1 To toUpdateList.Count - loUpdateInfo = toUpdateList[lnI] - If Not Empty (loUpdateInfo.SourceFileURL) ; - And Not loUpdateInfo.AvailableVersion == loUpdateInfo.CurrentVersion - loUpdateList.Add (loUpdateInfo) - Endif - Endfor - Return loUpdateList - -Endproc - - -Procedure CheckIfReadyToGo (toUpdateList) - * Returns: - * 1 = Doit it! - * 0 = Nothing to do - * -1 = Cancelled - Local lcMessage, lcNames, lnI, lnResponse, loUpdateInfo - - lcNames = '' - For lnI = 1 To toUpdateList.Count - loUpdateInfo = toUpdateList[lnI] - lcNames = lcNames + Chr(13) + Space(8) + loUpdateInfo.ApplicationName + ': ' + loUpdateInfo.AvailableVersion - Endfor - - If toUpdateList.Count > 0 - lcMessage = 'Ready to install ' + Transform (toUpdateList.Count) + ' update(s):' + Chr(13) + lcNames - lnResponse = Messagebox (lcMessage + Chr(13) + Chr(13) + ; - 'CLEAR ALL and CLOSE ALL statements must be run in order to update.' + Chr(13) + Chr(13) + ; - 'Do you wish to continue?', 4, 'Allow CLEAR ALL, etc.?') - Return Iif (lnResponse = 6, 1, -1) - Else - Return 0 - Endif - -Endproc - - -Procedure SelectUpdates (loUpdateList, llAutoRun) - Local loResultList As 'Collection' - Local lcFormFileName, llAnyFound, llResult, lnResult - - llAnyFound = CreateUpdatesCursor (loUpdateList) - If llAutoRun And Not llAnyFound - Return - Endif - - lcFormFileName = Execscript (_Screen.cThorDispatcher, 'Full Path=CheckForUpdates.SCX') - Do Form (lcFormFileName) To llResult - - If llResult - Select crsr_ThorUpdates - loResultList = Createobject ('Collection') - Scan For UpdateNow - loResultList.Add (loUpdateList[RecNo]) - Endscan - Return loResultList - Endif - -Endproc - - - -Procedure CreateUpdatesCursor (toUpdateList) - - Local laLines[1], llAnyFound, lnI, lnLineCount, loVersionInfo - Create Cursor crsr_ThorUpdates ( ; - Recno N(4), ; - AppName C(40), ; - InstalledVersion C(100), ; - InstalledVerNumber C(100), ; - InstalledVerDate C(20), ; - AvailableVersion C(100), ; - AvailableVerNumber C(100), ; - AvailableVerDate C(20), ; - Status C(40), ; - ProjectCreationDate D, ; - UpdateNow L, ; - NeverUpdate L, ; - NeverUpdateFile C(250), ; - FromMyUpdates L, ; - Notes M, ; - Link M, ; - LinkPrompt C(100), ; - IsNew L, ; - IsCurrent L, ; - SortKey C(100), ; - VerDate D, ; - VerNumber C(100) ; - ) - - llAnyFound = .F. - - For lnI = 1 To toUpdateList.Count - With toUpdateList[lnI] - - Insert Into crsr_ThorUpdates ; - (Recno, AppName, InstalledVersion, AvailableVersion, Notes, FromMyUpdates, ProjectCreationDate) ; - Values ; - (lnI, .ApplicationName, .CurrentVersion, .AvailableVersion, .Tag, .FromMyUpdates = 'Y', .ProjectCreationDate) - - loVersionInfo = GetVersionInfo (.CurrentVersion) - Replace InstalledVerNumber With Alltrim (loVersionInfo.VerNumber) + Iif (loVersionInfo.VerDate <= EmptyVerDate, '', ' (' + Dtoc (loVersionInfo.VerDate) + ')') - *!* Replace InstalledVerNumber With loVersionInfo.VerNumber ; - *!* InstalledVerDate With loVersionInfo.VerDate - - *!* * Removed 10/3/2012 / JRN - *!* If (Not .CurrentVersion == .AvailableVersion) And Not Empty (.AvailableVersion) - If Not Empty (.AvailableVersion) - loVersionInfo = GetVersionInfo (.AvailableVersion) - Replace AvailableVerNumber With Alltrim (loVersionInfo.VerNumber) + ' (' + Dtoc (loVersionInfo.VerDate) + ')' - *!* Replace AvailableVerNumber With loVersionInfo.VerNumber ; - *!* AvailableVerDate With loVersionInfo.VerDate - Endif - - Replace NeverUpdate With .NeverUpdate = 'Y' ; - UpdateNow With (Not NeverUpdate) ; - And (.AvailableVersion > EVL(.CurrentVersion, ' ') ; - or GetLastWord(.AvailableVersion) > GetLastWord('20999999 ' + .CurrentVersion)) ; - And (.UpdateNowIfNotInstalled = 'Yes' Or Not Empty (.CurrentVersion)) ; - IsNew With .ProjectCreationDate >= Date() - DaysForRecentReleases ; - IsCurrent With .CurrentVersion == .AvailableVersion ; - NeverUpdateFile With .NeverUpdateFile ; - Notes With Transform(.Notes) ; - Link With Transform(.Link) ; - LinkPrompt With Transform(Evl (.LinkPrompt, .Link)) ; - VerDate with loVersionInfo.VerDate ; - VerNumber with loVersionInfo.VerNumber - - Replace SortKey With ; - Icase(UpdateNow, 'A', ; - NeverUpdate, 'Z', ; - Empty(InstalledVerNumber) And IsNew, 'B', ; - Empty(InstalledVerNumber) And VerDate > Date() - DaysForRecentReleases, 'D', ; - IsCurrent, 'C', ; - 'X') + ; - Upper(AppName) - - Replace Status With ; - Icase(Left(SortKey, 1) = 'A', 'Update available', ; - Left(SortKey, 1) = 'B', 'New Project', ; - Left(SortKey, 1) = 'C', 'Current', ; - Left(SortKey, 1) = 'D', 'Recently Updated', ; - 'Not Installed') - - llAnyFound = llAnyFound Or UpdateNow - - Endwith - Endfor && lnI = 1 to toUpdateList.Count - - Select * ; - From crsr_ThorUpdates ; - Into Cursor crsr_ThorUpdates Readwrite ; - Order By SortKey - Goto Top - - Return llAnyFound - -Procedure GetVersionInfo (lcVersion) - Local loResult As 'Empty' - Local laLines[1], lnLineCount - loResult = Createobject ('Empty') - AddProperty (loResult, 'VerNumber', '') - AddProperty (loResult, 'VerDate', EmptyVerDate) - - If Empty (lcVersion) - Return loResult - Endif - - lnLineCount = Alines (laLines, lcVersion, 5, '-') - Do Case - Case lnLineCount = 1 - loResult.VerNumber = laLines[1] - Case lnLineCount = 2 - loResult.VerNumber = laLines[1] - * loResult.VerDate = laLines[2] - Case lnLineCount = 3 - loResult.VerNumber = laLines[2] - * loResult.VerDate = laLines[3] - Otherwise - loResult.VerNumber = laLines[2] - loResult.VerDate = laLines[3] - Try - loResult.VerDate = Date (Val (Substr (laLines[4], 1, 4)), Val (Substr (laLines[4], 5, 2)), Val (Substr (laLines[4], 7, 2))) - Catch - Endtry - Endcase - Return loResult -EndProc - - -Procedure GetLastWord(tcText) - Return GetWordNum(tcText, GetWordCount(tcText)) -EndProc - -********************************************************************** -********************************************************************** - -Procedure ClearAll (toUpdateList) - - Local loUpdateList As 'Collection' - Local laMembers[1], laProperties[1], laUpdates[1], lcName, lcProp, lcUpdateInfo, lnDelim, lnI, lnJ - Local loUpdate, lxValue - -*** DH 2021-12-28: added this line to preserve the folder Thor.app runs from - loThor = execscript(_screen.cThorDispatcher, 'Thor Engine=') - addproperty(_screen, 'cThorAppFolder', loThor.cAppFolder) - - * saving all custom properties into _Screen._ThorClearAllObject - * so that they can be restored after the Clear All - lcUpdateInfo = '' - For lnI = 1 To toUpdateList.Count - loUpdate = toUpdateList (lnI) - Amembers (laMembers, loUpdate) - For lnJ = 1 To Alen (laMembers) - lcName = laMembers[lnj] - If Pemstatus (loUpdate, lcName, 4) - lxValue = Getpem (loUpdate, lcName) - If Type ('lxvalue') = 'C' - lcUpdateInfo = lcUpdateInfo + lcName + ccFieldDelimiter + lxValue + ccPropertyDelimiter - Endif - Endif - Endfor - lcUpdateInfo = lcUpdateInfo + ccUpdateDelimiter - Endfor && lnI = 1 to loUpdateList.Count - - _Screen.AddProperty ('_ThorClearAllObject', lcUpdateInfo) - - Release All - - Clear All - Clear All - Clear All - Clear All - Clear All - Clear All - - Close All - Clear Program - - Inkey (.25) && not sure if this is needed - - Alines (laUpdates, _Screen._ThorClearAllObject, 5, ccUpdateDelimiter) - loUpdateList = Createobject ('Collection') - For lnI = 1 To Alen (laUpdates) - loUpdate = Createobject ('Empty') - Alines (laProperties, laUpdates[lnI], 5, ccPropertyDelimiter) - For lnJ = 1 To Alen (laProperties) - lcProp = laProperties[lnJ] - lnDelim = At (ccFieldDelimiter, lcProp) - AddProperty (loUpdate, Left (lcProp, lnDelim - 1), Substr (lcProp, lnDelim + 1)) - Endfor - loUpdateList.Add (loUpdate) - Endfor && lnI = 1 to Alen(laUpdates) - -*** DH 2021-12-28: delete Thor.App if it needs to be updated - if lower(loUpdate.AppName) = 'thor.app' - erase (addbs(_screen.cThorAppFolder) + 'Thor.app') - endif - - Return loUpdateList -Endproc - - -Procedure InstallUpdates (toUpdateList) - Local lcAPPFolder, lcAPPName, lcApplicationName, lcDestFolder, lcDestZip, lcDownloadedZip - Local lcDownloadsFolder, lcExecPhrase, lcInstallationFolder, lcToolFolder, lcUpdatePhrase - Local lcVersionFile, lnI, lnReturn, loException, loUpdate, ltFileTimeStamp - - WritetoCFULog('Downloading and installing selected updates', .T.) - lcToolFolder = Addbs (Execscript (_Screen.cThorDispatcher, 'Tool Folder=')) - lcDownloadsFolder = Addbs (SyS(2023)) + 'Thor Downloads\' - CreateFolder (lcDownloadsFolder) - - For lnI = 1 To toUpdateList.Count - loUpdate = toUpdateList (lnI) - - If loUpdate.Component = 'Yes' - lcAPPFolder = Addbs (lcToolFolder + 'Components') - Else - lcAPPFolder = Addbs (lcToolFolder + 'Apps') - Endif - - lcApplicationName = Chrtran (loUpdate.ApplicationName, ' ' + GetInvalidFileNameChars(), '') - lcDestFolder = Addbs (lcDownloadsFolder + lcApplicationName) - lcDestZip = lcDestFolder + Chrtran (loUpdate.AvailableVersion, GetInvalidFileNameChars(), '') + '.Zip' - CreateFolder (lcDestFolder) - - lcInstallationFolder = loUpdate.InstallationFolder - If Empty (lcInstallationFolder) - lcInstallationFolder = lcAPPFolder + lcApplicationName - Endif - CreateFolder (lcInstallationFolder) - - ltFileTimeStamp = .F. - If (Not Empty (loUpdate.AppName)) ; - And (Not Empty (loUpdate.CurrentVersion)) ; - And Not loUpdate.CurrentVersion == loUpdate.AvailableVersion - lcAPPName = Addbs (lcInstallationFolder) + loUpdate.AppName - If File (lcAPPName) - ltFileTimeStamp = Fdate (lcAPPName, 1) - Endif - Endif - - _Screen.AddProperty ('cThorLastZipFile', '') - - WritetoCFULog('Download ' + loUpdate.ApplicationName) - If loUpdate.Component = 'Yes' - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_BeforeComponentInstall', loUpdate.ApplicationName, lcInstallationFolder) - Endif - - If Not Empty (loUpdate.SourceFileURL) - WritetoCFULog('Attempting download of ' + loUpdate.SourceFileURL) - lnReturn = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_DownloadAndExtractToPath' ; - , loUpdate.SourceFileURL, lcInstallationFolder, 'Y' $ Upper (loUpdate.ShowErrorMessage), loUpdate.ApplicationName) - If lnReturn < 0 And Pemstatus(loUpdate, 'AltSourceFileURL', 5) And Not Empty(loUpdate.AltSourceFileURL) - WritetoCFULog('Download failed; attempting alternate download of ' + loUpdate.AltSourceFileURL) - lnReturn = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_DownloadAndExtractToPath' ; - , loUpdate.AltSourceFileURL, lcInstallationFolder, 'Y' $ Upper (loUpdate.ShowErrorMessage), loUpdate.ApplicationName) - Endif - Else - lnReturn = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_ExtractToPath' ; - , loUpdate.LocalSourceZip, 'Thor_ToolInstaller_' + Evl (loUpdate.ApplicationName, 'X') + Sys(2015) ; - , loUpdate.ApplicationName, lcInstallationFolder, 'Y' $ Upper (loUpdate.ShowErrorMessage)) - Endif - - WritetoCFULog('Copy Zip ' + loUpdate.ApplicationName) - * copy zip to our new Downloads folder - lcDownloadedZip = _Screen.cThorLastZipFile - Try - Delete File (lcDestZip) - Copy File (lcDownloadedZip) To (lcDestZip) - Catch - Endtry - - If Not Empty (ltFileTimeStamp) ; - And ltFileTimeStamp = Fdate (lcAPPName, 1) ; - And File (Addbs (lcInstallationFolder) + loUpdate.VersionLocalFilename) - lnReturn = -999 && failure - Endif - - If lnReturn > 0 - WritetoCFULog('Install ' + loUpdate.ApplicationName) - If loUpdate.Component = 'Yes' - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_AfterComponentInstall', loUpdate.ApplicationName, lcInstallationFolder, lcDownloadedZip) - Endif - - Try - Delete File (lcDownloadedZip) - Catch - Endtry - - lcUpdatePhrase = loUpdate.RegisterWithThor - lcUpdatePhrase = Strtran (lcUpdatePhrase, '##InstallFolder##', Addbs (lcInstallationFolder)) - lcUpdatePhrase = Strtran (lcUpdatePhrase, '##LocalVersionFile##', loUpdate.LocalVersionFile) - lcUpdatePhrase = Strtran (lcUpdatePhrase, '##Version##', Alltrim (Getwordnum (loUpdate.AvailableVersion, 2, '-'))) - lcUpdatePhrase = Strtran (lcUpdatePhrase, '##FullVersionText##', loUpdate.AvailableVersion) - lcUpdatePhrase = Strtran (lcUpdatePhrase, '##Link##', loUpdate.Link) - - *!* Try - lcExecPhrase = CreateDefines (loUpdate) + lcUpdatePhrase - Execscript (lcExecPhrase) - *!* Catch To loException - *!* ShowErrorMsg (loException) - *!* Endtry - - lcVersionFile = loUpdate.LocalVersionFile - Erase (lcVersionFile) - Strtofile (loUpdate.AvailableVersion, lcVersionFile) - - ? loUpdate.AvailableVersion + ' ... Updated' - Else - ? - ? '********** Failed: ' + loUpdate.AvailableVersion - ? '********** See ' + lcDestZip - ? - Endif - Endfor && lnI = 1 to loUpdateList.Count -Endproc - - -Procedure ShowErrorMsg - Lparameters loException - - Messagebox ('Error: ' + Transform (loException.ErrorNo) + Chr(13) + Chr(13) + ; - 'Message: ' + loException.Message + Chr(13) + Chr(10) + ; - 'Procedure: ' + loException.Procedure + Chr(13) + Chr(10) + ; - 'Line: ' + Transform (loException.Lineno) + Chr(13) + Chr(10) + ; - 'Code: ' + loException.LineContents ; - , 0 + 48, 'Error') -Endproc - - -Procedure CreateDefines (loUpdate) - Local laMembers[1], lcDefines, lcName, lnJ, lxValue - lcDefines = '' - Amembers (laMembers, loUpdate) - For lnJ = 1 To Alen (laMembers) - lcName = laMembers[lnj] - lxValue = Getpem (loUpdate, lcName) - If Type ('lxvalue') = 'C' And Not Chr(13) $ lxValue - lcDefines = lcDefines + '#Define cc' + lcName + ' [' + lxValue + ']' + Chr(13) - Endif - Endfor - Return lcDefines -Endproc - - -Procedure CreateFolder (lcFolder) - If Not Directory (lcFolder) - Mkdir (lcFolder) - Endif -Endproc - -* Following from Sergey -Function GetInvalidFileNameChars() - Local lcInvalidFileNameChars, lnAsc - lcInvalidFileNameChars = [*/:<>?|\] + Chr(34) - For lnAsc = 0 To 31 - lcInvalidFileNameChars = lcInvalidFileNameChars + Chr (lnAsc) - Endfor - Return lcInvalidFileNameChars -Endfunc - - -Procedure WritetoCFULog (tcText, tlDivider) - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', tcText, tlDivider, 1) -EndProc \ No newline at end of file diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_downloadfilefromurl.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_downloadfilefromurl.prg deleted file mode 100644 index 7a3a3fa5..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_downloadfilefromurl.prg +++ /dev/null @@ -1,137 +0,0 @@ -LPARAMETERS pcUrlName, tcDownloadDestinationFile - -DECLARE INTEGER InternetOpen IN wininet.DLL STRING sAgent, ; - INTEGER lAccessType, STRING sProxyName, ; - STRING sProxyBypass, INTEGER lFlags - -DECLARE INTEGER InternetOpenUrl IN wininet.DLL ; - INTEGER hInternetSession, STRING sUrl, STRING sHeaders,; - INTEGER lHeadersLength, INTEGER lFlags, INTEGER lContext - -DECLARE INTEGER InternetReadFile IN wininet.DLL INTEGER hfile, ; - STRING @sBuffer, INTEGER lNumberofBytesToRead, INTEGER @lBytesRead - -DECLARE short InternetCloseHandle IN wininet.DLL INTEGER hInst - -#DEFINE INTERNET_OPEN_TYPE_PRECONFIG 0 -#DEFINE INTERNET_OPEN_TYPE_DIRECT 1 -#DEFINE INTERNET_OPEN_TYPE_PROXY 3 -#DEFINE SYNCHRONOUS 0 -#DEFINE INTERNET_FLAG_RELOAD 2147483648 -#DEFINE CR CHR(13) - -local lsAgent, lhInternetSession, lhUrlFile, llOk, lnOk, lcRetVal, lcReadBuffer, lnBytesRead - - - - - -ExecScript(_Screen.cThorDispatcher, "Thor_Proc_UpdateWaitWindow", 'Contacting server.... Please wait.') - -*--- 2011-11-02 M. Slay: Added this guard against empty parameters being passed -If Empty(pcUrlName) or Empty(tcDownloadDestinationFile) - llReturn = .f. - Execscript (_Screen.cThorDispatcher, 'Result=', llReturn) - Return llReturn -EndIf - -*--- 2011-11-02: Added support for expanding Bitly URL to long URL -If 'http://bit.ly' $ lower(pcUrlName) - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Expanding bitly link [' + pcUrlName + ']') - pcUrlName = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_Expand_Bitly_Url', pcUrlName) - If !Empty(pcUrlName) - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Expanded bitly link to [' + pcUrlName + ']') - Endif -EndIf - -If Empty(pcUrlName) - lcMessage = "Requested URL is an empty string." - ExecScript(_Screen.cThorDispatcher, "Thor_Proc_UpdateWaitWindow", lcMessage) - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', lcMessage) - llReturn = .f. - Execscript (_Screen.cThorDispatcher, 'Result=', llReturn) - Return llReturn -Endif - -If '?' $ pcUrlName - lcUrl = pcUrlName + '&' + Sys(2015) -Else - lcUrl = pcUrlName + '?=' + Sys(2015) -EndIf - - *-- what application is using Internet services? -lsAgent = "VPF 5.0" - -lhInternetSession = InternetOpen(lsAgent, INTERNET_OPEN_TYPE_PRECONFIG, '', '', SYNCHRONOUS) - -*-- debugging line - uncomment to see session handle -*-- WAIT WINDOW "Internet session handle: " + LTRIM(STR(lhInternetSession)) - -IF lhInternetSession = 0 - lcMessage = "Internet session cannot be established" - ExecScript(_Screen.cThorDispatcher, "Thor_Proc_UpdateWaitWindow", lcMessage) - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', lcMessage) - llReturn = .f. - Execscript (_Screen.cThorDispatcher, 'Result=', llReturn) - Return llReturn -Else - lcMessage = 'Requesting file ' + JustFname(pcUrlName) + ' from server.' - ExecScript(_Screen.cThorDispatcher, "Thor_Proc_UpdateWaitWindow", lcMessage) - lcMessage = 'Requesting file ' + JustFname(lcUrl) + ' from server.' - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', lcMessage) -ENDIF - - lhUrlFile = InternetOpenUrl(lhInternetSession, lcUrl, '', 0, INTERNET_FLAG_RELOAD, 0) - -*-- debugging line - uncomment to see URL handle -*-- WAIT WINDOW "URL Handle: " + LTRIM(STR(lhUrlFile)) - -IF lhUrlFile = 0 - lcMessage = "URL cannot be opened" - ExecScript(_Screen.cThorDispatcher, "Thor_Proc_UpdateWaitWindow", lcMessage) - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', lcMessage) - llReturn = .f. - Execscript (_Screen.cThorDispatcher, 'Result=', llReturn) - Return llReturn -Else - lcMessage = "Downloading..." - ExecScript(_Screen.cThorDispatcher, "Thor_Proc_UpdateWaitWindow", lcMessage) - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', lcMessage) -ENDIF - -lcRetVal = "" -llOk = .t. - -DO WHILE llOK - *-- set aside a big buffer - lsReadBuffer = SPACE(32767) - lnBytesRead = 0 - lnOK = InternetReadFile(lhUrlFile, @lsReadBuffer, LEN(lsReadBuffer), @lnBytesRead) - - if (lnBytesRead > 0) - lcRetVal = lcRetVal + left(lsReadBuffer, lnBytesRead) - endif - - *-- error trap - either a read failure or read past eof() - llOk = (lnOK = 1) and (lnBytesRead > 0) -ENDDO - -*--close all the handles we opened -InternetCloseHandle(lhUrlFile) -InternetCloseHandle(lhInternetSession) - -Try - Erase (tcDownloadDestinationFile) - StrToFile(lcRetVal, tcDownloadDestinationFile,0) - llReturn = .t. - lcMessage = "Download complete." -Catch - llReturn = .f. - lcMessage = "Error downloading or saving file." -Endtry - -ExecScript(_Screen.cThorDispatcher, "Thor_Proc_UpdateWaitWindow", lcMessage) -Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', lcMessage) -Execscript (_Screen.cThorDispatcher, 'Result=', llReturn) -Return llReturn - diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_expand_bitly_url.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_expand_bitly_url.prg deleted file mode 100644 index 7317f234..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_expand_bitly_url.prg +++ /dev/null @@ -1,27 +0,0 @@ -Lparameters tcBitlyShortUrl - -Local lcVersionFileResponse, lcVersionFileUrl - -llReturn = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_SetLibrary', 'VFPConnection.fll') - -If !llReturn - Execscript (_Screen.cThorDispatcher, 'Result=', .f.) - Return .f. -Endif - -Try - lcVersionFileResponse = HTTPSToStr(tcBitlyShortUrl) -Catch - lcVersionFileResponse = '' -Endtry - -If !Empty(lcVersionFileResponse) - lcVersionFileUrl = GetWordNum(lcVersionFileResponse, 2, '"') -Else - lcVersionFileUrl = '' -EndIf - -Execscript (_Screen.cThorDispatcher, 'Result=', lcVersionFileUrl) -Return lcVersionFileUrl - - \ No newline at end of file diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_extractfiles.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_extractfiles.prg deleted file mode 100644 index f6dd3320..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_extractfiles.prg +++ /dev/null @@ -1,91 +0,0 @@ - Lparameters tcSource, tcDestinationPath, tlExtractFromFirstFolder, tlShowCopyErrorDialog - - && Parameter tcSource is a fully qualifed path or path+filename+ext (i.e. "C:\TEMP\downloads" or "C:\TEMP\downloads\SomeFile.zip") - - * --- Credit: Original code sample came from here: http://www.tek-tips.com/faqs.cfm?fid=5113 - - #DEFINE ERROR_SOURCE_FILE_NOT_FOUND -1 - #DEFINE ERROR_CREATING_DESTINATION_PATH -2 - #DEFINE ERROR_OPENING_SOURCE -3 - #DEFINE ERROR_EXTRACTING_FILES -4 - - Local loShellApp as "shell.application" - Local lnError, loFiles - Local lnAnswerYesToAllOverwriteFilePrompts, lnCreateDestinationFolderIfNotPresent, lnShowErrorDialog, lnOptions - - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Copying files to install folder...') - - lnError = 0 - - *-- Create the destination folder, in case it is not present [Universal Thread Message ID: 1450231] - If Not Directory(tcDestinationPath) - Try - Declare Integer SHCreateDirectory In shell32 ; - Integer hWindow, String pszPath - SHCreateDirectory(_vfp.HWnd, Strconv(tcDestinationPath + Chr(0), 5)) - Catch - lnError = ERROR_CREATING_DESTINATION_PATH - Finally - Endtry - Endif && not Directory(tcDestinationPath) - - If lnError < 0 - lcErrorMessage = 'Error creating or accessing install folder [' + tcDestinationPath + ']' - MessageBox(lcErrorMessage, 16, 'Error!') - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', lcErrorMessage) - Execscript (_Screen.cThorDispatcher, 'Result=', lnError) - Return lnError - EndIf - - *-- Open the zip file or path ----------------------------------------------- - Try - loShellApp = Createobject("shell.application") - - loFiles = loShellApp.NameSpace(tcSource).Items - - If tlExtractFromFirstFolder - loFiles = loShellApp.NameSpace(loFiles.Item(0)).Items && Make entry point the first folder within zip file or source path - EndIf - Catch - lnError = ERROR_OPENING_SOURCE - Finally - Endtry - - If lnError < 0 - MessageBox('Error opening ZIP file.', 16, 'Error!') - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Error opening ZIP file or path [' + tcSource + '] to copy from.') - Execscript (_Screen.cThorDispatcher, 'Result=', lnError) - Return lnError - Endif - - Local lcLibrary - lcLibrary = Set("Library") - Set Library to - - *-- Extract the files to the destination folder - Try - For Each oItem In loFiles - lnAnswerYesToAllOverwriteFilePrompts = 16 - lnCreateDestinationFolderIfNotPresent = 512 - lnShowErrorDialog = iif(tlShowCopyErrorDialog, 1024, 0) - lnOptions = lnAnswerYesToAllOverwriteFilePrompts + lnCreateDestinationFolderIfNotPresent + lnShowErrorDialog - loShellApp.NameSpace(tcDestinationPath).CopyHere(oItem, lnOptions) - Endfor - Catch - lnError = ERROR_EXTRACTING_FILES - Finally - EndTry - - Set Library to &lcLibrary - - If lnError < 0 - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Error extracting files from [' + tcSource + ']') - MessageBox('Error extracting files.', 16, 'Error!') - Execscript (_Screen.cThorDispatcher, 'Result=', lnError) - Return lnError - Endif - - lnReturn = 1 - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Copied files from [' + tcSource + '] to [' + tcDestinationPath + ']') - Execscript (_Screen.cThorDispatcher, 'Result=', lnReturn) - Return lnReturn diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_extractfilesfromzip.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_extractfilesfromzip.prg deleted file mode 100644 index aa04c1c9..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_extractfilesfromzip.prg +++ /dev/null @@ -1,39 +0,0 @@ -Lparameters tcSource, tcDestinationPath, tlExtractFromFirstFolder - -* Parameter tcSource is a fully qualifed path or path+filename+ext (i.e. "C:\TEMP\downloads" or "C:\TEMP\downloads\SomeFile.zip") - -Local llReturn, lnResult - -*** DH 2022-03-05: changed to preferentially use Shell.Application instead of VFPCompression.fll because the latter has a bug that prevents some newly downloaded ZIPs from being completely unzipped - -Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Extracting from [' + tcSource + '] to [' + tcDestinationPath + ']') - -try - loShell = createobject('Shell.Application') - loFiles = loShell.NameSpace(tcSource).Items - loShell.NameSpace(tcDestinationPath).CopyHere(loFiles) - lnResult = 1 -catch to loException - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Error extracting: ' + loException.Message) - lnResult = -1 -endtry - -if lnResult < 0 - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Attempting VFPCompression') - llReturn = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_SetLibrary', 'VFPCompression.fll') - If llReturn - If UnzipOpen (tcSource) - UnzipTo (tcDestinationPath) - UnzipClose() - lnResult = 1 - Else - lnResult = -1 - Endif - Else - lnReturn = -2 - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', 'Error loading VFP Compression library [VFPCompression.fll]') - EndIf -endif - -Execscript (_Screen.cThorDispatcher, 'Result=', lnResult) -Return lnResult diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_extracttopath.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_extracttopath.prg deleted file mode 100644 index 4d8ffa74..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_extracttopath.prg +++ /dev/null @@ -1,35 +0,0 @@ -#Define ERROR_DOWNLOADING_FILE -1 -#Define ERROR_EXTRACTING_FILE -2 -#Define ERROR_INSTALLING_FILES -3 - -Lparameters lcDownloadDestinationFile, lcTempName, tcAppName, tcInstallPath, tlShowCopyErrorDialog - -*-- Extract to temp folder ------------------------------------------------------------------- -Local loFSO As 'Scripting.FileSystemObject' -Local lcTempFolder, lnCopyFilesToInstallFolder, lnExtractFilesToTempFolder, lnReturn - -lcTempFolder = Addbs (Sys(2023)) + lcTempName -loFSO = Createobject ('Scripting.FileSystemObject') -loFSO.CreateFolder (lcTempFolder) && Create the temp folder - -ExecScript(_Screen.cThorDispatcher, "Thor_Proc_UpdateWaitWindow", 'Extracting.... Please wait.') -lnExtractFilesToTempFolder = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_ExtractFilesFromZip', lcDownloadDestinationFile, lcTempFolder) - -*--- Copy files from temp folder to target install folder ---------- -If lnExtractFilesToTempFolder > 0 - ExecScript(_Screen.cThorDispatcher, "Thor_Proc_UpdateWaitWindow", 'Installing.... Please wait.') - lnCopyFilesToInstallFolder = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_ExtractFiles', lcTempFolder, tcInstallPath, .F., tlShowCopyErrorDialog) -Else - Execscript (_Screen.cThorDispatcher, 'Result=', ERROR_EXTRACTING_FILE) -Endif - -If lnExtractFilesToTempFolder > 0 And lnCopyFilesToInstallFolder > 0 - lnReturn = 1 - ExecScript(_Screen.cThorDispatcher, "Thor_Proc_UpdateWaitWindow", 'Update complete!') -Else - Messagebox ('Error updating ' + Evl (tcAppName, '') + '.', 0, 'Failure!') - lnReturn = ERROR_INSTALLING_FILES -Endif - -Execscript (_Screen.cThorDispatcher, 'Result=', lnReturn) -Return lnReturn diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_getavailableversioninfo.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_getavailableversioninfo.prg deleted file mode 100644 index 896fdd17..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_getavailableversioninfo.prg +++ /dev/null @@ -1,80 +0,0 @@ -#Define CR Chr[13] -#Define STARS Replicate('=', 40) -#Define MaxTries 4 - -Lparameters toUpdateInfo - -*-- 2011-07 M. Slay - Revised to set properties on passed toUpdateInfo -Local lcLocalVersionFile, lcVersionFileCode, lcVersionFileUrl, llReturn, lnAttempt, laLines[1] - -lcLocalVersionFile = Addbs (Sys(2023)) + Justfname (toUpdateInfo.VersionLocalFilename) && Temp folder -lcVersionFileUrl = toUpdateInfo.VersionFileUrl - -If Not Empty (lcVersionFileUrl) - - For lnAttempt = 1 To MaxTries - toUpdateInfo.ErrorCode = 0 - llReturn = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_DownloadFileFromURL', lcVersionFileUrl, lcLocalVersionFile) - - If llReturn = .T. - lcVersionFileCode = Filetostr (lcLocalVersionFile) - - *-- The downloaded file above contains VFP code which will set properties on the passed object: - Try - WritetoCFULog('Executing code from downloaded version file...') - toUpdateInfo = Execscript (lcVersionFileCode, toUpdateInfo) - Catch - WritetoCFULog('ERROR while executing code from downloaded version file!') - toUpdateInfo.ErrorCode = -1 - Endtry - - Do Case - Case toUpdateInfo.ErrorCode = 0 - Exit - Case lnAttempt = MaxTries - If Alines (laLines, lcVersionFileCode) > 4 && ignore messages about earlier versions which did not pass objects - ErrorMessage ('Invalid format in version file for ' + toUpdateInfo.AppName + CR + ; - STARS + CR + 'URL: ' + lcVersionFileUrl + CR + ; - STARS + CR + lcVersionFileCode + CR + ; - STARS, toUpdateInfo.AppName) - Endif - Otherwise - Endcase - - Else - toUpdateInfo.ErrorCode = -5 - WritetoCFULog('Error getting available version information from server.') - If lnAttempt = MaxTries - ErrorMessage ('Error getting available version information from server.' + toUpdateInfo.AppName + CR + ; - STARS + CR + 'URL: ' + lcVersionFileUrl + CR + ; - STARS, toUpdateInfo.AppName) - Endif - EndIf - - Endfor - -Endif - -If Empty(toUpdateInfo.AvailableVersion) - toUpdateInfo.AvailableVersion = toUpdateInfo.ApplicationName + ' - ' + ; - Transform(toUpdateInfo.VersionNumber) + ' - ' + ; - Transform(toUpdateInfo.VersionNumber) + ' - ' + ; - Dtoc(Evl(toUpdateInfo.VersionDate, Date(2001,1,1)), 1) -Endif - -Return Execscript (_Screen.cThorDispatcher, 'Result=', toUpdateInfo) - - -Procedure ErrorMessage (tcMessage, tcAppName) - #Define CR Chr[13] - Local lcMessage - WritetoCFULog('MessageBox: ' + tcMessage) - lcMessage = tcMessage + CR + CR + 'Cancelling ... ' + CR + CR + 'This error may self-correct if "Check For Updates" is run again.' - Messagebox (lcMessage, 0, 'Error: ' + tcAppName) - -Endproc - - -Procedure WritetoCFULog (tcText, tlDivider) - Execscript (_Screen.cThorDispatcher, 'Thor_Proc_WriteToCFULog', tcText, tlDivider) -EndProc diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_getupdatelist.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_getupdatelist.prg deleted file mode 100644 index 07a9c356..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_getupdatelist.prg +++ /dev/null @@ -1,124 +0,0 @@ -*-- 2011-11-07 M. Slay - Added new properties to UpdateInfo object so it can be passed to all -*-- the various calls to have the properties set. - -Lparameters tlIsThor - -Local loUpdateList As 'Collection' -Local laFiles[1], lcCode, lcFile, lcFolder, lcLocalVersion, lcLocalVersionFile, lcNeverUpdateFolder -Local lcRemovedFolder, lcToolFolder, lcUpdateFolder, llSuccess, lnFileCount, lnI, loResult, loTool - -lcToolFolder = Execscript (_Screen.cThorDispatcher, 'Tool Folder=') -lcUpdateFolder = Addbs (lcToolFolder) + 'Updates\' -lcNeverUpdateFolder = lcUpdateFolder + 'Never Update\' -lcRemovedFolder = lcUpdateFolder + 'Removed\' - -loUpdateList = Createobject ('Collection') - -AddUpdateFolder (loUpdateList, tlIsThor, lcUpdateFolder, lcNeverUpdateFolder, lcRemovedFolder, lcToolFolder, 'No') - -AddUpdateFolder (loUpdateList, tlIsThor, lcUpdateFolder + 'My Updates\', lcNeverUpdateFolder, lcRemovedFolder, lcToolFolder, 'Yes') - -Execscript (_Screen.cThorDispatcher, 'Result=', loUpdateList) -Return loUpdateList - - -Procedure AddUpdateFolder (loUpdateList, tlIsThor, lcUpdateFolder, lcNeverUpdateFolder, lcRemovedFolder, lcToolFolder, tcFromMyUpdates) - Local laFiles[1], laLocalVersionInfo[1], lcCode, lcFile, lcFolder, lcLocalVersion - Local lcLocalVersionFile, lcVersionFileUrl, llSuccess, lnFileCount, lnI, loResult, loTool - lnFileCount = Adir (laFiles, lcUpdateFolder + 'Thor_Update_*.PRG') - - For lnI = 1 To lnFileCount - lcFile = lcUpdateFolder + laFiles[lnI, 1] - - If File (lcRemovedFolder + laFiles[lnI, 1]) - Loop - Endif - - loResult = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_GetUpdaterObject2') - loResult.File = lcFile - loResult.FromMyUpdates = tcFromMyUpdates - - lcCode = Filetostr (lcFile) - Try - loResult = Execscript (lcCode, loResult) - llSuccess = .T. - Catch - llSuccess = .F. - Endtry - - If llSuccess - If 'L' # Vartype(tlIsThor) Or tlIsThor = (Upper (loResult.ApplicationName) == 'THOR') - loTool = Execscript (_Screen.cThorDispatcher, 'ToolInfo=', loResult.ToolName) - - If Isnull (loTool) - If loResult.Component = 'Yes' - lcFolder = Addbs(Addbs (lcToolFolder) + 'Components') + loResult.ApplicationName - Else - lcFolder = Addbs(Addbs (lcToolFolder) + 'Apps') + loResult.ApplicationName - Endif - lcLocalVersionFile = Addbs (lcFolder) + loResult.VersionLocalFilename - If File (lcLocalVersionFile) - lcLocalVersion = Filetostr (lcLocalVersionFile) - loResult.AlreadyInstalled = 'Yes' - Else - lcLocalVersion = '' - loResult.AlreadyInstalled = 'No' - Endif - Else - lcFolder = loTool.FolderName - lcLocalVersionFile = Addbs (lcFolder) + loResult.VersionLocalFilename - If File (lcLocalVersionFile) - lcLocalVersion = Filetostr (lcLocalVersionFile) - loResult.AlreadyInstalled = 'Yes' - Else - loResult.AlreadyInstalled = 'No' - Endif - Endif - - loResult.InstallationFolder = lcFolder - loResult.LocalVersionFile = lcLocalVersionFile - loResult.NeverUpdateFile = lcNeverUpdateFolder + laFiles[lnI, 1] - - lcVersionFileUrl = loResult.VersionFileURL - - If Not Empty (loResult.InstallationFolder) - - If Empty(loResult.AvailableVersion); - and Not Empty(loResult.ApplicationName); - and Not Empty(loResult.VersionNumber); - and Not Empty(loResult.VersionDate) - loResult.AvailableVersion = loResult.ApplicationName + ' - ' + ; - Transform(loResult.VersionNumber) + ' - ' + ; - Transform(loResult.VersionNumber) + ' - ' + ; - Dtoc(Evl(loResult.VersionDate, Date(2001,1,1)), 1) - Endif - - - If (Empty (lcVersionFileUrl) And Empty(loResult.AvailableVersion)) Or Empty (lcLocalVersionFile) - loResult.ErrorMessage = 'One of the required version files properties is empty.' - loResult.ErrorCode = -1 - Endif - - *-- Read the local version string - If File (lcLocalVersionFile) - Alines (laLocalVersionInfo, Filetostr (lcLocalVersionFile)) - If Alen (laLocalVersionInfo) >= 2 - loResult.CurrentVersion = laLocalVersionInfo[2] - Else - loResult.CurrentVersion = laLocalVersionInfo[1] - Endif - Endif - Endif - - If File (loResult.NeverUpdateFile) - loResult.NeverUpdate = 'Yes' - Endif - - If loResult.ErrorCode >= 0 - loUpdateList.Add (loResult) - Endif - Endif - Endif - Endfor - -Endproc diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_getupdaterobject.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_getupdaterobject.prg deleted file mode 100644 index a22592e0..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_getupdaterobject.prg +++ /dev/null @@ -1,49 +0,0 @@ -Local loUpdaterObject As 'clsUpdaterObject' -loUpdaterObject = Createobject ('clsUpdaterObject') -Execscript (_Screen.cThorDispatcher, 'Result=', loUpdaterObject) -Return - -Define Class clsUpdaterObject As Custom - - * Properties to be defined in Updater PRGs - APPName = '' && Name of the APP file - ApplicationName = '' && Name of the application - ToolName = '' && Name of the tool used to determine where the APP is stored - Component = 'No' - FindInstalledVersion = 'No' - VersionFileURL = '' && URL of the version file in the cloud - VersionLocalFilename = '' && Name of the local version file - RegisterWithThor = '' && To be executed to register this APP with Thor - ShowErrorMessage = 'Yes' - UnzipAfterDownload = 'Yes' - SourceZipURL = '' && URL for the zip of source files - LocalSourceZip = '' - NeverUpdateFile = '' - UpdateNowIfNotInstalled = 'No' - ProjectCreationDate = Date(2001,1,1) - - * Properties used along the way by the updater process - File = '' - InstallationFolder = '' - LocalVersionFile = '' - - CurrentVersion = '' - ErrorMessage = '' - ErrorCode = 0 - NeverUpdate = 'No' - AlreadyInstalled = 'No' - FromMyUpdates = 'Yes' - - * Properties set by the cloud version file - AvailableVersion = '' - VersionNumber = '' - VersionDate = {//} - AvailableVersionDate = '' - AvailableVersionNumber = '' - SourceFileURL = '' - Notes = '' - Link = '' - LinkPrompt = '' - -Enddefine - diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_getupdaterobject2.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_getupdaterobject2.prg deleted file mode 100644 index 4c2fc60c..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_getupdaterobject2.prg +++ /dev/null @@ -1,50 +0,0 @@ -Local loUpdaterObject As 'clsUpdaterObject' -loUpdaterObject = Createobject ('clsUpdaterObject') -Execscript (_Screen.cThorDispatcher, 'Result=', loUpdaterObject) -Return - -Define Class clsUpdaterObject As Custom - - * Properties to be defined in Updater PRGs - APPName = '' && Name of the APP file - ApplicationName = '' && Name of the application - ToolName = '' && Name of the tool used to determine where the APP is stored - Component = 'No' - FindInstalledVersion = 'No' - VersionFileURL = '' && URL of the version file in the cloud - VersionLocalFilename = '' && Name of the local version file - RegisterWithThor = '' && To be executed to register this APP with Thor - ShowErrorMessage = 'Yes' - UnzipAfterDownload = 'Yes' - SourceZipURL = '' && URL for the zip of source files - LocalSourceZip = '' - NeverUpdateFile = '' - UpdateNowIfNotInstalled = 'No' - ProjectCreationDate = Date(2001,1,1) - Dependencies = '' - - * Properties used along the way by the updater process - File = '' - InstallationFolder = '' - LocalVersionFile = '' - - CurrentVersion = '' - ErrorMessage = '' - ErrorCode = 0 - NeverUpdate = 'No' - AlreadyInstalled = 'No' - FromMyUpdates = 'Yes' - - * Properties set by the cloud version file - AvailableVersion = '' - VersionNumber = '' - VersionDate = {//} - AvailableVersionDate = '' - AvailableVersionNumber = '' - SourceFileURL = '' - Notes = '' - Link = '' - LinkPrompt = '' - -Enddefine - diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_messagebox.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_messagebox.prg deleted file mode 100644 index 06a18ff7..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_messagebox.prg +++ /dev/null @@ -1,15 +0,0 @@ -#Define cnMessageBoxTimeout 3000 - -Lparameters tcMessageBoxText, tnDialogBoxType, tcTitleBarText -Local lnMessageBoxTimeout, lnResult - -If Pemstatus(_Screen, 'nThorCFUMessageBoxTimeout', 5) - lnMessageBoxTimeout = _Screen.nThorCFUMessageBoxTimeout -Else - lnMessageBoxTimeout = cnMessageBoxTimeout -Endif - -lnResult = Messagebox (tcMessageBoxText, tnDialogBoxType, tcTitleBarText, lnMessageBoxTimeout) - -Execscript (_Screen.cThorDispatcher, 'Result=', lnResult) -Return lnResult diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.prg deleted file mode 100644 index 7194e8aa..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.prg +++ /dev/null @@ -1,126 +0,0 @@ -Lparameters toProcessorObject, lcScope, llRestrictions - -Local loScopeProcessor As 'ScopeProcessor' -Local llProjectHomeDirectory, llSubDirectories, loForm - -Do Case - Case Pcount() > 1 And Not Empty(m.lcScope ) And Directory(m.lcScope) - llSubDirectories = m.llRestrictions - Case Pcount() > 1 And Not Empty(m.lcScope ) And File(m.lcScope) - llProjectHomeDirectory = m.llRestrictions - Otherwise - loForm = Execscript(_Screen.cThorDispatcher, 'Class= FrmScopeFinder from Thor_Proc_ScopeProcessor.vcx') - m.loForm.Show(1) - If Vartype(m.loForm) # 'O' - Return Execscript(_Screen.cThorDispatcher, 'Result=', .F.) - Endif - - lcScope = m.loForm.cScope - llSubDirectories = m.loForm.lSubDirectories - llProjectHomeDirectory = m.loForm.lProjectHomeDirectory - m.loForm.Release() -Endcase - -* Create object that processes a folder / project -loScopeProcessor = Newobject('ScopeProcessor') -loScopeProcessor.oCustomProcessor = m.toProcessorObject - -Do Case - Case Directory(m.lcScope) - m.loScopeProcessor.ProcessPath(m.lcScope, m.llSubDirectories) - Return Execscript(_Screen.cThorDispatcher, 'Result=', .T.) - Case File(m.lcScope) - m.loScopeProcessor.ProcessProject(m.lcScope, m.llProjectHomeDirectory) - Return Execscript(_Screen.cThorDispatcher, 'Result=', .T.) - Otherwise - Return Execscript(_Screen.cThorDispatcher, 'Result=', .F.) -Endcase - - -*======================================================================================= -* Scope Processor -* Thiis class will loop through all files in the Current Project or a Path and will -* call a custom oProcessor.Process() method for each row in the file (scx, vcx, frx) -* and for each recognized text file (prg, txt, ini, .h, etc) -* Ver 1.00 2014-01-21 -*======================================================================================= -Define Class ScopeProcessor As Custom - - oCustomProcessor = .Null. - oSearchEngine = .Null. - - *--------------------------------------------------------------------------------------- - Procedure Init - - Local loFormProgressBar - This.oSearchEngine = Execscript(_Screen.cThorDispatcher, 'Class= GoFishSearchEngine_Thor from Thor_Proc_GoFishSearchEngine.VCX') - - loFormProgressBar = Execscript(_Screen.cThorDispatcher, 'Class= ProgressForm from Thor_Proc_ProgressBar.VCX') - m.loFormProgressBar.Show() - This.oSearchEngine.oProgressBar = m.loFormProgressBar.cntProgressBar - - This.oSearchEngine.oSearchOptions.lShowNoMatchesMessage = .F. - This.oSearchEngine.oSearchOptions.lIncludeSubdirectories = .T. - - Endproc - - *--------------------------------------------------------------------------------------- - Procedure Destroy - - This.oSearchEngine.oProgressBar = .Null. - This.oSearchEngine.oCustomProcessor = .Null. - - This.oCustomProcessor = .Null. - This.oSearchEngine = .Null. - - Endproc - - - *--------------------------------------------------------------------------------------- - Procedure oCustomProcessor_Assign(toObject) - - This.oCustomProcessor = m.toObject - This.oSearchEngine.oCustomProcessor = m.toObject - If Vartype(m.toObject) = 'O' and Pemstatus(m.toObject, 'lSearchOncePerVCX', 5) - This.oSearchEngine.lSearchOncePerVCX = m.toObject.lSearchOncePerVCX - Endif - - Endproc - - - *--------------------------------------------------------------------------------------- - Procedure ProcessProject(tcProject, tlProjectHomeDirectory) - - Local lnReturn - - If Pcount() = 2 - This.oSearchEngine.oSearchOptions.lLimitToProjectFolder = m.tlProjectHomeDirectory - Else - This.oSearchEngine.oSearchOptions.lLimitToProjectFolder = .T. - Endif - - lnReturn = This.oSearchEngine.SearchInProject(m.tcProject) - - Return m.lnReturn - - Endproc - - *--------------------------------------------------------------------------------------- - Procedure ProcessPath(tcPath, tlIncludeSubdirectories) - - Local lnReturn - - If Pcount() = 2 - This.oSearchEngine.oSearchOptions.lIncludeSubdirectories = m.tlIncludeSubdirectories - Else - This.oSearchEngine.oSearchOptions.lIncludeSubdirectories = .T. - Endif - - lnReturn = This.oSearchEngine.SearchInPath(m.tcPath) - - Return m.lnReturn - - Endproc - - -Enddefine diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.vc2 b/Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.vc2 deleted file mode 100644 index fcb33820..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.vc2 +++ /dev/null @@ -1,2300 +0,0 @@ -*-------------------------------------------------------------------------------------------------------------------------------------------------------- -* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! -* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! -*-------------------------------------------------------------------------------------------------------------------------------------------------------- -*< FOXBIN2PRG: Version="1.19" SourceFile="thor_proc_scopeprocessor.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) -* -* -DEFINE CLASS baseform AS form - *< CLASSDATA: Baseclass="form" Timestamp="" Scale="Pixels" Uniqueid="" /> - - * - *m: editsourcefile - *m: getallsettings - *m: getcolumnfilters - *m: getrelativepath - *m: lockwindow - *m: refreshresults - *m: savedraginfo - *m: selectresults - *m: setcolumnfilter - *m: setcolumnfilters - *m: setsortorder - *p: ccolumnfilter - *p: ccolumnfilters - *p: ccolumninfo - *p: chomedir - *p: cpanelfilter - *p: csortorder - *p: ladddescendants - *p: lformaddobject - *p: lsearchclass - *p: ncolumnfiltercount - *p: ndockable - *p: osettings - *p: otools - *a: acolumnfilters[1,0] - *p: _memberdata && XML Metadata for customizable properties - * - - * - Caption = "Form" - ccolumnfilter = - ccolumnfilters = - ccolumninfo = - chomedir = - cpanelfilter = - csortorder = |COLFILENAME| - DoCreate = .T. - ladddescendants = .F. - Left = 0 - lformaddobject = .F. - lsearchclass = .F. - Name = "baseform" - ncolumnfiltercount = 0 - ndockable = 1 - osettings = .NULL. - otools = .NULL. - Top = 0 - _memberdata = - - - - - - - - - - - - - - - - - - - - - - - - - - - * - - PROCEDURE editsourcefile - Lparameters lcFileName, lcClass, lcMethod, lnStartRange, lnEndRange - - Local lcVCXName, loFileContextMenu - lcVCXName = This.ClassLibrary - - loFileContextMenu = Execscript(_Screen.cThorDispatcher, 'Thor_Proc_NewSessionObject', 'basecontextmenu', lcVCXName) - loFileContextMenu.EditSourceX(lcFileName, lcClass, lcMethod, lnStartRange, lnEndRange) - - ENDPROC - - PROCEDURE getallsettings - ENDPROC - - PROCEDURE getcolumnfilters - #Define CRLF Chr[13]+ Chr[10] - - Local lcColumnFilters, lnI - lcColumnFilters = '' - For lnI = 1 To This.nColumnFilterCount - lcColumnFilters = lcColumnFilters + ; - This.Acolumnfilters[lnI, 1] + CRLF + ; - This.Acolumnfilters[lnI, 2] + CRLF + ; - This.Acolumnfilters[lnI, 3] + CRLF - Endfor - - Return lcColumnFilters - - ENDPROC - - PROCEDURE getrelativepath - Lparameters tcFileName, lcFolder - - Local lcFileName, lcRelative, lcRelativeName - lcFileName = Trim(tcFileName) - lcRelative = Sys(2014, lcFileName, lcFolder) - - Do Case - Case lcRelative = '..\..\..\' - Return lcFileName - - Case Occurs('\', lcRelative) >= Occurs('\', lcFileName) - Return lcFileName - - Case lcRelative = '..\..\' - Return '..\..\' + Substr(lcFileName, Len(lcFileName) - Len(lcRelative) + 7) - - Case lcRelative = '..\' - Return '..\' + Substr(lcFileName, Len(lcFileName) - Len(lcRelative) + 4) - - Otherwise - Return Substr(lcFileName, Len(lcFileName) - Len(lcRelative) + 1) - - Endcase - - - ENDPROC - - PROCEDURE lockwindow - * From Doug Hennig's Win32API session at SW Fox 2012 - - Lparameters tlLock, ; - tnHWnd - Local lnHWnd - Declare Integer LockWindowUpdate In Win32API ; - Integer nHandle - Do Case - Case Not tlLock - lnHWnd = 0 - Case Pcount() = 1 - Declare Integer GetDesktopWindow In Win32API - lnHWnd = GetDesktopWindow() - Otherwise - lnHWnd = tnHWnd - Endcase - LockWindowUpdate(lnHWnd) - Return - ENDPROC - - PROCEDURE refreshresults - *** JRN 2010-03-26 : get our results - Local lcSafety - - If Used('crsr_Results') - - This.SelectResults('crsr_Temp') - - lcSafety = Set('Safety') - Set Safety Off - - Select crsr_Results - Delete Tag All - Set Filter To - Zap - Append From(Dbf('crsr_Temp')) - Set Safety &lcSafety - - Else - - This.SelectResults('crsr_Results') - - Endif - - Goto top - This.Refresh() - - - ENDPROC - - PROCEDURE savedraginfo - Local lcBaseClass, lcClass, lcFile, lcPath - - With This - If .lSearchClass ; - And Used ('crsr_Results') ; - And Between (Recno ('crsr_Results'), 1, Reccount ('crsr_Results')) ; - And Not Empty(crsr_Results.BaseClass) - - lcClass = Alltrim (crsr_Results.Class) - lcBaseClass = Alltrim (crsr_Results.BaseClass) - .oDragDrop.cClass = lcClass - .oDragDrop.cBaseClass = lcBaseClass - .oDragDrop.cFileName = Alltrim (crsr_Results.FullName) - - Text to .cmdClassIcon.ToolTipText Noshow TextMerge - Drag class '<>' to drop onto your form or class. - - You can also press the Shift or Ctrl key and drag a row directly from the grid. - - If PEM.Editor is open, you can drop this class onto the PEM Editor form and the class will be added as a child of the current object if possible, else as a sibling. - EndText - lcPath = Justpath(Justpath(.ClassLibrary)) + '\images\' - lcFile = lcPath + Evl (lcBaseClass, '') + '.bmp' - If File (lcFile) - .imgClassIcon.Picture = lcFile - Else - * ?lcFile - Endif - Else - .oDragDrop.cClass = '' - .oDragDrop.cBaseClass = '' - .oDragDrop.cFileName = '' - .cmdClassIcon.ToolTipText = '' - Endif - - .cmdClassIcon.Refresh() - - Endwith - - - - ENDPROC - - PROCEDURE selectresults - Lparameters lcCursorName - - Local laSortFields[1], lcExtraFields, lcPanelFilter, lcSelection, lcSortField, lcSortFields - Local nLines - - *** JRN 2010-03-26 : determine the fields to sort on - lcSortFields = '' - lcExtraFields = '' - nLines = Alines(laSortFields, Upper(This.cSortOrder), .T., '|') - - For Each lcSortField In laSortFields - Do Case - Case lcSortField == 'COLCLASS' - lcSortFields = lcSortFields + ', sortclass' - lcExtraFields = lcExtraFields + ', Upper (class) as sortclass' - Case lcSortField == 'COLFILENAME' - lcSortFields = lcSortFields + ', sortfname' - lcExtraFields = lcExtraFields + ', Upper (FileName) as sortfname' - Case lcSortField == 'COLFOLDER' - lcSortFields = lcSortFields + ', sortfolder' - lcExtraFields = lcExtraFields + ', Upper (Folder) as sortfolder' - Case lcSortField == 'COLPARENTCLASS' - lcSortFields = lcSortFields + ', sortparent' - lcExtraFields = lcExtraFields + ', Upper (Parent) as sortparent' - Case lcSortField == 'COLCLASSLOC' - lcSortFields = lcSortFields + ', sortparloc' - lcExtraFields = lcExtraFields + ', Upper (ClassLoc) as sortparloc' - Case lcSortField == 'COLBASECLASS' - lcSortFields = lcSortFields + ', sortbase' - lcExtraFields = lcExtraFields + ', Upper (BaseClass) as sortbase' - Case lcSortField == 'COLTIMESTAMP' - lcSortFields = lcSortFields + ', timestamp desc' - Case lcSortField == 'COLSIZE' - lcSortFields = lcSortFields + ', size desc' - Case lcSortField == 'COLEXT' - lcSortFields = lcSortFields + ', sortext' - lcExtraFields = lcExtraFields + ', Upper (JustExt(FileName)) as sortext' - Endcase - Endfor - - lcSortFields = Substr(lcSortFields, 2) - Do Case - Case Vartype(Thisform.oPanelProperties) # 'O' - lcPanelFilter = This.cPanelFilter - Case Thisform.oPanelProperties.lUsePanel - lcPanelFilter = Thisform.oPanelProperties.cPanelFilter - Otherwise - lcPanelFilter = '' - Endcase - - Do Case - Case Empty(Thisform.cColumnFilter) And Empty(lcPanelFilter) - lcSelection = '' - Case Empty(Thisform.cColumnFilter) - lcSelection = 'Where ' + lcPanelFilter - Case Empty(lcPanelFilter) - lcSelection = 'Where ' + Thisform.cColumnFilter - Otherwise - lcSelection = 'Where ' + lcPanelFilter + ' and ' + Thisform.cColumnFilter - Endcase - - Select * ; - &lcExtraFields ; - From crsr_SearchResults ; - &lcSelection ; - Order By &lcSortFields ; - Into Cursor(lcCursorName) Readwrite - - ENDPROC - - PROCEDURE setcolumnfilter - Lparameters lcPrompt, lcField - - Private paSelectFilter, pcFilter, pnOption - Local lcBodyMarkup, lcColumnFilter, lcFilter, lcMoreMarkup, lnColumnFilterCount, lnI, loForm - - loForm = Execscript(_Screen.cThorDispatcher, 'Class= DynamicFormDeskTop') - - With loForm - .Caption = 'Set Filter' - .MinButton = .F. - .MaxButton = .F. - .MinHeight = 100 - .BorderStyle = 2 - - .cHeading = 'Filter on ' + lcPrompt - .cSaveButtonCaption = 'Apply' - Endwith - - pcFilter = '' - - Text To lcBodyMarkup Noshow Textmerge - pcFilter .class = 'TextBox' - .caption = 'Filter:' - .Width = 200 - Endtext - - lnColumnFilterCount = Thisform.nColumnFilterCount - - If lnColumnFilterCount # 0 - Dimension paSelectFilter[lnColumnFilterCount] - paSelectFilter = .T. - For lnI = 1 To lnColumnFilterCount - Text To lcMoreMarkup Noshow Textmerge - | paSelectFilter[<>] - .caption = '"<>" $ <> ' - .width = 200 - Endtext - lcBodyMarkup = lcBodyMarkup + lcMoreMarkup - Endfor - Text To lcMoreMarkup Noshow Textmerge - | - .class = 'DF_ResultButton' - .caption = 'Remove filter' - Endtext - lcBodyMarkup = lcBodyMarkup + lcMoreMarkup - Endif - - loForm.cBodyMarkup = lcBodyMarkup - loForm.Show(1, Thisform) - - ****************************************************** - - lcFilter = '*' + Lower(Trim(pcFilter)) + '*' - lcFilter = 'Like("' + lcFilter + '", Lower(' + lcField + '))' - - Do Case - Case Vartype(loForm) # 'O' - Return && Cancel - Case Lower(loForm.cReturn) = 'cancel' - Return && Cancel - Case Lower(loForm.cReturn) = 'remove filter' - lnColumnFilterCount = 0 - Otherwise - For lnI = lnColumnFilterCount To 1 Step - 1 - If Not paSelectFilter[lnI] - Adel(Thisform.aColumnFilters, lnI) - lnColumnFilterCount = lnColumnFilterCount - 1 - Endif - Endfor - If Not Empty(pcFilter) - lnColumnFilterCount = lnColumnFilterCount + 1 - Dimension Thisform.aColumnFilters[lnColumnFilterCount, 3] - Thisform.aColumnFilters[lnColumnFilterCount, 1] = lcFilter - Thisform.aColumnFilters[lnColumnFilterCount, 2] = lcPrompt - Thisform.aColumnFilters[lnColumnFilterCount, 3] = pcFilter - Endif - Endcase - - lcColumnFilter = Iif(lnColumnFilterCount = 0, '', Thisform.aColumnFilters[1, 1]) - For lnI = 2 To lnColumnFilterCount - lcColumnFilter = lcColumnFilter + ' and ' + Thisform.aColumnFilters[lnI, 1] - Endfor - - Thisform.nColumnFilterCount = lnColumnFilterCount - Thisform.cColumnFilter = lcColumnFilter - Thisform.RefreshResults() - - ENDPROC - - PROCEDURE setcolumnfilters - Lparameters lcColumnFilters - - Local lcColumnFilters, lnCount, lnI - If Empty(lcColumnFilters) - Return - Endif - - lnCount = Alines(Thisform.aColumnFilters, lcColumnFilters, 5) - Dimension This.aColumnFilters[lnCount / 3, 3] - - ENDPROC - - PROCEDURE setsortorder - Lparameters lcColumnName - - Local lnPos - lcColumnName = Upper(lcColumnName) - With This - .cSortOrder = Strtran(.cSortOrder, '|' + lcColumnName + '|', '|') - .cSortOrder = '|' + lcColumnName + .cSortOrder - lnPos = At('|', .cSortOrder, 4) - If lnPos > 0 - .cSortOrder = Left(.cSortOrder, lnPos) - Endif - - .cmdClassSearch.SetFocus() - Doevents - - .RefreshResults() - .grdResults.SetFocus() - - Endwith - - ENDPROC - -ENDDEFINE - -DEFINE CLASS cbofinder AS combobox - *< CLASSDATA: Baseclass="combobox" Timestamp="" Scale="Pixels" Uniqueid="" /> - - * - *m: refreshitems - *p: _memberdata - * - - * - Height = 24 - Name = "cbofinder" - Width = 100 - _memberdata = - - - * - -ENDDEFINE - -DEFINE CLASS chkfinder AS checkbox - *< CLASSDATA: Baseclass="checkbox" Timestamp="" Scale="Pixels" Uniqueid="" /> - - * - *p: ccontrolsource - *p: _memberdata && XML Metadata for customizable properties - * - - * - Alignment = 0 - Caption = "Check1" - ccontrolsource = - Height = 17 - Name = "chkfinder" - Value = .F. - Width = 60 - _memberdata = - - - * - - PROCEDURE InteractiveChange - Local lcControlSource - - lcControlSource = This.cControlSource - If Not Empty(lcControlSource) - &lcControlSource = This.Value - Endif - - ENDPROC - - PROCEDURE Refresh - Local lcControlSource - - lcControlSource = This.cControlSource - If Not Empty(lcControlSource) - This.Value = &lcControlSource - Endif - - ENDPROC - -ENDDEFINE - -DEFINE CLASS cmdfinder AS commandbutton - *< CLASSDATA: Baseclass="commandbutton" Timestamp="" Scale="Pixels" Uniqueid="" /> - - * - Caption = "Command1" - Height = 27 - Name = "cmdfinder" - Width = 84 - * - -ENDDEFINE - -DEFINE CLASS custdragdrop AS custom - *< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" /> - - * - *m: addinmethod - *m: dragdrop && Occurs when a drag-and-drop operation is completed. - *m: dragover && Occurs when a control is being dragged over a target object. - *m: formaddobject - *m: mousedown && Occurs when the user presses the mouse button. - *m: removetext1fromcolumn - *p: cbaseclass - *p: cclass - *p: cfilename - *p: lbrowser - *p: ldragdrop - *p: lerror - *p: lformaddobject - *p: lignoreerrors - *p: natpos - *p: nmousebutton - *p: nshift - *p: osource - *p: _memberdata && XML Metadata for customizable properties - * - - * - cbaseclass = - cclass = - cfilename = - lbrowser = .T. - ldragdrop = .F. - lerror = .F. - lformaddobject = .F. - lignoreerrors = .F. - Name = "custdragdrop" - natpos = 0 - nmousebutton = 0 - nshift = 0 - osource = .NULL. - _memberdata = - - - - - - - - - - - - - - - - - - - - - * - - PROCEDURE addinmethod - Lparameters tcMethodName - - Return .f. - - ENDPROC - - PROCEDURE dragdrop && Occurs when a drag-and-drop operation is completed. - LPARAMETERS oSource, nXCoord, nYCoord, loThis - LOCAL lnResult,lnLastShift - - IF NOT this.lBrowser - IF ISNULL(this.oItem.oAction) - RETURN - ENDIF - this.oItem.oAction.DragDrop(oSource,nXCoord,nYCoord) - RETURN - ENDIF - *** JRN 2010-04-18 : do nothing! - IF .T. && TYPE("oSource")#"O" OR this.lReadOnly OR oSource.parent.Name==this.Name OR ; - NOT LEFT(oSource.parent.Name,12)=="classbrowser" OR ; - oSource.parent.cFileName==this.cFileName OR ; - NOT RIGHT(oSource.parent.cFileName,4)==".vcx" - this.oSource=.NULL. - RETURN .F. - ENDIF - oSource.DragIcon="" - this.oSource=oSource - IF this.AddInMethod(PROGRAM()) - this.oSource=.NULL. - RETURN - ENDIF - this.AddClass - this.oSource=.NULL. - SET MESSAGE TO - - - ENDPROC - - PROCEDURE dragover && Occurs when a control is being dragged over a target object. - LPARAMETERS oSource, nXCoord, nYCoord, nState, loThis - LOCAL lcDragIcon - - IF TYPE("nState")#"N" OR nState=2 OR TYPE("oSource.parent")#"O" OR ; - NOT LEFT(oSource.parent.Name,12)=="classbrowser" - RETURN .F. - ENDIF - DO CASE - CASE nState=1 - oSource.DragIcon=oSource.parent.cDragIcon - SET MESSAGE TO - CASE this.lBrowser AND (this.lReadOnly OR oSource.parent.Name==this.Name OR ; - oSource.parent.cFileName==this.cFileName OR ; - NOT RIGHT(oSource.parent.cFileName,4)==".vcx") - oSource.DragIcon="c:\dev\browser\nodrop.cur" - CASE NOT oSource.parent.lBrowser - lcDragIcon="c:\dev\browser\dragmove.cur" - OTHERWISE - lcDragIcon=IIF(oSource.parent.nShift=2,"dragcopy.cur","dragmove.cur") - oSource.DragIcon="c:\dev\browser\"+lcDragIcon - SET MESSAGE TO IIF(oSource.parent.nShift=2,M_DROP_TO_COPY_LOC,M_DROP_TO_MOVE_LOC)+ ; - [ (]+oSource.parent.cClass+[) ]+M_FROM_LOC+[ "]+oSource.parent.cFileName+ ; - [" ]+M_TO_LOC+[ "]+this.cFileName+["] - ENDCASE - oSource.Refresh - - - ENDPROC - - PROCEDURE formaddobject - *** JRN 2010-04-19 : from Class Browser, with only minor modifications, as noted - * all comments are mine, including code that has been commented out - Lparameters toObject, tnXCoord, tnYCoord, tlActivateForm, tlDesignMode, tlNoShow, tlNoErrors, tlBuilder, toForm - Local laMembers, laMembersObj, laMouseObj[1], lcBaseClass, lcBaseClass2, lcClass, lcCode, lcFileName - Local lcFontName, lcKeyBoard, lcMWindow, lcObjName, lcParentObjName, lcParentObjProperty - Local lcTargetBaseClass, llAddToCommand, llAddToNew, llAddToScreen, llAutoAddForm, llBuilder - Local llIgnoreErrors, llPixelMode, lnCol, lnColOffset, lnCount, lnCount2, lnFontSize, lnFormCount - Local lnLastSelect, lnMCol, lnMRow, lnMemberCount, lnRow, lnRowOffset, lnScaleMode - Local oNewObject, oTemp, tnRow - - this.lFormAddObject=.T. - *!* IF this.lBrowser - *!* IF NOT this.lVCXSCXMode OR this.lFileMode OR this.lSCXMode - *!* RETURN .F. - *!* ENDIF - lcClass = This.cClass - lcBaseClass = This.cBaseClass - lcFileName = This.cFileName - *!* ELSE - *!* IF ISNULL(this.oItem) OR NOT PEMSTATUS(this.oItem,"cBaseClass",5) - *!* RETURN .F. - *!* ENDIF - *!* lcClass=LOWER(this.oItem.cClass) - *!* lcBaseClass=LOWER(this.oItem.cBaseClass) - *!* lcFileName=LOWER(this.oItem.cFileName) - *!* ENDIF - IF this.nAtPos=-.1 - this.nAtPos=-.2 - ENDIF - llAddToScreen=.F. - llAddToCommand=.F. - llAddToNew=.F. - IF VARTYPE(toObject)#"O" - DO CASE - CASE VARTYPE(toObject)#"C" - RETURN .F. - CASE LOWER(ALLTRIM(toObject))=="_screen" - llAddToScreen=.T. - CASE LOWER(ALLTRIM(toObject))=="command" - llAddToCommand=.T. - CASE LOWER(ALLTRIM(toObject))=="new" - llAddToNew=.T. - OTHERWISE - RETURN .F. - ENDCASE - toObject=_screen - ELSE - IF toObject=_screen - llAddToScreen=.T. - ELSE - DO WHILE .T. - IF PEMSTATUS(toObject,"AddObject",5) OR VARTYPE(toObject.Parent)#"O" OR ; - VARTYPE(toObject.Parent.BaseClass)#"C" - EXIT - ENDIF - toObject=toObject.Parent - ENDDO - ENDIF - ENDIF - lcTargetBaseClass=LOWER(toObject.BaseClass) - llAutoAddForm=(lcTargetBaseClass=="form" AND VARTYPE(tnXCoord)#"N") - IF lcTargetBaseClass=="form" AND VARTYPE(toForm)#"O" - toForm=toObject - ENDIF - IF lcTargetBaseClass=="pageframe" AND NOT lcTargetBaseClass=="page" - FOR lnCount = 1 TO toObject.PageCount - IF lnCount=toObject.ActivePage - toObject=toObject.Pages[lnCount] - lcTargetBaseClass=LOWER(toObject.BaseClass) - EXIT - ENDIF - ENDFOR - ENDIF - llPixelMode=(VARTYPE(toForm)=="O" AND TYPE("toForm.ScaleMode")=="N" AND ; - toForm.ScaleMode=3) - lnScaleMode=3 - IF VARTYPE(tnXCoord)=="N" AND TYPE("toForm.ScaleMode")=="N" AND NOT llPixelMode - lnScaleMode=toForm.ScaleMode - IF NOT PEMSTATUS(toForm,"ScaleMode",0) - lnScaleMode=-1 - ENDIF - toForm.ScaleMode=3 - llPixelMode=.T. - llAutoAddForm=.F. - ENDIF - IF llPixelMode - IF TYPE("toForm.FontName")=="C" - lcFontName=toForm.FontName - lnFontSize=toForm.FontSize - ELSE - oTemp=CREATEOBJECT("Textbox") - lcFontName=oTemp.FontName - lnFontSize=oTemp.FontSize - oTemp=.NULL. - ENDIF - ENDIF - lcMWindow=" " - lnRow=0 - lnCol=0 - lnRowOffset=0 - lnColOffset=0 - DO CASE - CASE llAddToScreen OR llAddToCommand OR llAddToNew - lcMWindow="" - CASE llAutoAddForm AND tlDesignMode - lcMWindow=LOWER(toObject.Caption) - CASE PARAMETERS()<3 AND NOT llAutoAddForm AND NOT tlDesignMode - lnCount=-1 - DO WHILE .T. - lnCount=lnCount+1 - lcParentObjName="toObject"+REPLICATE(".parent",lnCount) - IF TYPE(lcParentObjName)#"O" - EXIT - ENDIF - lcBaseClass2=LOWER(EVALUATE(lcParentObjName+".BaseClass")) - IF lcBaseClass2=="form" - lcMWindow=EVALUATE(lcParentObjName+".Name") - lcParentObjProperty=lcParentObjName+".ScaleMode" - llPixelMode=(TYPE(lcParentObjProperty)#"N" OR ; - EVALUATE(lcParentObjProperty)=3) - EXIT - ENDIF - lcParentObjProperty=lcParentObjName+".Top" - IF TYPE(lcParentObjProperty)#"N" - LOOP - ENDIF - lnRowOffset=lnRowOffset-EVALUATE(lcParentObjProperty) - lcParentObjProperty=lcParentObjName+".Left" - lnColOffset=lnColOffset-EVALUATE(lcParentObjProperty) - lcParentObjProperty=lcParentObjName+".BaseClass" - IF LOWER(EVALUATE(lcParentObjProperty))=="pageframe" - lnRowOffset=-OBJTOCLIENT(toObject,1) - lnColOffset=-OBJTOCLIENT(toObject,2) - ENDIF - ENDDO - CASE llAutoAddForm - lcMWindow=LOWER(toObject.Name) - ENDCASE - IF VARTYPE(tnYCoord)=="N" - lnRow=tnYCoord - ELSE - IF NOT lcMWindow==" " AND llAutoAddForm AND WEXIST(lcMWindow) - lnRow=MROW(lcMWindow) - IF lnRow<0 - RETURN .F. - ENDIF - IF llPixelMode - lnRow=lnRow*FONTMETRIC(1,lcFontName,lnFontSize) - ENDIF - lnRow=lnRow+lnRowOffset - ENDIF - ENDIF - IF VARTYPE(tnXCoord)=="N" - lnCol=tnXCoord - ELSE - IF NOT lcMWindow==" " AND llAutoAddForm AND WEXIST(lcMWindow) - lnCol=MCOL(lcMWindow) - IF lnCol<0 - RETURN .F. - ENDIF - IF llPixelMode - lnCol=lnCol*FONTMETRIC(6,lcFontName,lnFontSize) - ENDIF - lnCol=lnCol+lnColOffset - ENDIF - ENDIF - DIMENSION laMembers[1] - laMembers="" - lnMemberCount=AMEMBERS(laMembers,toObject,2) - FOR lnCount2 = 1 TO lnMemberCount - laMembers[lnCount2]=LOWER(laMembers[lnCount2])+" " - ENDFOR - lnCount=0 - DO WHILE .T. - lnCount=lnCount+1 - lcObjName=lcClass+ALLTRIM(STR(lnCount)) - IF ASCAN(laMembers,LOWER(lcObjName)+" ")=0 - EXIT - ENDIF - ENDDO - DIMENSION laMembers[1] - laMembersObj="" - lnMemberCount=AMEMBERS(laMembers,toObject,1) - FOR lnCount2 = 1 TO (2*lnMemberCount) - laMembers[lnCount2]=LOWER(laMembers[lnCount2])+" " - ENDFOR - DO WHILE .T. - IF ASCAN(laMembers,LOWER(lcObjName)+" ")=0 - EXIT - ENDIF - lnCount=lnCount+1 - lcObjName=lcClass+ALLTRIM(STR(lnCount)) - ENDDO - llIgnoreErrors=this.lIgnoreErrors - this.lIgnoreErrors=tlNoErrors - lcObjName=PROPER(lcObjName) - lnFormCount=IIF(lcTargetBaseClass=="formset",toObject.FormCount,0) - IF llAddToCommand OR llAddToNew OR (llAddToScreen AND ; - (lcBaseClass=="formset" OR lcBaseClass=="form" OR ; - lcBaseClass=="toolbar" OR lcBaseClass=="custom")) - lcObjName="o"+PROPER(lcObjName) - DO WHILE .T. - IF TYPE(lcObjName)=="U" - EXIT - ENDIF - lnCount=lnCount+1 - lcObjName="o"+PROPER(lcClass+ALLTRIM(STR(lnCount))) - ENDDO - IF llAddToCommand - DO CASE - CASE lnScaleMode=-1 - toForm.ResetToDefault("ScaleMode") - CASE lnScaleMode=0 - toForm.ScaleMode=0 - ENDCASE - lcKeyboard=[{Ctrl+F2}{Ctrl+END}]+lcObjName+ ; - [=NEWOBJECT("]+lcClass+[","]+lcFileName+["){ENTER}] - KEYBOARD (lcKeyboard) PLAIN - this.lIgnoreErrors=llIgnoreErrors - RETURN - ENDIF - oNewObject=NEWOBJECT(lcClass,lcFileName) - IF VARTYPE(oNewObject)#"O" OR ISNULL(oNewObject) - DO CASE - CASE lnScaleMode=-1 - toForm.ResetToDefault("ScaleMode") - CASE lnScaleMode=0 - toForm.ScaleMode=0 - ENDCASE - oNewObject=.NULL. - this.lError=.F. - this.lIgnoreErrors=llIgnoreErrors - RETURN .F. - ENDIF - IF llAddToNew - DO CASE - CASE lnScaleMode=-1 - toForm.ResetToDefault("ScaleMode") - CASE lnScaleMode=0 - toForm.ScaleMode=0 - ENDCASE - this.lError=.F. - this.lIgnoreErrors=llIgnoreErrors - RETURN oNewObject - ENDIF - PUBLIC (lcObjName) - lcCode=lcObjname+[=oNewObject] - &lcCode - IF NOT lcBaseClass=="formset" AND TYPE("oNewObject.ScaleMode")=="N" - IF oNewObject.ScaleMode=0 - oTemp=IIF(lcBaseClass=="form",oNewObject,_screen) - lnRow=lnRow/FONTMETRIC(1,oTemp.FontName,oTemp.FontSize) - lnCol=lnCol/FONTMETRIC(6,oTemp.FontName,oTemp.FontSize) - oTemp=.NULL. - ENDIF - oNewObject.Top=lnRow - oNewObject.Left=lnCol - ENDIF - lnLastSelect=SELECT() - *!* IF this.lBrowser - *!* this.RefreshRecNo - *!* SELECT (this.cAlias) - *!* IF NOT llAddToNew AND NOT tlNoShow AND ; - *!* ATC(CR_LF+"Visible = .F.",CR_LF+Properties)=0 AND ; - *!* PEMSTATUS(oNewObject,"Show",5) AND ; - *!* PEMSTATUS(oNewObject,"Show",3)=="Method" - *!* oNewObject.Show - *!* ENDIF - *!* ELSE - IF PEMSTATUS(oNewObject,"Show",5) AND ; - PEMSTATUS(oNewObject,"Show",3)=="Method" - oNewObject.Show - ENDIF - *!* ENDIF - SELECT (lnLastSelect) - this.oSource=oNewObject - this.lError=.F. - this.lIgnoreErrors=llIgnoreErrors - IF this.AddInMethod(PROGRAM()) - this.oSource=.NULL. - this.AutoRefresh - DO CASE - CASE lnScaleMode=-1 - toForm.ResetToDefault("ScaleMode") - CASE lnScaleMode=0 - toForm.ScaleMode=0 - ENDCASE - RETURN - ENDIF - this.oSource=.NULL. - this.AutoRefresh - DO CASE - CASE lnScaleMode=-1 - toForm.ResetToDefault("ScaleMode") - CASE lnScaleMode=0 - toForm.ScaleMode=0 - ENDCASE - RETURN - ELSE - toObject.NewObject(lcObjName,lcClass,lcFileName) - ENDIF - oNewObject=.NULL. - IF TYPE("toObject."+lcObjName)#"O" - DO CASE - CASE lnScaleMode=-1 - toForm.ResetToDefault("ScaleMode") - CASE lnScaleMode=0 - toForm.ScaleMode=0 - ENDCASE - this.lError=.F. - this.lIgnoreErrors=llIgnoreErrors - RETURN .F. - ENDIF - oNewObject=toObject.&lcObjName - oNewObject.Name=lcObjName - - *{123} MJP -- 05/16/2013 12:01:21 PM - Begin - This.RemoveText1FromColumn(lcTargetBaseClass, toObject, lcObjName) - *} MJP -- 05/16/2013 12:01:21 PM - End - - IF PEMSTATUS(oNewObject, "Top", 5) and not PEMSTATUS(oNewObject, "Top", 1) - oNewObject.Top=lnRow - ENDIF - IF PEMSTATUS(oNewObject, "Left", 5) and not PEMSTATUS(oNewObject, "Left", 1) - oNewObject.Left=lnCol - ENDIF - IF tlDesignMode - toObject.Refresh - ELSE - IF NOT tlNoShow AND TYPE("oNewObject.Visible")=="L" - *!* lnLastSelect=SELECT() - *!* IF this.lBrowser - *!* this.RefreshRecNo - *!* SELECT (this.cAlias) - *!* IF ATC(CR_LF+"Visible = .F.",CR_LF+Properties)=0 AND ; - *!* GETPEM(oNewObject.Class,"Visible") - *!* oNewObject.Visible=.T. - *!* ENDIF - *!* ELSE - *!* oNewObject.Visible=.T. - *!* ENDIF - *!* SELECT (lnLastSelect) - ENDIF - IF llAddToScreen - _screen.Refresh - ENDIF - ENDIF - this.lIgnoreErrors=llIgnoreErrors - this.lError=.F. - this.oSource=oNewObject - *!* IF this.AddInMethod(PROGRAM()) - *!* DO CASE - *!* CASE lnScaleMode=-1 - *!* toForm.ResetToDefault("ScaleMode") - *!* CASE lnScaleMode=0 - *!* toForm.ScaleMode=0 - *!* ENDCASE - *!* this.oSource=.F. - *!* this.oSource=.NULL. - *!* RETURN - *!* ENDIF - this.oSource=.NULL. - llBuilder=(tlBuilder AND ; - ((TYPE("oNewObject.BuilderX")=="C" AND NOT EMPTY(oNewObject.BuilderX)) OR ; - (TYPE("oNewObject.Builder")=="C" AND NOT EMPTY(oNewObject.Builder))) AND ; - NOT EMPTY(_builder) AND FILE(_builder)) - IF NOT tlNoShow AND tlActivateForm - *!* ******************** Removed 5/11/2013 ***************** - *!* IF this.lBrowser AND this.Visible - *!* this.cmdClassIcon.SetFocus - *!* ENDIF - oTemp=toObject - DO WHILE NOT LOWER(oTemp.BaseClass)=="form" - IF TYPE("oTemp.parent")#"O" - EXIT - ENDIF - oTemp=oTemp.parent - ENDDO - IF LOWER(oTemp.BaseClass)=="form" - oTemp.Show - ENDIF - oTemp=.NULL. - ENDIF - IF NOT tlDesignMode - DO CASE - CASE lnScaleMode=-1 - toForm.ResetToDefault("ScaleMode") - CASE lnScaleMode=0 - toForm.ScaleMode=0 - ENDCASE - IF llBuilder - DOEVENTS - DO (_builder) WITH (oNewObject) - ENDIF - RETURN oNewObject - ENDIF - IF lcTargetBaseClass=="formset" - DO CASE - CASE lnScaleMode=-1 - toForm.ResetToDefault("ScaleMode") - CASE lnScaleMode=0 - toForm.ScaleMode=0 - ENDCASE - IF lnFormCount=1 - DOEVENTS - CLEAR TYPEAHEAD - KEYBOARD "{Alt+M}C" PLAIN - ENDIF - IF llBuilder - DOEVENTS - DO (_builder) WITH (oNewObject) - ENDIF - RETURN oNewObject - ENDIF - lcMWindow=toObject.Name - IF NOT WEXIST(lcMWindow) - IF TYPE("toObject.Caption")#"C" - DO CASE - CASE lnScaleMode=-1 - toForm.ResetToDefault("ScaleMode") - CASE lnScaleMode=0 - toForm.ScaleMode=0 - ENDCASE - IF llBuilder - DOEVENTS - DO (_builder) WITH (oNewObject) - ENDIF - RETURN oNewObject - ENDIF - lcMWindow=toObject.Caption - IF NOT WEXIST(lcMWindow) - DO CASE - CASE lnScaleMode=-1 - toForm.ResetToDefault("ScaleMode") - CASE lnScaleMode=0 - toForm.ScaleMode=0 - ENDCASE - IF llBuilder - DOEVENTS - DO (_builder) WITH (oNewObject) - ENDIF - RETURN oNewObject - ENDIF - ENDIF - CLEAR TYPEAHEAD - *** JRN 2010-04-19 : new code to attempt to click on the newly added object - *!* lnMRow = Mrow('',3) - *!* lnMCol = MCol('',3) - *!* Mouse At lnMRow + 4, lnMCol + 2 Pixels - *!* IF AMOUSEOBJ(laMouseObj) >= 4 ; - *!* AND VARTYPE(laMouseObj[2])=="O" ; - *!* and laMouseObj(2) = oNewObject - *!* Mouse Click Shift Control - *!* Else - *!* ?laMouseObj(2).Name, lnMRow, lnMCol - *!* ENDIF - *!* Mouse At lnMRow, lnMCol Pixels - - IF NOT llBuilder AND NOT EMPTY(lcMWindow) - DOEVENTS - IF llPixelMode - MOUSE CLICK ; - AT lnRow+4,lnCol+2 PIXELS ; - WINDOW (lcMWindow) - ELSE - MOUSE CLICK ; - AT lnRow+.25,lnCol+.5 ; - WINDOW (lcMWindow) - ENDIF - DOEVENTS - ENDIF - DO CASE - CASE lnScaleMode=-1 - toForm.ResetToDefault("ScaleMode") - CASE lnScaleMode=0 - toForm.ScaleMode=0 - ENDCASE - IF llBuilder - DOEVENTS - DO (_builder) WITH (oNewObject) - EndIf - - RETURN oNewObject - - ENDPROC - - PROCEDURE mousedown && Occurs when the user presses the mouse button. - LPARAMETERS nButton, nShift, nXCoord, nYCoord, loThis - - Local laMouseObj[1], laSelObj[1], lcBaseClass, lcMWindow, llDesignMode, llDesignModeCheck - Local llRunModeCheck, lnMCol, lnMRow, lnSeconds, lnXCoord, lnYCoord, loObject - Local oForm, oNewObject, oObject - - lnMRow = Mrow() - lnMCol = Mcol() - lnSeconds = Seconds() - This.lDragDrop = .F. - This.nMouseButton = Iif(Type('nButton') == 'N', nButton, 0) - This.nShift = nShift - This.lFormAddObject = .F. - - *!* ******************** Removed 5/11/2013 ***************** - *!* IF This.lBrowser AND NOT This.lVCXSCXMode - *!* RETURN - *!* ENDIF - IF nButton=2 - DO WHILE ABS(SECONDS()-lnSeconds)<_dblclick - IF NOT MDOWN() - RETURN - ENDIF - *!* ******************** Removed 6/3/2013 ***************** - *!* IF ABS(MROW(This.Name,3)-lnMRow)>=loThis.Height OR ; - *!* ABS(MCOL(This.Name,3)-lnMCol)>=loThis.Height - *!* EXIT - *!* ENDIF - ENDDO - ENDIF - llDesignModeCheck=.T. - llRunModeCheck=.F. - *** JRN 2010-04-18 : commented out - *!* lcStatusBarText=loThis.StatusBarText - *!* loThis.StatusBarText="" - lcBaseClass=This.cBaseClass - *!* loThis.DragIcon="c:\dev\browser\control.cur" - *!* This.cDragIcon=loThis.DragIcon - *!* IF This.lBrowser AND (This.lSCXMode OR This.lFileMode) - *!* llDesignModeCheck=.F. - *!* loThis.DragIcon="c:\dev\browser\nodrop.cur" - *!* ENDIF - *!* llError=This.lError - *!* This.lError=.F. - This.nAtPos=-.1 - - *** JRN 2010-04-18 : Finally!! loThis.Drag below! - IF nButton>=0 - IF nButton # 2 and NOT MDOWN() - This.lDragDrop=.F. - RETURN - ENDIF - loThis.Drag - ENDIF - **************************************************************** - **************************************************************** - oObject=.NULL. - lnXCoord=0 - lnYCoord=0 - oForm=.NULL. - lcMWindow=LOWER(ALLTRIM(MWINDOW())) - - If Amouseobj (laMouseObj) >= 4 And Vartype (laMouseObj[2]) == 'O' - oObject = laMouseObj[2] - lnXCoord = laMouseObj[3] - lnYCoord = laMouseObj[4] - laMouseObj = .Null. - If Amouseobj (laMouseObj, 1) >= 4 - oForm = laMouseObj[2] - Endif - - * Inserted 07/20/2011 / JRN - If Type ('_oPEMEditor.oUtils.oPEMEditor.oObject') = 'O' - Local loObject - loObject = oObject - Do While .T. - Do Case - Case loObject = _oPEMEditor.oUtils.oPEMEditor - oObject = _oPEMEditor.oUtils.oPEMEditor.oObject - lnXCoord = 0 - lnYCoord = 0 - oForm = _oPEMEditor.oUtils.oPEMEditor.oTopOfForm - Exit - Case Type ('loobject.Parent') = 'O' - loObject = loObject.Parent - Otherwise - Exit - Endcase - Enddo While .T. - Endif Type ('_oPEMEditor.oUtils.oPEMEditor.oObject') = 'O' - - Endif - - *** JRN 2010-04-18 : following lines not needed - *!* loThis.StatusBarText=lcStatusBarText - *!* IF NOT This.lBrowser AND (ISNULL(This.oItem) OR ISNULL(This.oItem.oAction)) - *!* RETURN - *!* ENDIF - IF TYPE("oObject")#"O" OR ISNULL(oObject) - oObject=.NULL. - ENDIF - IF ISNULL(oObject) - *!* lnCount=LEN(M_PROJECT_MANAGER_LOC+" - ") - *!* IF LOWER(LEFT(lcMWindow,lnCount))==LOWER(M_PROJECT_MANAGER_LOC+" - ") - *!* IF This.lBrowser - *!* lcFileName=This.cFileName - *!* ELSE - *!* lcFileName=This.oItem.cFileName - *!* ENDIF - *!* IF EMPTY(lcFileName) OR NOT FILE(lcFileName) - *!* RETURN - *!* ENDIF - *!* lcProjectFile=LOWER(FORCEEXT(ALLTRIM(SUBSTR(lcMWindow,lnCount+1)),"pjx")) - *!* FOR lnCount = 1 TO _vfp.Projects.Count - *!* IF LOWER(JUSTFNAME(_vfp.Projects[lnCount].Name))==lcProjectFile - *!* _vfp.Projects[lnCount].Files.Add(lcFileName) - *!* EXIT - *!* ENDIF - *!* ENDFOR - *!* RETURN - *!* ENDIF - RETURN - ELSE - DO WHILE .T. - IF PEMSTATUS(oObject,"AddObject",5) OR TYPE("oObject.Parent")#"O" OR ; - TYPE("oObject.Parent.BaseClass")#"C" - EXIT - ENDIF - oObject=oObject.Parent - ENDDO - ENDIF - IF NOT ISNULL(oForm) AND oForm=thisform - RETURN - ENDIF - *** JRN 2010-04-18 : not needed - *!* IF NOT This.lBrowser - *!* This.oItem.oAction.DragDrop2(oObject,lnXCoord,lnYCoord) - *!* RETURN - *!* ENDIF - *!* IF This.lDragDrop OR ISNULL(oObject) - *!* This.lDragDrop=.F. - *!* This.lFormAddObject=.F. - *!* IF NOT lcMWindow=="command" - *!* RETURN - *!* ENDIF - *!* ENDIF - *!* IF EMPTY(lcMWindow) - *!* IF MROW(This.Name)>0 AND MCOL(This.Name)>0 - *!* lcMWindow=This.Name - *!* ELSE - *!* FOR lnCount = _screen.FormCount TO 1 STEP -1 - *!* oForm=_screen.Forms[lnCount] - *!* IF NOT oForm.Name==This.Name AND ; - *!* oForm.Class==This.Class AND ; - *!* LOWER(LEFT(oForm.Name,12))=="classbrowser" AND ; - *!* TYPE("oForm.cBrowserTable")#"U" AND ; - *!* MROW(oForm.Name)>0 AND MCOL(oForm.Name)>0 - *!* lcMWindow=oForm.Name - *!* EXIT - *!* ENDIF - *!* ENDFOR - *!* ENDIF - *!* ENDIF - *!* loThis.DragIcon=This.cDragIcon - *!* IF This.lError OR This.nAtPos=-.2 OR NOT llDesignModeCheck - *!* This.cDragIcon="" - *!* This.lFormAddObject=.F. - *!* This.nAtPos=0 - *!* IF llError - *!* This.lError=llError - *!* ENDIF - *!* RETURN - *!* ENDIF - *!* This.lError=llError - *!* This.cDragIcon="" - *!* This.nAtPos=0 - *!* IF lcMWindow==LOWER(This.Name) - *!* This.lFormAddObject=.F. - *!* RETURN - *!* ENDIF - llDesignMode=.F. - DO CASE - CASE lcMWindow=="command" - oObject="command" - CASE EMPTY(lcMWindow) AND oObject=_screen - oObject="_screen" - CASE TYPE("oObject.lFormAddObject")#"L" OR NOT oObject.lFormAddObject - llDesignMode=.T. - DIMENSION laSelObj[1] - IF ASELOBJ(laSelObj,1)=0 OR (TYPE("oObject.BaseClass")=="C" AND ; - (LOWER(oObject.BaseClass)=="container" OR ; - LOWER(oObject.BaseClass)=="column" OR ; - LOWER(oObject.BaseClass)=="page")) - llRunModeCheck=.T. - ELSE - oObject=laSelObj[1] - RELEASE laSelObj - IF LOWER(oObject.BaseClass)=="form" - IF TYPE("oObject.Caption")#"C" OR NOT lcMWindow==LOWER(ALLTRIM(oObject.Caption)) - llRunModeCheck=.T. - thisform.lFormAddObject=.F. - ENDIF - ELSE - IF NOT lcMWindow==LOWER(ALLTRIM(oObject.Name)) - llRunModeCheck=.T. - thisform.lFormAddObject=.F. - ENDIF - ENDIF - IF NOT llRunModeCheck AND (lcBaseClass=="form" OR lcBaseClass=="toolbar") - oObject=oObject.parent - ENDIF - ENDIF - ENDCASE - IF llRunModeCheck AND NOT thisform.lFormAddObject - llDesignMode=.F. - ENDIF - thisform.lFormAddObject=.F. - - *** JRN 2010-04-18 : modified slightly - *RETURN This.FormAddObject(oObject,lnXCoord,lnYCoord,.T.,llDesignMode, ; - (nShift=1),(NOT This.lDragDropErrors AND nShift#2),(nButton=2),oForm) - oNewObject = This.FormAddObject(oObject,lnXCoord,lnYCoord,.T.,llDesignMode, ; - (nShift=1),(nShift#2),(nButton=2),oForm) - - *** JRN 2010-04-30 : Update PEM Editor - If Type('_oPEMEditor.oUtils') = 'O' and Vartype(_oPEMEditor.oUtils) = 'O' - _oPEMEditor.oUtils.SetCurrentSelectedObject (oNewObject) - EndIf - - Return oNewObject - ENDPROC - - PROCEDURE removetext1fromcolumn - #Define ccPROMPT 'Remove the default Text1 control from this column?' - - Lparameters lcTargetBaseClass, toObject, lcObjName - *{123} MJP -- 05/16/2013 12:01:21 PM - Begin - *-- This code was leveraged from the VFP Toolbox source code. - *-- If the object was just added to a column, check if the column contains - *-- the default Text1 textbox. If that textbox exists, ask the user if - *-- they want to replace it with the object that was just added. If yes, - *-- remove Text1, and make the new object the current (default) control - *-- for the column. - *-- PLEASE NOTE that the Toolbox engine includes a property to indicate - *-- whether the user should be prompted to remove Text1, and another - *-- property to indicate whether the CurrentControl setting should be - *-- changed. Something like that could be done here if Finder needed to - *-- be that configurable. - Local lnCount2 - If m.lcTargetBaseClass == 'column' - For lnCount2 = 1 To m.toObject.ControlCount - If m.toObject.Controls(m.lnCount2).Name == 'Text1' - *-- PLEASE NOTE: The prompt and caption used by Toolbox are - *-- defined in a #DEFINE. I would probably be a good idea to - *-- do something similar here, rather than using explicit text. - If Messagebox(ccPROMPT, 4 + 32 + 256, 'Finder' ) = 6 && Yes - toObject.RemoveObject( 'Text1' ) - - *-- This property setting is wrapped in TRY..CATCH in the - *-- Toolbox code, so do the same here. I don't know what - *-- might cause this to fail. - Try - toObject.CurrentControl = m.lcObjName - Catch to loException - Endtry - Endif - Exit - Endif - Endfor - Endif - *} MJP -- 05/16/2013 12:01:21 PM - End - - ENDPROC - -ENDDEFINE - -DEFINE CLASS custpanel AS custom - *< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" /> - - * - *m: getclassfilename - *m: getvalues - *m: setvalues - *p: ccolumninfo - *p: cpanel - *p: cpanelfilter - *p: cpanelkey - *p: cpropertieslist - *p: csortorder - *p: lsubdirectories - *p: lusepanel - *p: npanelwidth - *p: _memberdata && XML Metadata for customizable properties - * - - * - ccolumninfo = - cpanel = - cpanelfilter = - cpanelkey = - cpropertieslist = cPanel, cPanelFilter, cPanelKey, lUsePanel, nPanelWidth, cSortOrder, cColumnInfo, lSubDirectories - csortorder = |COLFILENAME| - lsubdirectories = .F. - lusepanel = .T. - Name = "custpanel" - npanelwidth = 175 - _memberdata = - - - - - - - - - - - - - - * - - PROCEDURE getclassfilename - Lparameters tcClassLoc, tcPath - - *** JRN 02/24/2009 : per Doug ... handles cases of absolute paths and relative to current directory - - Do Case - Case ':' $ tcClassLoc - Return tcClassLoc - - Case File( Fullpath( m.tcClassLoc, m.tcPath ) ) - Return Fullpath(tcClassLoc, tcPath) - - Otherwise - Return Fullpath( m.tcClassLoc ) - Endcase - - ENDPROC - - PROCEDURE getvalues - #Define CRLF Chr[13] + Chr[10] - - Local laProperties[1], lcProperty, lcResult, lnCount, lnI - lcResult = '' - lnCount = Alines(laProperties, This.cPropertiesList , 5, ',') - For lnI = 1 To lnCount - lcProperty = laProperties[lnI] - lcResult = lcResult + lcProperty + ' = ' + Transform(Getpem(This, lcProperty)) + CRLF - Endfor - Return lcResult - ENDPROC - - PROCEDURE setvalues - Lparameters lcProperties - - Local laProperties[1], lcName, lcProperty, lcValue, lnCount, lnI, lnPos - - lnCount = Alines(laProperties, lcProperties, 5) - For lnI = 1 To lnCount - lcProperty = laProperties[lnI] - lnPos = At('=', lcProperty) - If lnPos > 0 - lcName = Left(lcProperty, lnPos - 2) - lcValue = Substr(lcProperty, lnPos + 2) - Do Case - Case Not PemStatus(This, lcName, 5) - - Case Left(lcName, 1) = 'n' - This.&lcName = Val(lcValue) - Case Left(lcName, 1) = 'l' - This.&lcName = Atc('.T.', lcValue) # 0 - Otherwise - This.&lcName = lcValue - Endcase - Endif && lnPos > 0 - Endfor && lnI = 1 To lnCount - - - ENDPROC - -ENDDEFINE - -DEFINE CLASS frmscopefinder AS baseform OF "thor_proc_scopeprocessor.vcx" - *< CLASSDATA: Baseclass="form" Timestamp="" Scale="Pixels" Uniqueid="" /> - - *-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder - *< OBJECTDATA: ObjPath="chklProjectHomeDirectory" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="cmdScope" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="lblScope" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="cboScope" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="chklPathAndClassLibs" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="chklCurrentDirectory" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="chklActiveProject" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="chklSubDirectories" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="cmdBrowseDir" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="cmdBrowseProject" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="cmdCancel" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="cmdGo" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Line1" UniqueID="" Timestamp="" /> - - * - *m: chdirtoscope - *m: cscope_assign - *m: getdirfromscope - *m: getscopetype - *m: savemrulists - *m: updatemrulist - *p: ccaption - *p: cdirectorymrus - *p: cpathandclasslibs - *p: cprojectmrus - *p: cscope - *p: cscreenproperty - *p: lactiveproject - *p: lcurrentdirectory - *p: lpathandclasslibs - *p: lprojecthomedirectory - *p: lsubdirectories - *p: nmrudisplaycount - *p: oscope - * - - * - AllowOutput = .F. - BindControls = .F. - Caption = "Scope Processor" - ccaption = - cdirectorymrus = - cpathandclasslibs = << Path or ClassLibs >> - cprojectmrus = - cscope = - cscreenproperty = - DataSession = 2 - DoCreate = .T. - FontSize = 8 - Height = 150 - lactiveproject = .F. - ladddescendants = .T. - lcurrentdirectory = .F. - Left = 0 - lformaddobject = .F. - lpathandclasslibs = .F. - lprojecthomedirectory = .F. - lsubdirectories = .T. - MaxHeight = 150 - Name = "frmscopefinder" - nmrudisplaycount = 6 - oscope = .NULL. - ShowTips = .T. - Top = 0 - Width = 429 - _memberdata = - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * - - ADD OBJECT 'cboScope' AS cbofinder WITH ; - Anchor = 10, ; - DisabledForeColor = 0,0,0, ; - DisplayCount = 25, ; - FontSize = 8, ; - Format = "", ; - Height = 21, ; - Left = 78, ; - MaxLength = 254, ; - Name = "cboScope", ; - Style = 0, ; - TabIndex = 7, ; - Top = 58, ; - Width = 330, ; - ZOrderSet = 7 - *< END OBJECT: ClassLib="thor_proc_scopeprocessor.vcx" BaseClass="combobox" /> - - ADD OBJECT 'chklActiveProject' AS chkfinder WITH ; - Alignment = 0, ; - Anchor = 0, ; - AutoSize = .T., ; - Caption = "\ - - ADD OBJECT 'chklCurrentDirectory' AS chkfinder WITH ; - Alignment = 0, ; - Anchor = 0, ; - AutoSize = .T., ; - Caption = "\ - - ADD OBJECT 'chklPathAndClassLibs' AS chkfinder WITH ; - Alignment = 0, ; - Anchor = 0, ; - AutoSize = .T., ; - Caption = "\ - - ADD OBJECT 'chklProjectHomeDirectory' AS chkfinder WITH ; - Alignment = 0, ; - AutoSize = .T., ; - Caption = "Home directory and sub-directories only", ; - ccontrolsource = ThisForm.lProjectHomeDirectory, ; - ControlSource = "Thisform.lProjectHomeDirectory", ; - FontSize = 8, ; - Height = 16, ; - Left = 78, ; - Name = "chklProjectHomeDirectory", ; - TabIndex = 12, ; - Top = 84, ; - Visible = .F., ; - Width = 211, ; - ZOrderSet = 0 - *< END OBJECT: ClassLib="thor_proc_scopeprocessor.vcx" BaseClass="checkbox" /> - - ADD OBJECT 'chklSubDirectories' AS chkfinder WITH ; - Alignment = 0, ; - AutoSize = .T., ; - Caption = "Searc\ - - ADD OBJECT 'cmdBrowseDir' AS cmdfinder WITH ; - Anchor = 0, ; - Caption = "Browse \ - - ADD OBJECT 'cmdBrowseProject' AS cmdfinder WITH ; - Anchor = 0, ; - Caption = "\ - - ADD OBJECT 'cmdCancel' AS cmdfinder WITH ; - Anchor = 6, ; - Cancel = .T., ; - Caption = "Cancel", ; - FontSize = 8, ; - Height = 23, ; - Left = -100, ; - Name = "cmdCancel", ; - TabIndex = 5, ; - Top = -118, ; - Width = 68, ; - ZOrderSet = 10 - *< END OBJECT: ClassLib="thor_proc_scopeprocessor.vcx" BaseClass="commandbutton" /> - - ADD OBJECT 'cmdGo' AS cmdfinder WITH ; - Anchor = 0, ; - AutoSize = .F., ; - Caption = "Go", ; - Default = .T., ; - FontBold = .T., ; - FontSize = 9, ; - Height = 27, ; - Left = 162, ; - Name = "cmdGo", ; - TabIndex = 11, ; - Top = 114, ; - Width = 58, ; - ZOrderSet = 10 - *< END OBJECT: ClassLib="thor_proc_scopeprocessor.vcx" BaseClass="commandbutton" /> - - ADD OBJECT 'cmdScope' AS cmdfinder WITH ; - Caption = "", ; - FontSize = 8, ; - Height = 21, ; - Left = 49, ; - Name = "cmdScope", ; - Picture = ..\images\folder.bmp, ; - PicturePosition = 13, ; - SpecialEffect = 2, ; - TabIndex = 15, ; - Top = 57, ; - Width = 21, ; - ZOrderSet = 5 - *< END OBJECT: ClassLib="thor_proc_scopeprocessor.vcx" BaseClass="commandbutton" /> - - ADD OBJECT 'lblScope' AS lblfinder WITH ; - Alignment = 1, ; - Caption = "Sco\ - - ADD OBJECT 'Line1' AS line WITH ; - Anchor = 10, ; - Height = 0, ; - Left = 0, ; - Name = "Line1", ; - Top = 106, ; - Width = 593 - *< END OBJECT: BaseClass="line" /> - - PROCEDURE Activate - Set Talk Off - This.Refresh() - - ENDPROC - - PROCEDURE chdirtoscope - Local lcScope - lcScope = Thisform.cScope - lcScopeType = Thisform.GetScopeType() - - Do Case - Case lcScopeType = 'Project' - Cd (Justpath(lcScope)) - Case lcScopeType = 'Folder' - Cd (Justpath(lcScope)) - Endcase - - - ENDPROC - - PROCEDURE cscope_assign - Lparameters tcScope - - Local lcCaption, lcScope - If Upper(This.cScope) == Upper(tcScope) - Return - Endif - - This.cScope = tcScope - lcScope = Trim(This.oTools.DiskFileName(tcScope)) - If Right(lcScope, 1) = '\' - lcScope = Left(lcScope, Len(lcScope) - 1) - Endif - - lcCaption = Justfname(lcScope) - If Empty(lcCaption) - lcCaption = Justfname(Justpath(lcScope)) - Endif - - This.Caption = This.cCaption + ' - ' + lcCaption - - If Upper(Thisform.cboScope.DisplayValue) == Upper(tcScope) - Return - Endif - - Thisform.cboScope.DisplayValue = lcScope - - ENDPROC - - PROCEDURE Destroy - This.SaveMRULists() - This.oSettings.Save(Thisform) - - This.oSettings = Null - This.oTools = Null - - - ENDPROC - - PROCEDURE getallsettings - Local lcProperties - - Text To lcProperties Noshow Pretext 15 - cScope - lActiveProject - lCurrentDirectory - lPathAndClassLibs - lProjectHomeDirectory - lSubDirectories - cProjectMRUs - cDirectoryMRUs - Endtext - - Return Chrtran(lcProperties, ' ', ',') - ENDPROC - - PROCEDURE getdirfromscope - Local lcScope, lcScopeType - lcScope = Thisform.cScope - lcScopeType = Thisform.GetScopeType() - - Do Case - Case lcScopeType = 'Project' - Return lcScope - Case lcScopeType = 'Folder' - Return Justpath(lcScope) - Case lcScopeType = 'Path' - Return Sys(5) + Curdir() - Otherwise - Return '' - Endcase - - ENDPROC - - PROCEDURE getscopetype - Local lcScope - lcScope = Thisform.cScope - Do Case - Case This.lPathAndClassLibs - Return 'Path' - Case Upper(Justext(lcScope)) == 'PJX' - Return 'Project' - Case Directory(lcScope) - Return 'Folder' - Otherwise - Return 'None' - Endcase - - - ENDPROC - - PROCEDURE Init - Lparameters lcCaption - - With This - .cCaption = Evl(lcCaption, This.Caption) - .oTools = Execscript(_Screen.cThorDispatcher, 'Class= tools from pemeditor') - .oSettings = Execscript(_Screen.cThorDispatcher, 'Class= ThorFormSettings', 'Scope Processor') - .oSettings.Restore(Thisform, 'Height, Width, Top, Left') - .oSettings.Restore(Thisform, .GetAllSettings()) - .cboScope.Requery() - Endwith - - ENDPROC - - PROCEDURE Load - Set Talk Off - DoDefault() - - ENDPROC - - PROCEDURE savemrulists - Local lcScopeType - - With Thisform - * -------------------------------------------------------------------------------- - lcScope = This.oTools.DiskFileName(Fullpath(.cScope)) - lcScopeType = Thisform.GetScopeType() - Do Case - Case lcScopeType = 'Project' - .cProjectMRUs = .UpdateMRUList(.cProjectMRUs, lcScope) - Case lcScopeType = 'Folder' - .cDirectoryMRUs = .UpdateMRUList(.cDirectoryMRUs, lcScope) - Endcase - .cboScope.Requery() - - Endwith && Thisform - - ENDPROC - - PROCEDURE updatemrulist - Lparameters lcMRUList, lcNewItem, lnMaxItems - Local lcNewMRUs - - lcNewMRUs = lcNewItem + '|' + lcMRUList - lcNewMRUs = Strtran(lcNewMRUs, '|' + lcNewItem + '|', '|', 1, 1, 1) - lnMaxItems = Evl(lnMaxItems, Thisform.nMRUDisplayCount) - If Occurs('|', lcNewMRUs) > lnMaxItems - lcNewMRUs = Left(lcNewMRUs, At('|', lcNewMRUs, lnMaxItems)) - Endif - - Return lcNewMRUs - ENDPROC - - PROCEDURE cboScope.InteractiveChange - Local lPathAndClassLibs - If Upper(Thisform.cScope) == Upper(This.DisplayValue) - Return - Endif - - With Thisform - .lActiveProject = .F. - .lCurrentDirectory = .F. - .lPathAndClassLibs = Trim(This.DisplayValue) == Thisform.cPathAndClassLibs - .cScope = This.DisplayValue - - .chklActiveProject.Refresh() - .chklCurrentDirectory.Refresh() - .chklProjectHomeDirectory.Refresh() - .chklSubDirectories.Refresh() - .chklPathAndClassLibs.Refresh() - - .cmdScope.Refresh() - Endwith - - - ENDPROC - - PROCEDURE cboScope.Requery - Local laLines[1], lcCurDir, lcProjectMRUs, lnCount, lnI - - This.Clear() - lcCurDir = Curdir() - - * -------------------------------------------------------------------------------- - lcProjectMRUs = Thisform.cProjectMRUs - For lnI = _vfp.Projects.Count To 1 Step - 1 - lcProjectMRUs = Thisform.UpdateMRUList(lcProjectMRUs, _vfp.Projects[lnI].Name) - Endfor - - * -------------------------------------------------------------------------------- - This.AddItem('\ ----- Projects -----') - lnCount = Alines(laLines, lcProjectMRUs, 5, '|') - For lnI = 1 To Min(lnCount, Thisform.nMRUDisplayCount) - This.AddItem(Thisform.oTools.DiskFileName(laLines[lnI])) - Endfor - - * -------------------------------------------------------------------------------- - This.AddItem('\-') - This.AddItem('\ ----- Folders -----') - lnCount = Alines(laLines, Thisform.cDirectoryMRUs, 5, '|') - For lnI = 1 To Min(lnCount, Thisform.nMRUDisplayCount) - This.AddItem(Thisform.oTools.DiskFileName(laLines[lnI])) - Endfor - - *!* ******************** Removed 1/31/2014 ***************** - *!* * -------------------------------------------------------------------------------- - *!* lnCount = Alines(laLines, Thisform.cFavoritesList, 5, '|', ';', Chr[13], Chr[10]) - *!* If lnCount > 0 - *!* This.AddItem('\-') - *!* This.AddItem('\ ----- Favorites -----') - *!* For lnI = 1 To lnCount - *!* This.AddItem(Thisform.oTools.DiskFileName(Fullpath(laLines[lnI]))) - *!* Endfor - *!* Endif - - This.AddItem('\-') - This.AddItem(Thisform.cPathAndClassLibs) - - ENDPROC - - PROCEDURE cboScope.Valid - Thisform.Refresh() - - ENDPROC - - PROCEDURE chklActiveProject.Refresh - DoDefault() - This.Enabled = _vfp.Projects.Count # 0 - - - ENDPROC - - PROCEDURE chklActiveProject.Valid - If This.Value - Thisform.lCurrentDirectory = .F. - Thisform.lPathAndClassLibs = .F. - Thisform.cScope = _vfp.Projects[1].Name - Thisform.Refresh() - Endif - - ENDPROC - - PROCEDURE chklCurrentDirectory.Valid - If This.Value - Thisform.lActiveProject = .F. - Thisform.lPathAndClassLibs = .F. - Thisform.cScope = Sys(5) + Curdir() - Thisform.Refresh() - Endif - - ENDPROC - - PROCEDURE chklPathAndClassLibs.Valid - If This.Value - Thisform.lActiveProject = .F. - Thisform.lCurrentDirectory = .F. - Thisform.cScope = Thisform.cPathAndClassLibs - Thisform.Refresh() - Endif - - ENDPROC - - PROCEDURE chklProjectHomeDirectory.Refresh - This.Visible = Thisform.GetScopeType() = 'Project' - - ENDPROC - - PROCEDURE chklSubDirectories.Refresh - This.Visible = Thisform.GetScopeType() = 'Folder' - - ENDPROC - - PROCEDURE cmdBrowseDir.Click - Local lcCurdir, lcFolder - - lcFolder = Getdir(Thisform.GetDirFromScope(), 'Select a folder to search', 'Finder', 1 + 16 + 32 + 64 + 512) - - If Not Empty(lcFolder) - Thisform.lActiveProject = .F. - Thisform.lCurrentDirectory = .F. - Thisform.lPathAndClassLibs = .F. - Thisform.cScope = lcFolder - Thisform.Refresh() - Endif - ENDPROC - - PROCEDURE cmdBrowseProject.Click - Local lcCurdir, lcProject - - lcCurdir = Sys(5) + Curdir() - ThisForm.ChDirToScope() - - lcProject = Getfile('PJX', 'Project') - Cd (lcCurdir) - - If Not Empty(lcProject) - Thisform.lActiveProject = .F. - Thisform.lCurrentDirectory = .F. - Thisform.lPathAndClassLibs = .F. - Thisform.cScope = lcProject - Thisform.Refresh() - Endif - ENDPROC - - PROCEDURE cmdCancel.Click - ThisForm.Release() - - ENDPROC - - PROCEDURE cmdGo.Click - Thisform.Hide() - - ENDPROC - - PROCEDURE cmdGo.Refresh - This.Visible = InList(Thisform.GetScopeType(), 'Project', 'Folder', 'Path') - - ENDPROC - - PROCEDURE cmdScope.Click - Local lcImageFolder, lcScope, lcScopeType, llEnabled - lcScope = Thisform.cScope - lcScopeType = Thisform.GetScopeType() - Do Case - Case lcScopeType = 'Project' - Modify Project (lcScope) Nowait - Case lcScopeType = 'Folder' - Execscript(_Screen.cThorDispatcher, 'Thor_Proc_OpenExplorer', lcScope) - Case lcScopeType = 'Path' - Thisform.ShowPathClassLibs() - Endcase - - - ENDPROC - - PROCEDURE cmdScope.Refresh - Local lcImageFolder, lcScope, lcScopeType, llEnabled - lcScope = Thisform.cScope - lcScopeType = Thisform.GetScopeType() - lcImageFolder = Justpath(Justpath(This.ClassLibrary)) + '\Images\' - Do Case - Case lcScopeType = 'Project' - llEnabled = File(lcScope) - This.Picture = lcImageFolder + 'Project.bmp' - This.ToolTipText = 'Click to open this project' + Chr(13) + 'Right-click to open Project folder in Explorer' - Case lcScopeType = 'Folder' - llEnabled = .T. - This.Picture = lcImageFolder + 'Folder.bmp' - This.ToolTipText = 'Click to open this folder in Explorer' - Case lcScopeType = 'Path' - llEnabled = .T. - This.Picture = lcImageFolder + 'Event.bmp' - This.ToolTipText = 'Click to display current Path and ClassLibs' - Otherwise - llEnabled = .F. - Endcase - - This.Enabled = llEnabled - This.Visible = llEnabled - - ENDPROC - - PROCEDURE cmdScope.RightClick - Local lcImageFolder, lcScope, lcScopeType, llEnabled - - lcScope = Thisform.cScope - lcScopeType = Thisform.GetScopeType() - - If lcScopeType = 'Project' - Execscript(_Screen.cThorDispatcher, 'Thor_Proc_OpenExplorer', lcScope) - Endif - - - ENDPROC - -ENDDEFINE - -DEFINE CLASS lblfinder AS label - *< CLASSDATA: Baseclass="label" Timestamp="" Scale="Pixels" Uniqueid="" /> - - * - Caption = "Label1" - Height = 17 - Name = "lblfinder" - Width = 40 - * - -ENDDEFINE diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.vct b/Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.vct deleted file mode 100644 index 02552391c53de5c4fb1fe9c83b5ae988fc463b67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282870 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 diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.vcx b/Installed Files/Source/Procs_For_Thor/thor_proc_scopeprocessor.vcx deleted file mode 100644 index f12ee7e63d9c5d8622316bfa8aa03c17422839a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14113 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 diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_setlibrary.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_setlibrary.prg deleted file mode 100644 index b46ad48b..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_setlibrary.prg +++ /dev/null @@ -1,24 +0,0 @@ -Lparameters tcLibrary - -Local lcFileUrl, lcLocalFilename, lcToolFolder, lcUrlFolder, llReturn - -lcToolFolder = Execscript (_Screen.cThorDispatcher, 'Tool Folder=') -lcLocalFilename = lcToolFolder + tcLibrary -lcUrlFolder = 'http://foxpro.mattslay.com/Common/' -lcFileUrl = lcUrlFolder + tcLibrary -llReturn = .t. - -*-- Download the file if it is not present... -If !File(lcLocalFilename) - llReturn = Execscript (_Screen.cThorDispatcher, 'Thor_Proc_DownloadFileFromURL', lcFileUrl, lcLocalFilename) -EndIf - -If llReturn and File(lcLocalFilename) - Set Library To (lcLocalFilename) Additive -Else - llReturn = .f. -Endif - -Execscript (_Screen.cThorDispatcher, 'Result=', llReturn) -Return llReturn - \ No newline at end of file diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_updatewaitwindow.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_updatewaitwindow.prg deleted file mode 100644 index 98bc452c..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_updatewaitwindow.prg +++ /dev/null @@ -1,3 +0,0 @@ -Lparameters lcText, lxParam2, lxParam3, lxParam4 - -Wait Window (lcText) at 20, 30 Nowait \ No newline at end of file diff --git a/Installed Files/Source/Procs_For_Thor/thor_proc_writetocfulog.prg b/Installed Files/Source/Procs_For_Thor/thor_proc_writetocfulog.prg deleted file mode 100644 index a6aee99d..00000000 --- a/Installed Files/Source/Procs_For_Thor/thor_proc_writetocfulog.prg +++ /dev/null @@ -1,46 +0,0 @@ -#Define CR Chr[13] -#Define LF Chr(10) -#Define cnIndent Space(30) - -Lparameters lcText, llDivider, lnOffset - -Local laStax[1], lcLine, lcLogtext, lcPRG, lcPrefix, lcProcedure, lcSuffix, lnLine, lnRow, lnStax -lnStax = Astackinfo (laStax) - -If Evl (lcText, '' ) == 'Begin CFU' Or Not Pemstatus (_Screen, 'cThorLogForCFU', 5) - _Screen.AddProperty ('cThorLogForCFU', Addbs (Sys(2023)) + 'Thor_CFU_Log_' + Ttoc(Datetime(),1) + '.txt') -Endif - -Do Case - Case llDivider - lcLine = '*===== ' + lcText + ' ' - Strtofile (CR + LF + Padr (lcLine, 150, '=') + CR + LF, _Screen.cThorLogForCFU, 1) - - Case lnStax > (3 + Evl(lnOffset, 0)) - lnRow = lnStax - (3 + Evl(lnOffset, 0)) - - *!* * Removed 6/5/2012 / JRN - *!* lcProcedure = laStax[lnRow, 3] - *!* lcPRG = laStax[lnRow, 4] - *!* lnLine = laStax[lnRow, 5] - *!* lcPrefix = Time() - *!* lcSuffix = Iif ( ; - *!* lcProcedure # Juststem (Justfname (lcPRG)), ; - *!* ' ' + lcProcedure + ' in', ; - *!* '') ; - *!* + ' ' + Justfname (lcPRG) ; - *!* + ', line ' + Transform (lnLine) - - lcPRG = laStax[lnRow, 4] - lnLine = laStax[lnRow, 5] - lcPrefix = Time() - lcSuffix = ' ' + Justfname (lcPRG) + ', line ' + Transform (lnLine) - - If Empty (lcText) - lcLogtext = lcPrefix + ' ' + lcSuffix - Else - lcLogtext = lcPrefix + ' ' + lcText + CR + LF + cnIndent + lcSuffix - Endif - - Strtofile (lcLogtext + CR + LF, _Screen.cThorLogForCFU, 1) -Endcase diff --git a/Installed Files/Source/basecontrols.vc2 b/Installed Files/Source/basecontrols.vc2 index 6d37a157..99b0a0c8 100644 --- a/Installed Files/Source/basecontrols.vc2 +++ b/Installed Files/Source/basecontrols.vc2 @@ -424,7 +424,7 @@ DEFINE CLASS baseform AS form set multilocks on set safety off set talk off - sys(3054, 0) + ENDPROC diff --git a/Installed Files/Source/basecontrols.vct b/Installed Files/Source/basecontrols.vct index c1d519625ed7f7e265d2a349d2bd966fe87ef686..cd1c08efb787021bd6d12e402edff291c2f907d7 100644 GIT binary patch delta 385 zcmZqt%=G^pGY131^Lhpb2F8topBN`9a85p;z_OX0scQS={qF3OXYliY@p3LcPL8C+ z;?%VKqTJ2m8$PlziSFL~VN$s8WQi4RlQ%|7Zf0CA&N$h9*}BR1xY-1GI{$t8ufW6z zG`N5VgeMA0NSimY1No{z9L@zKfZ#YcP!32x-~8G79|xoQWOg@IR%V7!28PKYuA3%* zbV;7<;Fhe;!r+sim?F*z((?a53xj7~W{DG&$IjrAT3k|;U-^Y|@+r4H>d6d=aA?9% z$Z(P23By6gkBl1`9D&f7ftm3lkbW|`Q9*q2F?R>!SYZZ+`#`)NXm%11{{pgqh%hkh z2C}n(SWJ|GVFM7K1hN@4ff(c$(ajSl#4=4TeA@+bLAVEzn#UPhzIxuQy7-ZfEaPGch-1!Elr11JPooEh_d<`ZY`7|ash`CJmXXOsDa54x9@Ha6rG%>R< zHZwOdFc5jp00zA~85mfg?Cn4{2rN3lz>sL?< delta 46 zcmeA%IHJpHAjTu9vyrtzbh1Ay_vG_poRcStMoxYD(YTxc@8Sit0eoSKsx#9RPF Cm=0M0 diff --git a/Installed Files/Source/createinternaltools.prg b/Installed Files/Source/createinternaltools.prg deleted file mode 100644 index b237c415..00000000 --- a/Installed Files/Source/createinternaltools.prg +++ /dev/null @@ -1,97 +0,0 @@ -Local laPRGs[1], lcCode, lcCreateGetPROC, lcCreatePRG, lcFileName, lcInstallTool, lcNewProcs, lcPRG -Local lcProcName, lnI - -loPRGList = Createobject('Collection') -AddPrgs(loPRGList, 'Thor_Tool_*.PRG') -AddPrgs(loPRGList, 'Procs_For_Thor\Thor_*.PRG') -* AddPrgs(loPRGList, 'Updates\Thor_*.PRG') - -lcCode = '' -lcNewProcs = '' - -For lnI = 1 To loPRGList.Count - lcPRG = Strtran(Alltrim (loPRGList[lnI]), '.PRG', '', 1, 1, 1) - lcProcName = Substr (lcPRG, 1 + Rat ('\', lcPRG)) - lcFileName = Forceext (lcPRG, 'PRG') - - ********************************************** - TEXT To lcCreatePRG Textmerge Noshow - - InstallTool(Get<> (tcFolder), ; - lcToolsFolder + '<>') - - ENDTEXT - ********************************************** - - lcCode = lcCode + lcCreatePRG + Chr(13) + Chr(10) - - ********************************************** - TEXT To lcCreateGetPROC Textmerge Noshow -Procedure Get<> (tcFolder) - - Local lcCode, lcVersion - lcVersion = ccTHORVERSION - {{TEXT}} To lcCode Noshow Textmerge -{{{{GoGet('<>')}}}} - {{ENDTEXT}} - Return Strtran(lcCode, '*##*', '') - -EndProc - - - ENDTEXT - ********************************************** - - lcCreateGetPROC = Strtran (lcCreateGetPROC, '{{TEXT}}', 'Text') - lcCreateGetPROC = Strtran (lcCreateGetPROC, '{{ENDTEXT}}', 'EndText') - lcCreateGetPROC = Strtran (lcCreateGetPROC, '{{{{', '<<<<') - lcCreateGetPROC = Strtran (lcCreateGetPROC, '}}}}', '>>>>') - - lcNewProcs = lcNewProcs + lcCreateGetPROC - -Endfor - -TEXT To lcInstallTool Textmerge Noshow -EndProc - - -Procedure InstallTool(tcCode, tcFileName) - Erase (tcFileName) - StrToFile (tcCode, tcFileName) - -EndProc - - -ENDTEXT -Return lcCode + lcInstallTool + lcNewProcs - - - - -Procedure GoGet (tcFileName) - Local lcResult, lcText - *!* If '\' $ tcFileName - *!* lcFolder = 'C:\Documents and Settings\Jim\My Documents\Dropbox\Public\Thor Repository\Current\' - *!* lcResult = Filetostr (Forceext (lcFolder + tcFileName, 'PRG')) - *!* Else - lcResult = Filetostr (Forceext (tcFileName, 'PRG')) - lcText = Strextract (lcResult, '.Version', Chr(13), 1, 5) - If Not Empty (lcText) And '.VERSION' == Upper(GetWordNum(lcText, 1)) - lcResult = Stuff (lcResult, At (lcText, lcResult), Len (lcText), ".Version = '<>'" + Chr(13)) - Endif - *!* Endif - Assert Not Empty(lcResult) - Return lcResult -Endproc - - -Procedure AddPrgs (loPRGList, lcTemplate) - Local laFiles[1], lcPrefix, lnFileCount, lnI - lcPrefix = Left(lcTemplate, At('\', lcTemplate)) - lnFileCount = Adir(laFiles, lcTemplate,'',1) - For lnI = 1 To lnFileCount - loPRGList.Add(lcPrefix + laFiles[lnI,1]) - Endfor -Endproc - - diff --git a/Installed Files/Source/createrunthorprg.PRG b/Installed Files/Source/createrunthorprg.PRG index 7e4ac744..9b14e56a 100644 --- a/Installed Files/Source/createrunthorprg.PRG +++ b/Installed Files/Source/createrunthorprg.PRG @@ -1,63 +1,68 @@ -* Create the RunThor.PRG - -Lparameters tcFolder - -Local lcFolder, lcRunThor, loException - -lcRunThor = GetPRGText(m.tcFolder) -lcFolder = m.tcFolder + 'Thor\' - -Try - Erase (m.lcFolder + 'RunThor.PRG') -Catch To m.loException -Endtry - -Try - Strtofile (m.lcRunThor, m.lcFolder + 'RunThor.PRG') -Catch To m.loException -Endtry - -Return - - - -Procedure GetPRGText(tcFolder) - Text To m.lcRunThor Noshow Textmerge -Lparameters tnInterval, tlInstallAllUpdates - -Local lcFolder, lcTableName -lcFolder = '<>' - -If Not Empty (tnInterval) And 'N' = VarType (tnInterval) And tnInterval > 0 - lcTableName = m.lcFolder + 'Thor\Tables\LastCheckForUpdatesDate.DBF' - Select 0 - If File (lcTableName) - Use (lcTableName) - Else - Create Table (lcTableName) Free (LastDate D) - Endif - - If Reccount() = 0 - Append Blank - Endif - - Goto Top - If Date() >= LastDate + tnInterval - Replace LastDate With Date() - Use - - Do m.lcFolder + 'Thor.APP' With 'Run', .T. && installs Thor, but without startups - - Execscript (_Screen.cThorDispatcher, 'Thor_Tool_Thor_CheckForUpdates', tlInstallAllUpdates) - Else - Use - Endif - -Endif - -Do m.lcFolder + 'Thor.APP' With 'Run', .F. && normal installation of Thor (with startups) - - Endtext - - Return m.lcRunThor -Endproc +* Create the RunThor.PRG + +#Include ThorVersion.h + +Lparameters tcFolder + +Local lcFolder, lcRunThor, loException + +lcRunThor = GetPRGText(m.tcFolder) +lcFolder = m.tcFolder + 'Thor\' + +Try + Erase (m.lcFolder + 'RunThor.PRG') +Catch To m.loException +Endtry + +Try + Strtofile (m.lcRunThor, m.lcFolder + 'RunThor.PRG') +Catch To m.loException +Endtry + +Return + + + +Procedure GetPRGText(tcFolder) + Text To m.lcRunThor Noshow Textmerge +Lparameters tnInterval, tlInstallAllUpdates + +* <> + +Local lcFolder, lcTableName +lcFolder = '<>' + +If Not Empty (tnInterval) And 'N' = VarType (tnInterval) And tnInterval > 0 + lcTableName = m.lcFolder + 'Thor\Tables\LastCheckForUpdatesDate.DBF' + Select 0 + If File (lcTableName) + Use (lcTableName) + Else + Create Table (lcTableName) Free (LastDate D) + Endif + + If Reccount() = 0 + Append Blank + Endif + + Goto Top + If Date() >= LastDate + tnInterval + Replace LastDate With Date() + Use + + Do m.lcFolder + 'Thor.APP' With 'Run', .T. && installs Thor, but without startups + + Execscript (_Screen.cThorDispatcher, 'Thor_Tool_Thor_CheckForUpdates', tlInstallAllUpdates) + Else + Use + Endif + +Endif + +lcFolder = '<>' +Do m.lcFolder + 'Thor.APP' With 'Run', .F. && normal installation of Thor (with startups) + + Endtext + + Return m.lcRunThor +Endproc diff --git a/Installed Files/Source/insertprgtextfromtemplatefiles.prg b/Installed Files/Source/insertprgtextfromtemplatefiles.prg deleted file mode 100644 index 63c166af..00000000 --- a/Installed Files/Source/insertprgtextfromtemplatefiles.prg +++ /dev/null @@ -1,18 +0,0 @@ -Lparameters lcFromPRG, lcToPRG - -Local lcNewText, lcSourceCode, lcText - -lcSourceCode = Filetostr (Forceext (lcFromPRG, 'PRG')) -Do While .T. - lcText = Strextract (lcSourceCode, '<<<<', '>>>>', 1, 4) - If Empty (lcText) - Exit - Endif - lcNewText = Evaluate (Substr (lcText, 5, Len (lcText) - 8)) - lcSourceCode = Stuff (lcSourceCode, At (lcText, lcSourceCode), Len (lcText), lcNewText) -Enddo && while .T. - -lcSourceCode = Strtran (lcSourceCode, 'Procs_For_Thor', 'Procs') -StrTofile (lcSourceCode, Forceext (lcToPRG, 'PRG')) - - diff --git a/Installed Files/Source/thor_utils.vc2 b/Installed Files/Source/thor_utils.vc2 index 7eae2ff9..0932ba84 100644 --- a/Installed Files/Source/thor_utils.vc2 +++ b/Installed Files/Source/thor_utils.vc2 @@ -618,6 +618,7 @@ DEFINE CLASS thorinfo AS custom *p: fullfilename *p: internalsort *p: link && A link to a Web page for the tool + *p: menumarkexpression *p: onkeylabelonly *p: optionclasses && The name of the main APP file, without the path (e.g., GoFish4.App) *p: optiontool @@ -661,6 +662,7 @@ DEFINE CLASS thorinfo AS custom fullfilename = internalsort = link = + menumarkexpression = Name = "thorinfo" onkeylabelonly = .F. optionclasses = @@ -731,6 +733,7 @@ DEFINE CLASS thorinfo AS custom + * diff --git a/Installed Files/Source/thor_utils.vct b/Installed Files/Source/thor_utils.vct index cd752ffb542bb8693d010192271dff65fdd2b76a..8c36f93694239ec984814d8f68adc6d654bb103f 100644 GIT binary patch delta 256 zcmaF9hqB# zN^=v7vQvRdQj3c-^Yb>J4&-Ls9C3!9b@TiJ4VKN$NlAR0Z!M_P-h8}7Sci!}dh?AS zeI{meW6Q|_iqe}^L%q2sPvH>M$23VvAtkf8ASbcXR>>D=jW5s|SA;b=@sUhete<=! GQ33!Eep-(J delta 94 zcmV-k0HOc6qXXxn0|)>B(Psbv00FTP@&S<`38Mo7N&*JUvrSCM1+ytq2>}8R0JC1g zF9HKLH!-u2#AXV!I?q)Clcv!Vldc|XvuRvn4zovCA_TKZmJ=+q%W8frvocc;1*AkD A=Kufz diff --git a/Installed Files/Source/thor_utils.vcx b/Installed Files/Source/thor_utils.vcx index 3cf8d74f5588e59e6e71952d625a7d444d18a3c1..e99d208c9d7004c46dfdd4c07d482e9150ef7eb8 100644 GIT binary patch delta 92 zcmcc1f0v)dK%9qfBg;A#CY|8PTUc%|IYvzGW4*zY95XqCZ6mvdrI~?=k;P;Mb`hnp lLkwWxJdJ_jXcmMGBAJ;P7zBXW)n{@Tdot5s@5zkJN&sH06yX2> delta 92 zcmcc1f0v)dK%AR@Bg;A#rl2#Ex3Jt`nqM%vkM#zVZPMfnwvFt@re?+#7ABJw*hQ2s m1TlcY!4d|BD+?fO5XsEUz#ss`f4wJ%u_rU#NSw^btONkaP!}lx diff --git a/Installed Files/Source/thorversion.h b/Installed Files/Source/thorversion.h index 9025338d..fe698e81 100644 --- a/Installed Files/Source/thorversion.h +++ b/Installed Files/Source/thorversion.h @@ -1,5 +1,5 @@ -#Define cnVersion 1.46.16 -#Define cdVersionDate December 5, 2023 -#Define ccThorInternalVERSION 'Thor - 1.46.16 - December 5, 2023- 20231205' -#Define ccThorVERSION [Thor - 1.46.16 - December 5, 2023] +#Define cnVersion 1.46.17 +#Define cdVersionDate December 16, 2023 +#Define ccThorInternalVERSION 'Thor - 1.46.17 - December 16, 2023- 20231216' +#Define ccThorVERSION [Thor - 1.46.17 - December 16, 2023] #Define ccThorVERSIONFILE [ThorVersion.txt] \ No newline at end of file diff --git a/Installed Files/Thor/Tools/Procs/checkforupdates.sc2 b/Installed Files/Thor/Tools/Procs/checkforupdates.sc2 index a0e13c8f..af005160 100644 --- a/Installed Files/Thor/Tools/Procs/checkforupdates.sc2 +++ b/Installed Files/Thor/Tools/Procs/checkforupdates.sc2 @@ -252,7 +252,7 @@ DEFINE CLASS form1 AS form *< END OBJECT: BaseClass="textbox" /> ADD OBJECT 'Grid1.Column3.Header1' AS header WITH ; - Caption = "Version", ; + Caption = "Available Version", ; Name = "Header1" *< END OBJECT: BaseClass="header" /> @@ -609,6 +609,8 @@ DEFINE CLASS form1 AS form Set Filter To In crsr_ThorUpdates Endif + Goto top In crsr_ThorUpdates + Return m.llHideNeverUsed ENDPROC @@ -627,11 +629,16 @@ DEFINE CLASS form1 AS form Local lcIndexFile - Delete Tag all + If Empty(m.lcField) + lcField = 'crsr_ThorUpdates.SortKey' + Endif + + Delete Tag All lcIndexFile = Sys(2023) + '\_SB_Temp' + Sys(2015) Index On &lcField Tag Tag - Goto top + Goto Top + Thisform.Refresh() ENDPROC @@ -718,10 +725,18 @@ DEFINE CLASS form1 AS form ENDPROC + PROCEDURE Grid1.Column2.Header1.Click + Thisform.SortColumn('crsr_ThorUpdates.ProjectType') + ENDPROC + PROCEDURE Grid1.Column2.Text1.When Return .f. ENDPROC + PROCEDURE Grid1.Column3.Header1.Click + Thisform.SortColumn() + ENDPROC + PROCEDURE Grid1.Column4.Header1.Click Thisform.SortColumn('crsr_ThorUpdates.SortKey') ENDPROC @@ -737,7 +752,7 @@ DEFINE CLASS form1 AS form ENDPROC PROCEDURE Grid1.Column6.Header1.Click - Thisform.SortColumn('crsr_ThorUpdates.UpdateNow Desc') + Thisform.SortColumn('IIF(crsr_ThorUpdates.UpdateNow, "A", "B") + crsr_ThorUpdates.SortKey') ENDPROC PROCEDURE Grid1.Column7.checkbox.Valid @@ -757,10 +772,14 @@ DEFINE CLASS form1 AS form Thisform.SortColumn('crsr_ThorUpdates.NeverUpdate Desc') ENDPROC + PROCEDURE Grid1.Column9.Header1.Click + Thisform.SortColumn() + ENDPROC + PROCEDURE Grid1.Init This.SetAll('DynamicFontBold', 'crsr_ThorUpdates.UpdateNow', 'Column') This.SetAll('DynamicFontItalic', 'crsr_ThorUpdates.FromMyUpdates', 'Column') - This.SetAll('DynamicBackColor', 'ICase(crsr_ThorUpdates.SortKey="A", Rgb(255,255,0), crsr_ThorUpdates.SortKey="Z", Rgb(192,192,192), crsr_ThorUpdates.SortKey="B", Rgb(165, 203, 247), crsr_ThorUpdates.SortKey="D", Rgb(196, 240, 208), Rgb(255,255,255))', 'Column') + This.SetAll('DynamicBackColor', 'ICase(crsr_ThorUpdates.SortKey="A", Rgb(255,255,0), crsr_ThorUpdates.NeverUpdate, Rgb(192,192,192), crsr_ThorUpdates.SortKey="B", Rgb(165, 203, 247), crsr_ThorUpdates.SortKey="D", Rgb(196, 240, 208), Rgb(255,255,255))', 'Column') ENDPROC diff --git a/Installed Files/Thor/Tools/Procs/checkforupdates.sct b/Installed Files/Thor/Tools/Procs/checkforupdates.sct index 7e029aaf23d53dbace3c0dbfaeb2861d8e7b0921..ccf9b55dde07bd3967bcb14cb4af5c89c60a63e0 100644 GIT binary patch delta 1081 zcmc(cO-vI}5Xa}OEn8X^T0kuYWK*mb3n&Sq959q_tAOFl0v?E3=>pY-t+0xm491Hl zM&KQci6|cQpa!E$Vmz2YqKS#o1UYz6V>BL2)I^P>F@@qhK6)}{ zH{|&z!UOcz0|1@fpL1WF<WGHstOtRXPI^ zSqT>j=G0XyR?#0jv*<{TDMv8-`@)ef!7P|1S&=na42HTzucFX*8STcP8Wqg?F6%bV zv{%(sQB$MTQc$4xWDW~9!JGKGByt2{+yc|6&7K?kh=AZi6&sW;9da2~HVjbP7ttn-E2|V}?NiiH_>g(+^gxd~ zc$KOiS4Jjj=DctgYPea_46o?8C!dVbN1lg=Crkhpm|#auqyL84`_Q{l7QEgEyjlo- zC29eEa3jEJ^kLKq^tVwj(RZVsqOZq7bLgQ6*ID$DibjqZI#O|7 zAE=C^kVcx<>Y(47^Gloh)njs}795JoTXBy528qpFV3%R-|C$^Gt3Ees%gN1s%MREa zPNG;`K&?ZaqakmWc{>!tl?7is59rK}Jla%OPG;zmKQ~>%Pgv?Q;~X9K9n>AwuMK2y z6(-G4TN`lGJAOxcvFP+V@loR}5D;dZDkJ^BTtjj&ubxlaz6!bkJvYK6*_u=@$d-CQ`OaYjOUiT`!V+Q&?t- z@!6Z#_}Xxb#c>qllNldx1%dIgK5?_a2)5u^l3;4NPtL{;vcAk0ifR$HPprc3oC-yh T&{0LE(+!*d57U>XUwMB373B@K delta 548 zcmX^8gz^4uMh*ss-1`g+42&BEKQT^J;GCQg&a#=E=@l!F_=kWXe`i;h&>&ZZ$%1+! zn*}-cvh%y7=A@RSDug7aDLy(!#{S0b>A5oCa+iO zXJndeul#kht;$?>yDlb>p8x;Z8C+6}ON#OGE1^qAv`vQ(7c@d#1v_; zCIA1kFa&4hmq$*P&{5@VVsK)*$Qa0Qak7t&?Br~nZShe+&zk`?iUM&JklhZ{)VGEaxjQ+0IvZ^J$NGj?ET9vlxZdof8X6GV}8kY!#Hk XQj3a#%*llgGLvsO+HDRG{UQSZgGrT* diff --git a/Installed Files/Thor/Tools/Procs/checkforupdates.scx b/Installed Files/Thor/Tools/Procs/checkforupdates.scx index 7a87bd09c64d9835229c364dd6fe10fd848bb808..a47d3192120f3df181ac39d4734e792e367c19e2 100644 GIT binary patch literal 4303 zcmeHKUuYaf9G=!-tJtDeh*(mtRgsF-nccme-PYJ#ZZ~(A+qq5dHkUt5jUimIXtfoz zh#-pi4_~Sl5k#~g6cqeZeG#GHgY=<_?So>Wr9Ma%1@%Rrg!;|SB)Q9OuD3q>gKxg! z_s#yk+u7ZjIof~S#w~=9^?e7>cE;MP2pJ0s(MVVqP>O5NtnVB`CTf-O3BTe={Teja zuF#{3@EcJkY_Al9G|QAoQ!@C_*<;=Am;nvlBR@as+A!*3TA3|dV`5g{M)YPt!1yo+u@pXj1v zZp3sK-G;umi_W3XchMc_trUF%w~w?8u^-LK``Zvp|2Mf}CmM`W6w zwO1aUo2=BlaI%q`Grb0*rD@w>)V2+aQp3Gj7q|yJqWgQh6g{c6Q>%C)?WsZv|OcLBSArp|pJ`Q9v6ge1+T88c1SSC9{8?lUS z25h;UAufVHy-)RfZIfm*@iQ}BD{o&tq{`d`-Ucur0A#!{M92joOC-!}DyNZC>RQfO zx#%K(1pfj21N0B8+$HcPxie*mq#52u`OFMT>1kc;9QbG8Z{P+`RTtoQb-!1?q#0gB zZZpR)I6tB{mUqA(0$%{%>s+q}?cO!7R%*R@1M(ZP3qk;Zxx6fS-WNI=8b)$Wb6mB+Wv3XNH3vhQ2(hO1%j_4txfD zt8-aQ7RN4|nZ8GTmx~f!5Qkc}WwG5;YFGr`4?G3Dq;orQWAzoL-9Vso#vIm5AWO8F`DI!% ztjJM2HKUAw^nfaL68sHt0r(Y=adw`N-xpNB*S5`U#9@V*auLgwJQheZa~~m9U>|T8 zco8@X{MT4Ev+H#_S`BAB{md|p&4*Ok1@J-OY2X!|vmPeo$phJJ+s&G^T=mAAas@G* tyy=<)kE&ujz=J>)n9{j(;3p1dG+X>*vG`B4{hvizsf&lwvc2VQ`4<2;pD_Rc literal 4303 zcmeHKU1(fI7#(B4Xj=qDD%P5a2o-9bxp(&d7;C!Odz1Z}y~*xP(j<)`rm>_=geam= zP!aXPC#m9#pol*Y`cy#_1WTc|^`#n0eNam+@u8%7u!x8e!81Fv-QC=q&2IG356+z7 zJ9EFYGkbq#==QDc_Ygul+UL>MN862r4CIqxUr-cKQa7OKs2@Ux3YoznKjTULW;C~~ z(Zh`JOJPzB5K_23Mo;CFrINZv>;$*3xxTFDgA~%@-Wa_%S@Lxaaes^+^kxf5;mfMx zff#)tS@a8`l!)nelg7WB_de79{Q=!#{!5%j4u2z9eCv#3O7c_?@I-q`h9!L zdi@Fn`LYIuh-BRLdEbyCqCCs`s|hLkCBHcAd-&}lgF)-*C?e#ayq<1CA8ep==tB*3 ztc@6Lpj*%<8t69ksRp_OeI`a9!t{}rA!gC6o!_>y^ncTp3WUIu&{dj#YG&riuDWPx zdD=D}-8GUac)>`iYtr;ejP{RO2BVf`a7qpLPF>(3aG&l^G${I&*3PUmCTeCfZaF43 zxMO~&FZv05MfZQ#eDx+mmO7)exx71?t7M{PT$&k9!ldRg`GP^b1O6EJ95|(O3wS_Y z$4%Z!tT79F6Z;uYFwi;CZJle)Mvacl%%WAZ3%c+x;NN6_ zA0ayc8O!?!*)CtoEkx7|ccc8z3`*&@y4XeVRbUmkqgPcQ1b?9W&H6>nIHR`39K*2f zH{~}K@jm!d-~{l4&MBp}Hfm<;yU{hAQBM^+1bzm18F*Lcmci-^*t}uA8FO=m9A;)a zHnq9g-KPrWz~jIX;8mUL>?dRjXeDaQ@F8`RBgIVFEMYn(+nZLUvfvTmAn=0DwPI2k zTVp2QjbX3lR+sUDF1!T3Cj0oL?~tE$#2omn?yJnkZM~UX#(ZTNnSC;=3M_&z1J{79 zIh8vG{xZL@LG6edGvB9$R6i?XW;DSK#_fTE8u}P`4mb+DrE|4Kn(ar;N_Y|54rd7? zaZwju0sjSb1cclNY&Po5m`S~m$>)r6m)rI?y72elCE!;`uOX<%CCHmn>oplW9N9`#*Y^y3C` zD7QFg=XK#L;J<-eaU8i@9ZASJ@Ikq+ZXu#(>GG}ba>}gZ!>ZD0@Q=U>@TbnbH$sTN zzXc}@tued4m6Okz%Z-HdiQMrcz5ss>oCki^xzl5WuyLg~+t!%*Y1(h_(2+NYO&Mi& z>VPU!1Wy4A!1FpcgQLYulg-+waW!Ur4oi-uQ}T7C&CW~_atT-kwmgoPFt7{QY*fvx zVv%NZ!I-E2Gc4os6RPYV;Pyj=+y-<4GR}gx&8mL0ZLQfbP3OG9;mRh}HIE-wWln+@ mflI)O&dnde0e`Mp8#V6w!J={!tvy-9m3n$UF56u0u73bErKI)% diff --git a/Installed Files/Thor/Tools/Procs/thor.ico b/Installed Files/Thor/Tools/Procs/thor.ico new file mode 100644 index 0000000000000000000000000000000000000000..3cf6f2ae816614b41c485532bcc4d19185a750e7 GIT binary patch literal 2238 zcmchXzit~x5Qm3I0JDms=3E&zR0WVzc(6&(^NL=Z)f=#W4m zf`pa$r-lRy0oa&)YN?^JMid*dvZ}@ETAHSjge~hv0#>kA5ua*FP$qP&ROpIc5)UN= z#-ivEJrEBH0VFi+j4s53LI44?ihL^asmLdhPendStU<36`6Man2drSNLQjeM5RZ+C z_&3BWE0@G$6{4bJEhh3okHkX+4naPiNs>395P(9HkCG1xC`2pCN2w24H>D&fAuwh` zv4mcsV-+HOk{}=S5*=G&16Gvy$ofI0!YVd^gpz!`DxL|t5Dx-oQ5r~4LIha_>JzCC zS%X3VL9+@y1?m$;Ap$Q$tVCCItYQNQeT(P;9jn-gl}CPC{0(_kJd+@gfJFW3`Ze_{ z>DSM%8u{?$HFJIZYWOwaKBEJ#(q9|($*;pp&j5X0J}(vZ$tCdP`qBItp0cM$ee$-x zg)iq*b7fo>IfLKfS2%_-`~csO?^h!d>|EPVTwwQsw**S3$>2c5lkY&w1Wv7a0EV_zQQT+jZr zJIBNjKRLIzIqJqav)D*Z?mOkCJ+&a75oju*%<>BkoHhSka`;ap{E3b-1t5- zoyq^4^FJ&3PvBoXUJ>&foQm8z7uotC^2A<|KU|5t^zlOEzWY3e*e{%)Pw%{&oNxWH SWp;kwZ1IFLzcjn*j`7Y&4-0|tL_rDZ<;g%38B~GTLjXts0T)oN zA4tF1yh$OHm+{TyLVcahYxG?hCmZNHY-ZQfWSsoLpi+8Il+h;qVAkAkz(&M+^@c92ra)92p-@&Nq^0G@k5l zEIRpwQHcI!Q3i&|KvQag_#=?5BF4b53CL~$VtXLlOoD-78<5SQ3B-qmCI{L{ZcZ_t G%m)D6r%TfS delta 340 zcmcc7%=o>Tk%NK3@jC+p1LH=)PmB{4I5#shiLx>JZh1XmVo7#o_TQ)f3QRy2!xbSAo+v0GEo=ZZoIw?c z!v%l@5J&^%CIIQ*o0lkr@@`(GugN$$OW%R<_vBx?I(+;LGygdMWO>K^gOMTj?`Bm! zSH{Vg4JuVV^D;~FctQIA|7T}#Ni8lZ%CDTx2N7Ul@X1e1xz0Da(C~?4AwvSb_-)Oa}xv8$^Tgt#G(`!Fo2!$WJYGG$p!3!lM`5ZMEOl1 zDx`t5IuM%xvFGGQ)(EjB<`9`pK>7d>p9kVk=0MF>V9i!+JYt3x5G4*k+8>BxfVkcQ zrbNj#($K)d(A2;T=q7$kh*DV~tqsIhKpbm{P#OhMYHna|v;eAfJ&@i9#HWGy9ZadL zSiTj+q*@@|4aBp6c&`=IB%#Ug*}293LzVDZGcd>ku@(^fT0@oaO^)E;7rO@(0)aO` z`WFy$+5p{U16OjCgI_5VCSc5`zBBSSN@$^Tgt#4;2ZFhH#FWJYGG$p!3!lM`5ZMD9uqzXM`H3!r8zux2YZ9