├── .gitattributes ├── .github ├── CONTRIBUTING.md └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── Addins ├── AddPackToShortcutMenu.prg ├── AddWLCProjectBuilderButton.prg ├── EditViewWithViewEditorPro.prg ├── Functions │ └── PackFile.prg ├── GetAddinsOnActivate.prg ├── PackFilesAfterCleanup.prg ├── RunMainProgram.prg ├── SetCurDirOnProjectOpen.prg ├── SetFont.prg ├── SetVersionNumber.prg ├── TestBeforeLoadTreeView.prg ├── TestBeforeSaveProjectItem.prg ├── TestRunItem.prg ├── addcmdwindow.prg ├── addipsqsearchtotoolbar.prg ├── addwlchackcxtoshortcutmenu.prg ├── folder.png └── template.txt ├── BuildProcess ├── InstalledFiles.txt ├── ProjectSettings.txt ├── Thor_Update_ProjectExplorer.prg ├── VersionTemplate.txt └── buildme.PRG ├── ChangeLog.md ├── ProjectExplorer.pdf ├── ProjectExplorer.pj2 ├── ProjectExplorer.pjt ├── ProjectExplorer.pjx ├── README.md ├── Source ├── ChangeFileName.prg ├── CopyProperties.prg ├── ExecuteFile.prg ├── GetAssociation.prg ├── GetChecksum.prg ├── GetRelativePath.prg ├── GetTimestampFromDateTime.prg ├── GetVFPBinaryOtherFile.prg ├── Images │ ├── ProjectExplorer.ico │ ├── projectexploreractivedoc.ico │ ├── projectexploreradd.bmp │ ├── projectexploreradd.msk │ ├── projectexploreradded.ico │ ├── projectexplorerapplication.ico │ ├── projectexplorerbuildsolution.bmp │ ├── projectexplorerbuildsolution.msk │ ├── projectexplorercategory.ico │ ├── projectexplorercheckbox.ico │ ├── projectexplorerclasslib.ico │ ├── projectexplorerclean.ico │ ├── projectexplorercleanup.bmp │ ├── projectexplorercleanup.msk │ ├── projectexplorercode.ico │ ├── projectexplorercollapse.bmp │ ├── projectexplorercollapse.msk │ ├── projectexplorercollection.ico │ ├── projectexplorercombobox.ico │ ├── projectexplorercommandbutton.ico │ ├── projectexplorercommandgroup.ico │ ├── projectexplorercommit.bmp │ ├── projectexplorercommit.msk │ ├── projectexplorerconnection.ico │ ├── projectexplorercontainer.ico │ ├── projectexplorercontrol.ico │ ├── projectexplorercursor.ico │ ├── projectexplorercursoradapter.ico │ ├── projectexplorercustom.ico │ ├── projectexplorerdatabase.ico │ ├── projectexplorerdataenvironment.ico │ ├── projectexplorereditbox.ico │ ├── projectexplorerexcluded.ico │ ├── projectexplorerexpand.bmp │ ├── projectexplorerexpand.msk │ ├── projectexplorerfetch.bmp │ ├── projectexplorerfield.ico │ ├── projectexplorerfilter.bmp │ ├── projectexplorerfilter.ico │ ├── projectexplorerform.ico │ ├── projectexplorerformset.ico │ ├── projectexplorergoback.bmp │ ├── projectexplorergrid.ico │ ├── projectexplorerhyperlink.ico │ ├── projectexplorerignored.ico │ ├── projectexplorerimage.ico │ ├── projectexplorerindex.ico │ ├── projectexplorerlabel.ico │ ├── projectexplorerlabels.ico │ ├── projectexplorerlibrary.ico │ ├── projectexplorerline.ico │ ├── projectexplorerlistbox.ico │ ├── projectexplorerlocalview.ico │ ├── projectexplorermenu.bmp │ ├── projectexplorermenu.ico │ ├── projectexplorermodified.ico │ ├── projectexplorermodify.bmp │ ├── projectexplorernewfile.bmp │ ├── projectexplorernewfile.msk │ ├── projectexploreroleboundcontrol.ico │ ├── projectexplorerolecontrol.ico │ ├── projectexploreropen.bmp │ ├── projectexploreroptionbutton.ico │ ├── projectexploreroptiongroup.ico │ ├── projectexploreroptions.bmp │ ├── projectexploreroptions.msk │ ├── projectexplorerother.ico │ ├── projectexplorerpage.ico │ ├── projectexplorerpageframe.ico │ ├── projectexplorerproject.ico │ ├── projectexplorerprojecthook.ico │ ├── projectexplorerpush.bmp │ ├── projectexplorerquery.ico │ ├── projectexplorerrefresh.bmp │ ├── projectexplorerrelation.ico │ ├── projectexplorerremoteview.ico │ ├── projectexplorerremove.bmp │ ├── projectexplorerremove.msk │ ├── projectexplorerremoved.ico │ ├── projectexplorerrepobrowser.bmp │ ├── projectexplorerrepobrowser.msk │ ├── projectexplorerreportlistener.ico │ ├── projectexplorerreports.ico │ ├── projectexplorerresolveconflict.bmp │ ├── projectexplorerrevert.bmp │ ├── projectexplorerrevhistory.bmp │ ├── projectexplorerrevhistory.msk │ ├── projectexplorerrun.bmp │ ├── projectexplorerrun.msk │ ├── projectexplorerseparator.ico │ ├── projectexplorershape.ico │ ├── projectexplorersortasc.bmp │ ├── projectexplorersortdesc.bmp │ ├── projectexplorerspinner.ico │ ├── projectexplorerstorepro.ico │ ├── projectexplorertable.ico │ ├── projectexplorertags.ico │ ├── projectexplorertext.ico │ ├── projectexplorertextbox.ico │ ├── projectexplorertimer.ico │ ├── projectexplorertobinary.bmp │ ├── projectexplorertoolbar.ico │ ├── projectexplorertotext.bmp │ ├── projectexplorerunmerged.ico │ ├── projectexplorerunversioned.ico │ ├── projectexplorervisualdiff.bmp │ ├── projectexplorervisualdiff.msk │ ├── projectexplorerxmladapter.ico │ ├── projectexplorerxmlfield.ico │ ├── projectexplorerxmltable.ico │ └── vfpxpoweredby.gif ├── IsVFPBinaryFile.prg ├── ProjectExplorerGetValidName.prg ├── apiapprun.prg ├── bindwinevent.PRG ├── bindwineventapi.prg ├── buildproject.prg ├── categoriessource.cdx ├── categoriessource.db2 ├── categoriessource.dbf ├── closefile.prg ├── evalexpr.prg ├── getdatetimefromtimestamp.prg ├── getproperfilecase.prg ├── messageboxextended.prg ├── projectexplorer.h ├── projectexplorerabout.sc2 ├── projectexplorerabout.sct ├── projectexplorerabout.scx ├── projectexplorerbutton.vc2 ├── projectexplorerbutton.vct ├── projectexplorerbutton.vcx ├── projectexplorercombotree.vc2 ├── projectexplorercombotree.vct ├── projectexplorercombotree.vcx ├── projectexplorercommondialog.vc2 ├── projectexplorercommondialog.vct ├── projectexplorercommondialog.vcx ├── projectexplorerctrls.h ├── projectexplorerctrls.vc2 ├── projectexplorerctrls.vct ├── projectexplorerctrls.vcx ├── projectexplorerengine.vc2 ├── projectexplorerengine.vct ├── projectexplorerengine.vcx ├── projectexplorerexplorer.vc2 ├── projectexplorerexplorer.vct ├── projectexplorerexplorer.vcx ├── projectexplorerfilectrls.vc2 ├── projectexplorerfilectrls.vct ├── projectexplorerfilectrls.vcx ├── projectexplorergetfilename.prg ├── projectexplorergetinput.prg ├── projectexploreritems.vc2 ├── projectexploreritems.vct ├── projectexploreritems.vcx ├── projectexplorerlabelledbox.vc2 ├── projectexplorerlabelledbox.vct ├── projectexplorerlabelledbox.vcx ├── projectexplorerlabelledboxbuilder.prg ├── projectexplorermain.prg ├── projectexplorermenu.vc2 ├── projectexplorermenu.vct ├── projectexplorermenu.vcx ├── projectexplorerpersist.vc2 ├── projectexplorerpersist.vct ├── projectexplorerpersist.vcx ├── projectexplorerregistry.h ├── projectexplorerregistry.vc2 ├── projectexplorerregistry.vct ├── projectexplorerregistry.vcx ├── projectexplorersettingssource.xml ├── projectexplorersplitter.vc2 ├── projectexplorersplitter.vct ├── projectexplorersplitter.vcx ├── projectexplorerstack.vc2 ├── projectexplorerstack.vct ├── projectexplorerstack.vcx ├── projectexplorertreeview.h ├── projectexplorertreeview.vc2 ├── projectexplorertreeview.vct ├── projectexplorertreeview.vcx ├── projectexplorerui.vc2 ├── projectexplorerui.vct ├── projectexplorerui.vcx ├── putprop.prg ├── runcommand.prg ├── tagsource.cdx ├── tagsource.db2 ├── tagsource.dbf ├── twofox.prg ├── unbindwinevents.prg ├── versionnumber.prg └── vfpxwin32eventhandler.prg ├── Tests ├── GitOperationsTests.prg ├── Integration Tests.xlsx ├── MercurialOperationsTests.prg ├── ProjectAddinsTests.prg ├── ProjectExplorerSolutionTests.prg ├── ProjectExplorerTests.prg ├── ProjectItemTests.prg ├── ProjectOperationsTests.prg ├── ProjectSettingsTests.prg ├── TestSourceFiles │ ├── classlib.vct │ ├── classlib.vcx │ ├── data.dbc │ ├── data.dct │ ├── data.dcx │ ├── file.xxx │ ├── form.sct │ ├── form.scx │ ├── freetable.cdx │ ├── freetable.dbf │ ├── freetable.fpt │ ├── image.bmp │ ├── label.lbt │ ├── label.lbx │ ├── menu.mnt │ ├── menu.mnx │ ├── program.prg │ ├── query.qpr │ ├── report.frt │ ├── report.frx │ ├── table.cdx │ ├── table.dbf │ ├── text.txt │ └── vfpcompression.fll └── VersionControlOperationsTests.prg ├── ThorUpdater ├── ProjectExplorer.zip ├── ProjectExplorerVersion.txt └── Thor_Tool_ProjectExplorer.prg ├── projectexplorer.app └── system.app /.gitattributes: -------------------------------------------------------------------------------- 1 | #.gitattributes 2 | # disable newline conversion on checkout with no conversion on check-in for all files 3 | * -text 4 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to contribute to Project Explorer 2 | 3 | ## Report a bug 4 | - Please check [issues](https://github.com/DougHennig/ProjectExplorer/issues) to see if the bug has already been reported. 5 | 6 | - If you're unable to find an open issue addressing the problem, open a new one. Be sure to include a title and clear description, as much relevant information as possible, and a code sample or an executable test case demonstrating the expected behavior that is not occurring. 7 | 8 | ## Fix a bug or add an enhancement 9 | - Fork the project: see this [guide](https://www.dataschool.io/how-to-contribute-on-github/) for setting up and using a fork. 10 | 11 | - Make whatever changes are necessary. 12 | 13 | - If this is a new major release, edit the Version setting in *BuildProcess\ProjectSettings.txt*. 14 | 15 | - If you added or removed files, update *BuildProcess\InstalledFiles.txt* as necessary. 16 | 17 | - Describe the changes at the top of *ChangeLog.md*. 18 | 19 | - If you haven't already done so, install VFPX Deployment: choose Check for Updates from the Thor menu, turn on the checkbox for VFPX Deployment, and click Install. 20 | 21 | - Start VFP 9 (not VFP Advanced) and CD to the Project Explorer folder. 22 | 23 | - Run the VFPX Deployment tool to create the installation files: choose VFPX Project Deployment from the Thor Tools, Application menu. Alternately, execute ```EXECSCRIPT(_screen.cThorDispatcher, 'Thor_Tool_DeployVFPXProject')```. 24 | 25 | - Commit the changes. 26 | 27 | - Push to your fork. 28 | 29 | - Create a pull request; ensure the description clearly describes the problem and solution or the enhancement. 30 | 31 | ---- 32 | Last changed: 2023-01-21 -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## 📝 Provide detailed reproduction steps (if any) 11 | 12 | 1. … 13 | 2. … 14 | 3. … 15 | 16 | ### ✔️ Expected result 17 | 18 | _What is the expected result of the above steps?_ 19 | 20 | ### ❌ Actual result 21 | 22 | _What is the actual result of the above steps?_ 23 | 24 | ## 📷 Screenshots 25 | 26 | _Are there any useful screenshots? WinKey+Shift+S and then just paste them directly into the form_ 27 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## 📝 Provide a description of the new feature 11 | 12 | _What is the expected behavior of the proposed feature? What is the scenario this would be used?_ 13 | 14 | --- 15 | 16 | If you'd like to see this feature implemented, add a 👍 reaction to this post. 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # use glob syntax. 2 | syntax: glob 3 | 4 | # VFP generated files 5 | *.err 6 | *.ERR 7 | *.mpr 8 | *.MPR 9 | 10 | # VFP compiled files 11 | *.fxp 12 | *.FXP 13 | *.mpx 14 | *.MPX 15 | *.qpx 16 | *.QPX 17 | 18 | # VFP backup files 19 | *.bak 20 | *.BAK 21 | *.tbk 22 | *.TBK 23 | 24 | # Misc backup files 25 | *.orig 26 | *.ORIG 27 | *.save 28 | *.SAVE 29 | *.zip 30 | *.ZIP 31 | 32 | # Other files 33 | *.chw 34 | *.suo 35 | *.docstates 36 | 37 | # Folders to exclude 38 | bin/* 39 | obj/* 40 | 41 | # Specific files 42 | *.exe 43 | *.EXE 44 | *.dll 45 | *.DLL 46 | *.app 47 | *.APP 48 | 49 | Source/Hold/* 50 | x.prg 51 | x.PRG 52 | Backup.bat 53 | Tests/FXU*.* 54 | Demo/* 55 | Docs/* 56 | FoxBin2PRG/* 57 | Video/* 58 | projectexplorercategories.* 59 | projectexplorertags.* 60 | Addins/MyAddins/* 61 | 62 | -------------------------------------------------------------------------------- /Addins/AddPackToShortcutMenu.prg: -------------------------------------------------------------------------------- 1 | lparameters toParameter1, ; 2 | tuParameter2, ; 3 | tuParameter3 4 | 5 | * If this is a registration call, tell the addin manager which method we're 6 | * an addin for. 7 | 8 | if pcount() = 1 9 | toParameter1.Method = 'AfterCreateShortcutMenu' 10 | toParameter1.Active = .F. 11 | toParameter1.Name = 'Add Pack to Shortcut Menu' 12 | return 13 | endif 14 | 15 | * This is an addin call, so add "Pack File" as the third item in the shortcut 16 | * menu. 17 | 18 | tuParameter2.AddMenuBar('Pack File', ; 19 | "do (loForm.cMainFolder + 'Addins\Functions\PackFile') with loForm.oItem.Path", ; 20 | "vartype(loForm.oItem) <> 'O' or not loForm.oItem.IsBinary", ; 21 | , ; 22 | 3) 23 | return .T. 24 | -------------------------------------------------------------------------------- /Addins/AddWLCProjectBuilderButton.prg: -------------------------------------------------------------------------------- 1 | * Written by Rick Borup. 2 | 3 | lparameters toParameter1, ; 4 | tuParameter2, ; 5 | tuParameter3 6 | 7 | * If this is a registration call, tell the addin manager which method we're 8 | * an addin for. 9 | 10 | if pcount() = 1 11 | toParameter1.Method = 'OnStartup' 12 | toParameter1.Active = .F. 13 | return 14 | endif 15 | 16 | * Add a button to the toolbar to open the White Light Computing (WLC) Project 17 | * Builder dialog for the active project. 18 | * Requires the WLC Project Hook class library cprojecthook5.vcx (download from 19 | * http://whitelightcomputing.com/prodprojectbuilder.htm) 20 | * To use: 1) Set toParameter1.Active = .T. (above) 21 | * 2) Set the value of WLCProjectBuilderButton.cWLCProjectBuilderClass 22 | * (below) 23 | 24 | loToolbar = toParameter1.oProjectToolbar 25 | try 26 | loToolbar.AddObject('cmdWLCProjectBuilder', 'WLCProjectBuilderButton') 27 | loButton = loToolbar.cmdWLCProjectBuilder 28 | loButton.Height = loToolbar.cmdBack.Height 29 | loButton.Width = 30 30 | loButton.Caption = 'PB' 31 | loButton.ToolTipText = 'Open WLC Project Builder Dialog' 32 | loButton.Visible = .T. 33 | toParameter1.SetToolbarControlLocation(loButton) 34 | llOK = .T. 35 | catch 36 | loToolbar.RemoveObject('cmdWLCProjectBuilder') 37 | llOK = .F. 38 | endtry 39 | return llOK 40 | 41 | define class WLCProjectBuilderButton as CommandButton 42 | 43 | * Set cWLCProjectBuilderClass to the path and file name of the WLC 44 | * cprojecthook5.vcx class library (or your subclass library). 45 | 46 | cWLCProjectBuilderClass = '\Development\Tools\VFP\WLCProjectBuilder\' + ; 47 | 'cProjectHook5.vcx' 48 | oWLCProjectBuilderToolbar = null 49 | 50 | function Init 51 | This.oWLCProjectBuilderToolbar = newobject('tbrProjectTools', ; 52 | This.cWLCProjectBuilderClass) 53 | return vartype( This.oWLCProjectBuilderToolbar) = 'O' and ; 54 | not isnull( This.oWLCProjectBuilderToolbar) 55 | endfunc 56 | 57 | function Click 58 | This.oWLCProjectBuilderToolbar.cmdProjectBuilder.Click() 59 | endfunc 60 | enddefine 61 | -------------------------------------------------------------------------------- /Addins/EditViewWithViewEditorPro.prg: -------------------------------------------------------------------------------- 1 | lparameters toParameter1, ; 2 | tuParameter2, ; 3 | tuParameter3 4 | local llReturn, ; 5 | lcEditor 6 | 7 | * If this is a registration call, tell the addin manager which method we're 8 | * an addin for. 9 | 10 | if pcount() = 1 11 | toParameter1.Method = 'BeforeModifyItem' 12 | toParameter1.Active = .F. 13 | return 14 | endif 15 | 16 | * This is an addin call, so if a view is being modified and if so, whether 17 | * ViewEditor Professional is installed. If so, use it to edit the view. Note 18 | * that we call it modelessly and set the DesignerCaption property of the item 19 | * so Project Explorer is notified when the window is closed. Also note we 20 | * return .F. to indicate we don't want the normal behavior. 21 | 22 | llReturn = .T. 23 | if inlist(toParameter1.Type, 'r', 'l') 24 | lcEditor = _screen.oProjectExplorers.Item(1).oRegistry.GetKey('Software\' + ; 25 | 'WhiteLightComputingTools\ViewEditor\3.0\Options', 'cVePath') 26 | if not empty(lcEditor) and file(lcEditor) 27 | do (lcEditor) with toParameter1.ItemName, toParameter1.ParentPath 28 | toParameter1.DesignerCaption = 'ViewEditor Professional' 29 | llReturn = .F. 30 | endif not empty(lcEditor) ... 31 | endif inlist(toParameter1.Type, 'r', 'l') 32 | return llReturn 33 | -------------------------------------------------------------------------------- /Addins/Functions/PackFile.prg: -------------------------------------------------------------------------------- 1 | lparameters tcFile 2 | local lnSelect 3 | lnSelect = select() 4 | select 0 5 | try 6 | use (tcFile) exclusive 7 | pack 8 | use 9 | messagebox(tcFile + ' was packed.') 10 | catch 11 | messagebox('Cannot open ' + tcFile + ' exclusively.') 12 | endtry 13 | select (lnSelect) 14 | -------------------------------------------------------------------------------- /Addins/GetAddinsOnActivate.prg: -------------------------------------------------------------------------------- 1 | * This addin gets addins when the Project Explorer is activated. 2 | 3 | lparameters toParameter1, ; 4 | tuParameter2, ; 5 | tuParameter3 6 | 7 | * If this is a registration call, tell the addin manager which method we're 8 | * an addin for. 9 | 10 | if pcount() = 1 11 | toParameter1.Method = 'OnActivate' 12 | toParameter1.Active = .F. 13 | return 14 | endif 15 | 16 | * Refresh registered addins. 17 | 18 | toParameter1.oAddins.GetAddins() 19 | -------------------------------------------------------------------------------- /Addins/PackFilesAfterCleanup.prg: -------------------------------------------------------------------------------- 1 | lparameters toParameter1, ; 2 | tuParameter2, ; 3 | tuParameter3 4 | 5 | * If this is a registration call, tell the addin manager which method we're 6 | * an addin for. 7 | 8 | if pcount() = 1 9 | toParameter1.Method = 'AfterCleanupSolution' 10 | toParameter1.Active = .F. 11 | return 12 | endif 13 | 14 | * This is an addin call, so do it. 15 | 16 | lnSelect = select() 17 | select 0 18 | for each loProject in toParameter1.oProjects foxobject 19 | for each loItem in loProject.oProjectItems foxobject 20 | if loItem.IsBinary 21 | try 22 | use (loItem.Path) exclusive 23 | pack 24 | use 25 | catch 26 | endtry 27 | endif loItem.IsBinary 28 | next loItem 29 | next loProject 30 | messagebox('Files packed') 31 | select (lnSelect) 32 | return .T. 33 | -------------------------------------------------------------------------------- /Addins/RunMainProgram.prg: -------------------------------------------------------------------------------- 1 | lparameters toParameter1, ; 2 | tuParameter2, ; 3 | tuParameter3 4 | 5 | * If this is a registration call, tell the addin manager which method we're 6 | * an addin for. 7 | 8 | if pcount() = 1 9 | toParameter1.Method = 'AfterCreateMenu' 10 | toParameter1.Active = .F. 11 | return 12 | endif 13 | 14 | * Add an item to the Project Explorer menu to run the main program for the project. 15 | 16 | tuParameter2.AddMenuBar('R\ Fix 126 | 127 | LOCAL m.commType && 'code', 'form', 'report' && got these from by putting on the debugger and browsing dougs table. SRR 11/10/2020 128 | 129 | * D - Free Tables / Data 130 | * H - Headers 131 | * K - Forms 132 | * L - API Libraries 133 | * M - Menu 134 | * P - Prgs 135 | * R - Reports 136 | * V - Class Libraries (.vcx) 137 | * x - Other file 138 | 139 | DO CASE 140 | CASE LEFT(LOWER(aCmd[2]), 4) = 'comm' 141 | m.commType = 'p' &&'code' 142 | 143 | CASE LEFT(LOWER(aCmd[2]), 4) = 'form' 144 | m.commType = 'k' &&'form' 145 | 146 | CASE LEFT(LOWER(aCmd[2]), 4) = 'repo' 147 | m.commType = 'r' &&'report' 148 | 149 | CASE LEFT(LOWER(aCmd[2]), 4) = 'menu' 150 | m.commType = 'm' && 'menu' 151 | 152 | CASE LOWER(aCmd[1]) = 'do' 153 | * Something like 'Do hold' 154 | m.commType = 'p' &&'code' 155 | IF ALEN(aCmd) < 3 156 | DIMENSION aCmd (3) 157 | aCmd[3] = aCmd[2] 158 | ENDIF 159 | 160 | OTHERWISE 161 | MESSAGEBOX('Invalid/Unsupported command specified!') 162 | this.Value = '' 163 | this.showHint() 164 | this.setFocus() 165 | 166 | RETURN 167 | ENDCASE 168 | 169 | SELECT (ALIAS()) 170 | *LOCATE FOR LOWER(image) = LOWER(m.commtype) AND LOWER(text) = LOWER(ALLTRIM(aCmd[3])) 171 | LOCATE FOR LOWER(type) = LOWER(m.commtype) AND LOWER(text) = LOWER(ALLTRIM(aCmd[3])) 172 | IF !FOUND() 173 | IF LEFT(LOWER(aCmd[3]), 4) = 'hold' ; && we use hold a lot, just run it 174 | OR MESSAGEBOX(aCmd[3] + ICASE(m.commType = 'code', '.prg', m.commType = 'form', '.scx', m.commType = 'report', '.frx', + '.unknown') ; 175 | + " doesn't exist or isn't part of the project." ; 176 | + CHR(13) + 'Would you like to run this command in the command window?', 4, 'Run in command window') = 6 177 | 178 | KEYBOARD '{CTRL+F2}' 179 | KEYBOARD '{CTRL+END}' 180 | KEYBOARD m.cmd 181 | KEYBOARD '{ENTER}' 182 | ENDIF 183 | 184 | this.Value = '' 185 | this.showHint() 186 | this.setFocus() 187 | RETURN 188 | ENDIF 189 | 190 | Thisform.cCurrentNodeID = id 191 | thisform.oItem = Thisform.GetItemForNode(Thisform.cCurrentNodeID) && only needed for the 'run', the edit looks it up but doesn't hurt either way 192 | 193 | * NOTE: Doug puts the command in the command window but he has to do it so he can listen for the editor closing and detect changes to the file. SRR 11/10/2020 194 | IF LOWER(aCmd[1]) = 'do' 195 | thisform.oProjectToolBar.cmdRun.click() 196 | ELSE 197 | thisform.oProjectToolBar.cmdEdit.click() 198 | ENDIF 199 | 200 | 201 | 202 | OTHERWISE 203 | WAIT WINDOW 'Executing command in VFP command window...' NOWAIT 204 | 205 | KEYBOARD '{CTRL+F2}' 206 | KEYBOARD '{CTRL+END}' 207 | KEYBOARD m.cmd 208 | KEYBOARD '{ENTER}' 209 | 210 | WAIT CLEAR 211 | 212 | this.SetFocus() 213 | ENDCASE 214 | 215 | 216 | 217 | this.Value = '' 218 | this.LostFocus() && will show the hint 219 | *this.setFocus() 220 | *KEYBOARD '{CTRL+F3}' 221 | 222 | RETURN 223 | ENDIF && nKeyCode = 13 224 | ENDPROC && keyPress 225 | 226 | 227 | ********************************* 228 | PROCEDURE gotFocus 229 | DODEFAULT() 230 | 231 | * Make sure that the cursor is on the far left. Often times they just 232 | * randomly click in the text box and it goes in the middle and then it formats incorrectly. 233 | * Force it to the far left SRR 04.15.2019 234 | IF this.hintshowing OR EMPTY(this.value) && AND VARTYPE(this.Value) != 'N') 235 | * NOTE: for whatever reason, can't get the 'selStart' property to work right, but issuing the keyboard command works perfectly. 236 | * setting this.selStart only works if we issue nodefault! SRR 04.15.2019 237 | this.SelStart = 0 238 | NODEFAULT 239 | ENDIF 240 | ENDPROC && gotFocus 241 | 242 | PROCEDURE lostFocus 243 | DODEFAULT() 244 | 245 | IF EMPTY(this.Value) AND !this.hintShowing 246 | this.showHint() 247 | ENDIF 248 | ENDPROC && lostFocus 249 | 250 | 251 | ********************************* 252 | PROCEDURE removeHint 253 | * Remove the 'hint' we were displaying 254 | 255 | this.ForeColor = this.origForeColor 256 | this.Value = '' 257 | this.HintShowing = .F. 258 | ENDPROC && removeHint 259 | 260 | 261 | ********************************* 262 | PROCEDURE showHint 263 | * Show the 'hint' in the text box 264 | 265 | IF EMPTY(this.Hint) 266 | RETURN 267 | ENDIF 268 | 269 | this.ForeColor = this.hintForeColor 270 | this.Value = this.Hint 271 | this.HintShowing = .T. 272 | ENDPROC && showHint 273 | 274 | 275 | ********************************* 276 | *SRR* PROCEDURE InteractiveChange 277 | *SRR* IF EMPTY(ALLTRIM(this.Value)) 278 | *SRR* thisform.cItemFilter = '' 279 | *SRR* ELSE 280 | *SRR* thisform.cItemFilter = "'" + LOWER(ALLTRIM(this.Value)) + "' $ LOWER(item.itemName)" 281 | *SRR* ENDIF 282 | *SRR* 283 | *SRR* * To sort by last modified date 284 | *SRR* * thisform.cTreeViewSortExpression = 'LASTMOD' 285 | *SRR* * thisform.lSortTreeViewDescending = .T. 286 | *SRR* 287 | *SRR* thisform.flagTreeViewsForReload() 288 | *SRR* thisform.loadSolution() 289 | *SRR* ENDPROC && InteractiveChange 290 | 291 | ENDDEFINE && txtSortBox 292 | 293 | 294 | 295 | ************************************************************************* 296 | DEFINE CLASS lblClose as Label 297 | 298 | ********************************* 299 | PROCEDURE init 300 | 301 | ENDPROC && init 302 | 303 | 304 | ********************************* 305 | PROCEDURE click 306 | IF !EMPTY(this.Parent.txtSort.value) AND !this.Parent.txtSort.hintShowing 307 | this.Parent.txtSort.value = '' 308 | this.Parent.txtSort.showHint() 309 | ENDIF 310 | ENDPROC && click 311 | ENDDEFINE && lblClose 312 | 313 | 314 | 315 | ************************************************************************* 316 | * Called via Ctrl+F3, set focus to the command window 317 | PROCEDURE setFocusCmdWin 318 | 319 | LOCAL m.x 320 | FOR m.x=1 TO _vfp.Forms.Count 321 | IF !'PROJECTEXPLORER' $ UPPER(_vfp.Forms.Item(m.x).name) 322 | LOOP 323 | ENDIF 324 | 325 | oExplorer = _vfp.Forms.Item(m.x) 326 | 327 | oExplorer.oProjectToolBar.cntcmdwin.txtsort.setFocus() 328 | 329 | EXIT 330 | ENDFOR 331 | 332 | ENDPROC && setFocusCmdWin -------------------------------------------------------------------------------- /Addins/addwlchackcxtoshortcutmenu.prg: -------------------------------------------------------------------------------- 1 | ****************************************************************************************** 2 | * PROGRAM: AddWLCHackCXtoShortcutMenu.prg 3 | * 4 | * AUTHOR: 5 | * Richard A. Schummer, November 2017 6 | * White Light Computing, Inc. 7 | * PO Box 391 8 | * Washington Twp., MI 48094 9 | * raschummer@whitelightcomputing.com 10 | * 11 | * LICENSE FOR VFPX 12 | * 13 | * PROGRAM DESCRIPTION: 14 | * This program is an addin for the VFPX ProjectExplorer written by Doug Hennig. This 15 | * addin adds a new menu option to the ProjectExplorer shortcut menu. It is only enabled 16 | * for Forms and Visual Class Libraries. The code looks for a registry entry created 17 | * by HackCX: 18 | * 19 | * HKEY_CURRENT_USER\Software\WhiteLightComputingTools\HackCX\4.0\Options\Location 20 | * 21 | * If the Registry entry is not set, use HackCX Professional, go to the Configuration page 22 | * and set the location using the ellipse button to locate the HackCX4.EXE on your computer. 23 | * 24 | * If HackCX is not installed, or the registry is not set, the menu option is not 25 | * registered and does not show up in ProjectExplorer. 26 | * 27 | * NOTE: This program does use the Fox Foundation Class (FFC) Registry class. 28 | * 29 | * CALLING SYNTAX: 30 | * Drop this into the ProjectExplorer Addin folder. No need to run it any other way. 31 | * 32 | * INPUT PARAMETERS: 33 | * toParameter1 = a reference to an addin parameter object if only one parameter is 34 | * passed (meaning this is a registration call) or a reference to 35 | * ProjectExplorerForm object. 36 | * tuParameter2 = ProjectExplorerShortcutMenu object 37 | * tuParameter3 = Not used 38 | * 39 | * OUTPUT PARAMETERS: 40 | * None 41 | * 42 | * DATABASES ACCESSED: 43 | * None 44 | * 45 | * GLOBAL PROCEDURES REQUIRED: 46 | * None 47 | * 48 | * CODING STANDARDS: 49 | * Version 5.2 compliant with no exceptions 50 | * 51 | * TEST INFORMATION: 52 | * None 53 | * 54 | * SPECIAL REQUIREMENTS/DEVICES: 55 | * None 56 | * 57 | * FUTURE ENHANCEMENTS: 58 | * None 59 | * 60 | * LANGUAGE/VERSION: 61 | * Visual FoxPro 09.00.0000.7423 or higher 62 | * 63 | ****************************************************************************************** 64 | * C H A N G E L O G 65 | * 66 | * Date Developer Version Description 67 | * ---------- ---------------------- ------- --------------------------------- 68 | * 11/29/2017 Richard A. Schummer 1.0 Created Program 69 | * ---------------------------------------------------------------------------------------- 70 | * 71 | ****************************************************************************************** 72 | LPARAMETERS toParameter1, tuParameter2, tuParameter3 73 | 74 | LOCAL loHackCX, ; 75 | lcHackCXPath, ; 76 | lnMenuItem 77 | 78 | * Localization opportunities 79 | #DEFINE ccMENU_CAPTION "Run HackCX Professional" 80 | #DEFINE ccTOOL_NAME "Add HackCX Professional to Shortcut Menu" 81 | 82 | * Allow you to determine the menu item number. 83 | #DEFINE cnMENU_ITEM_NUMBER 6 84 | 85 | 86 | * If this is a registration call, tell the addin manager which 87 | * method we're an addin for. 88 | IF PCOUNT() = 1 89 | toParameter1.Method = "AfterCreateShortcutMenu" 90 | toParameter1.Active = .F. 91 | toParameter1.Name = ccTOOL_NAME 92 | RETURN 93 | ENDIF 94 | 95 | loHackCX = CREATEOBJECT("cusGetHackCX") 96 | 97 | IF VARTYPE(m.loHackCX) = "O" 98 | lcHackCXPath = ALLTRIM(m.loHackCX.cLocation) 99 | 100 | IF EMPTY(m.lcHackCXPath) 101 | * Registry entry is not set. Use HackCX Professional, go to the configuration page and 102 | * set the location using the ellipse button to locate the HackCX4.EXE on your computer. 103 | ELSE 104 | * This is an addin call, so add "HackCX" as the fifth item in the treeview shortcut menu. 105 | tuParameter2.AddMenuBar(ccMENU_CAPTION, ; 106 | "DO " + m.lcHackCXPath + " with loForm.oItem.Path", ; 107 | "VARTYPE(loForm.oItem) # 'O' or not (INLIST(loForm.oItem.Type, [V], [K]))", ; 108 | , cnMENU_ITEM_NUMBER) 109 | ENDIF 110 | ENDIF 111 | 112 | loHackCX = NULL 113 | RELEASE loHackCX 114 | 115 | RETURN .T. 116 | 117 | 118 | *********************************************************************************************** 119 | * Class: cusGetHackCX 120 | * BaseClass: Custom 121 | * 122 | * This custom class provides the developer the option to hack the SCX or VCX with 123 | * WLC HackCX Professional when the form or class is modified. 124 | * 125 | *********************************************************************************************** 126 | DEFINE CLASS cusGetHackCX AS Custom 127 | 128 | * This property is an object reference to the current Registry object to access the Windows Registry. 129 | oRegistry = .NULL. 130 | * This property contains the base registry key used to store the location of HackCX Professional. 131 | cRegistryKey = "Software\WhiteLightComputingTools\HackCX\" 132 | * This property contains the current major version number. 133 | cVersion = "v4.0" 134 | * This property contains the location (path and EXE) for HackCX Professional. 135 | cLocation = SPACE(0) 136 | 137 | PROCEDURE oRegistry_Access() 138 | * Requires the VFP Registry Fox Foundation Class (FFC). 139 | * You will need to hard code the path to this file if you do not have 140 | * this class available in the FFC folder. 141 | LOCAL lcHomeFFCDirectory 142 | 143 | lcHomeFFCDirectory = HOME()+ "FFC\" 144 | 145 | IF ISNULL(this.oRegistry) 146 | this.oRegistry = NEWOBJECT("registry", lcHomeFFCDirectory + "registry.vcx") 147 | ENDIF 148 | 149 | RETURN this.oRegistry 150 | ENDPROC 151 | 152 | 153 | *-- This method is called to get the base registry key used to store the location of White Light Computing's HackCX Professional. 154 | PROCEDURE GetBaseRegistryKey() 155 | * Registry roots (ripped off from VFP98\ffc\Registry.h) 156 | #DEFINE HKEY_CURRENT_USER -2147483647 && BITSET(0,31)+1 157 | 158 | LOCAL lcMajorVersion, ; && Major version used to build registry key 159 | lcReturnVal, ; && Key returned to calling method 160 | lcNode, ; && Registry Node name 161 | lcVersion, ; && Fully formatted version xx.xx.xx 162 | lcRegistryKey, ; && Main registry key for the tool 163 | llNewKey && Check to see if key is new, used to convert 164 | 165 | lcRegistryKey = this.GetProp("cRegistryKey") 166 | lcVersion = this.GetProp("cVersion") 167 | lcMajorVersion = SUBSTRC(lcVersion, 1, ATC(".", lcVersion)) + "0" 168 | lcMajorVersion = STRTRAN(lcMajorVersion, "v", SPACE(0)) 169 | lcMajorVersion = STRTRAN(lcMajorVersion, "V", SPACE(0)) 170 | lcNode = "Options" 171 | 172 | * Build the base registry key 173 | lcReturnVal = lcRegistryKey + ; 174 | lcMajorVersion + ; 175 | "\" + lcNode + "\" 176 | 177 | * RAS 14-May-2004, Added to convert to the new registry entries 178 | llNewKey = this.oRegistry.IsKey(lcReturnVal,; 179 | HKEY_CURRENT_USER) 180 | 181 | RETURN lcReturnVal 182 | ENDPROC 183 | 184 | 185 | * This method allows developers to access the value of any property (public or protected). 186 | PROCEDURE GetProp() 187 | LPARAMETERS tcProperty 188 | RETURN EVAL("this." + tcProperty) 189 | ENDPROC 190 | 191 | 192 | PROCEDURE cLocation_Access() 193 | * Registry roots (ripped off from VFP98\ffc\Registry.h) 194 | #DEFINE HKEY_CLASSES_ROOT -2147483648 && BITSET(0,31) 195 | #DEFINE HKEY_CURRENT_USER -2147483647 && BITSET(0,31)+1 196 | #DEFINE HKEY_LOCAL_MACHINE -2147483646 && BITSET(0,31)+2 197 | #DEFINE HKEY_USERS -2147483645 && BITSET(0,31)+3 198 | 199 | LOCAL lcLocation, ; 200 | lcToolKey 201 | 202 | IF NOT ISNULL(this.oRegistry) 203 | lcToolKey = this.GetBaseRegistryKey() 204 | lcLocation = SPACE(0) 205 | 206 | this.oRegistry.GetRegKey("Location", ; 207 | @lcLocation,; 208 | lcToolKey,; 209 | HKEY_CURRENT_USER) 210 | this.cLocation = lcLocation 211 | ENDIF 212 | 213 | RETURN this.cLocation 214 | ENDPROC 215 | 216 | 217 | PROCEDURE Destroy() 218 | this.oRegistry = .NULL. 219 | RETURN 220 | ENDPROC 221 | 222 | ENDDEFINE 223 | 224 | 225 | *: EOF :* -------------------------------------------------------------------------------- /Addins/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Addins/folder.png -------------------------------------------------------------------------------- /Addins/template.txt: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Program: *** PUT NAME HERE 3 | * Purpose: *** PUT TEMPLATE PURPOSE HERE 4 | * Author: *** PUT AUTHOR NAME HERE 5 | * Last Revision: *** PUT LAST REVISION DATE HERE 6 | * Parameters: toParameter1 - a reference to an addin parameter object if 7 | * only one parameter is passed (meaning this is a 8 | * registration call) or a reference to an object; see the 9 | * documentation for the type of object passed for each 10 | * method 11 | * tuParameter2 - see the documentation for what's passed for 12 | * each method 13 | * tuParameter3 - see the documentation for what's passed for 14 | * each method 15 | * Returns: .T. if the method being hooked should continue to execute 16 | * or .F. if not. You can also return 0 to not continue 17 | * and signal failure, 1 to not continue and signal 18 | * success, or 2 to continue 19 | *============================================================================== 20 | 21 | lparameters toParameter1, ; 22 | tuParameter2, ; 23 | tuParameter3 24 | 25 | * If this is a registration call, tell the addin manager which method we're 26 | * an addin for. 27 | 28 | if pcount() = 1 29 | toParameter1.Method = '*** specify method ***' 30 | toParameter1.Active = .T. && set to .F. to disable addin 31 | toParameter1.Name = '*** specify descriptive name (optional) ***' 32 | toParameter1.Order = 1 && specify order to process (optional) 33 | return 34 | endif 35 | 36 | * This is an addin call, so do it. 37 | 38 | *** put code here 39 | 40 | *** return appropriate value; see notes above 41 | return .T. 42 | -------------------------------------------------------------------------------- /BuildProcess/InstalledFiles.txt: -------------------------------------------------------------------------------- 1 | ProjectExplorer.app 2 | ProjectExplorerSettings.xml 3 | system.app 4 | Addins\*.prg 5 | Addins\template.txt 6 | Addins\folder.png 7 | Addins\Functions\*.prg 8 | -------------------------------------------------------------------------------- /BuildProcess/ProjectSettings.txt: -------------------------------------------------------------------------------- 1 | AppName = Project Explorer 2 | AppID = ProjectExplorer 3 | Version = 1.0 4 | Component = No 5 | ChangeLog = ChangeLog.md 6 | PJXFile = projectexplorer.pjx 7 | Repository = https://github.com/DougHennig/ProjectExplorer 8 | -------------------------------------------------------------------------------- /BuildProcess/Thor_Update_ProjectExplorer.prg: -------------------------------------------------------------------------------- 1 | lparameters toUpdateObject 2 | local lcRepositoryURL, ; 3 | lcDownloadsURL, ; 4 | lcVersionFileURL, ; 5 | lcZIPFileURL, ; 6 | lcRegisterWithThor 7 | 8 | * Get the URL for the version and ZIP files. 9 | 10 | lcRepositoryURL = 'https://github.com/VFPX/ProjectExplorer' 11 | && the URL for the project's repository 12 | lcDownloadsURL = strtran(lcRepositoryURL, 'github.com', ; 13 | 'raw.githubusercontent.com') + '/master/ThorUpdater/' 14 | lcVersionFileURL = lcDownloadsURL + 'ProjectExplorerVersion.txt' 15 | && the URL for the file containing code to get the available version number 16 | lcZIPFileURL = lcDownloadsURL + 'ProjectExplorer.zip' 17 | && the URL for the zip file containing the project 18 | 19 | * Set the properties of the passed updater object. 20 | 21 | with toUpdateObject 22 | .ApplicationName = 'Project Explorer' 23 | .VersionLocalFilename = 'ProjectExplorerVersionFile.txt' 24 | .VersionFileURL = lcVersionFileURL 25 | .SourceFileUrl = lcZIPFileURL 26 | .Component = 'No' 27 | .Link = lcRepositoryURL 28 | .LinkPrompt = 'Project Explorer Home Page' 29 | .ProjectCreationDate = date(2023, 3, 5) 30 | endwith 31 | return toUpdateObject 32 | -------------------------------------------------------------------------------- /BuildProcess/VersionTemplate.txt: -------------------------------------------------------------------------------- 1 | @@@ Edit this template if necessary. Note the use of placeholders such as 2 | {APPNAME} and {APPID}; they are substituted with the correct values when 3 | the deployment process is run, so no need to edit those. Also, this file is 4 | textmerged so some text may not appear in the generated AppIDVersion.txt. 5 | Also, any text between @@@ and \\\ is removed. 6 | 7 | \\\lparameters toUpdateObject 8 | 9 | * Set the properties of the passed updater object.@@@ You likely won't need to 10 | * edit this code. One possible change is versioning: if you want to use the 11 | * Julian date as a minor version number, edit the AvailableVersion setting to: 12 | * 13 | * .AvailableVersion = '{APPNAME}-{VERSION}.{JULIAN}-update-{VERSIONDATE}' 14 | * 15 | * or possibly: 16 | * 17 | * .AvailableVersion = '{APPNAME}-{VERSION}-{JULIAN}-{VERSIONDATE}'\\\ 18 | 19 | with toUpdateObject 20 | .VersionNumber = '{VERSION}.{JULIAN} - {VERSIONDATE}' 21 | .AvailableVersion = '{APPNAME}-{VERSION}.{JULIAN}-update-{VERSIONDATE}' 22 | .Component = '{COMPONENT}' 23 | .Notes = GetNotes() 24 | .RegisterWithThor = GetRegisterWithThor() 25 | endwith 26 | return toUpdateObject 27 | 28 | * Get the notes for the project.@@@ Edit this code as necessary. If you specify 29 | * the name of a change log file as the ChangeLog setting in ProjectSettings.txt, 30 | * the contents of that file are substituted for the CHANGELOG placeholder so 31 | * there's no need to edit this.\\\ 32 | 33 | procedure GetNotes 34 | local lcNotes 35 | text to lcNotes noshow 36 | {CHANGELOG} 37 | endtext 38 | return lcNotes 39 | 40 | @@@* Register the tool with Thor. This template code assumes the tool is an APP 41 | * file named AppID.app, where AppID is the AppID setting in ProjectSettings.txt. 42 | * If that isn't the case, edit the Code property as necessary. 43 | 44 | \\\* Register the tool with Thor. Note: Thor replaces ##InstallFolder## with the 45 | * installation path for the tool when this code is executed. 46 | 47 | procedure GetRegisterWithThor 48 | local lcCommand 49 | text to lcCommand noshow 50 | <> 51 | * Create the tool under Thor Tools. 52 | 53 | loThorInfo = Execscript (_Screen.cThorDispatcher, 'Thor Register=') 54 | with loThorInfo 55 | 56 | * Required properties. 57 | 58 | .PRGName = 'Thor_Tool_{APPID}' 59 | .FolderName = '##InstallFolder##' 60 | .Prompt = '{APPNAME}' 61 | 62 | * Optional properties. 63 | 64 | .Description = '{APPNAME}' 65 | 66 | * These are used to group and sort tools when they are displayed in menus or 67 | * the Thor form. 68 | 69 | .Category = '{CATEGORY}' 70 | .CanRunAtStartUp = .F. 71 | 72 | * This is the code to execute when the tool is selected. 73 | 74 | .Code = "do ('##InstallFolder##{APPID}.app')" 75 | 76 | * Register the tool with Thor. 77 | 78 | llRegister = .Register() 79 | endwith 80 | <> 81 | endtext 82 | return lcCommand 83 | -------------------------------------------------------------------------------- /BuildProcess/buildme.PRG: -------------------------------------------------------------------------------- 1 | * Update ccVERSION_NUMBER in ProjectExplorer.h. 2 | 3 | lcContent = filetostr('Source\ProjectExplorer.h') 4 | lcVersion = strextract(lcContent, '#define ccVERSION_NUMBER', chr(13), 1, 4) 5 | lcVersion = strextract(lcVersion, "'", "'") 6 | lcContent = strtran(lcContent, lcVersion, pcVersion + '.' + padl(date() - date(2000, 1, 1), 5, '0')) 7 | strtofile(lcContent, 'Source\ProjectExplorer.h') 8 | -------------------------------------------------------------------------------- /ChangeLog.md: -------------------------------------------------------------------------------- 1 | # Project Explorer 2 | 3 | Project Explorer replaces the VFP Project Manager with a modern interface and modern capabilities. 4 | 5 | ## Release History 6 | 7 | ### 2025-05-22, version 1.0.09273 8 | 9 | * A tag starting with "Code" no longer conflicts with the built-in Code tag. 10 | 11 | * Project Explorer no longer adds a file with the same name as an existing file but in a different folder. 12 | 13 | ### 2024-03-10, Version 1.0.08835 14 | 15 | * The EditFile method now returns .F. if it can't edit the file (for example, the specified file isn't part of the project). 16 | 17 | ### 2024-01-13, Version 1.0.08778 18 | 19 | * Restores the former dock position of the form when it's opened (issue #223). 20 | 21 | * Handle tags with special characters (issue #211). 22 | 23 | * Automated generation of version number when using VFPX Deployment. 24 | 25 | * ProjectExplorerForm.SelectNodeForFile: return .T. if an item was selected in the TreeView. 26 | 27 | ### 2023-03-05, Version 1.0.08464 28 | 29 | * Added support for editing an MPR in the project as a program (issue #220). 30 | 31 | * Fixed an issue with Project Explorer hanging after saving changes to a file under some conditions (issue #219). 32 | 33 | ### 2023-01-21, Version 1.0.08421 34 | 35 | * Added a new add-in, SetCurDirOnProjectOpen.prg, which automatically does a CD to the solution's folder when a solution is opened. 36 | 37 | * Added support for [VFPX Deployment](https://github.com/VFPX/VFPXDeployment) as the deployment mechanism. 38 | 39 | ### 2022-06-15, Version 1.0.8201 40 | 41 | * Fixed a bug: when adding a file, it doesn't appear in "All" until you close and reopen Project Explorer. 42 | 43 | * Fixed a bug: binary files show with version control status "?" (unknown) if only text equivalents are included in the repository and there is no .gitignore or it doesn't exclude binary files. 44 | 45 | ### 2022-03-26, Version 1.0.8120 46 | 47 | * Added support for binary-to-text conversion using Christof Wollenhaupt's TwoFox. 48 | 49 | * Added support for selecting which binary-to-text converter to use on a project-by-project basis (for example, one project may use FoxBin2PRG while another uses TwoFox). 50 | -------------------------------------------------------------------------------- /ProjectExplorer.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/ProjectExplorer.pdf -------------------------------------------------------------------------------- /ProjectExplorer.pjt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/ProjectExplorer.pjt -------------------------------------------------------------------------------- /ProjectExplorer.pjx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/ProjectExplorer.pjx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Project Explorer 2 | 3 | [![ChangeLog](https://img.shields.io/github/last-commit/DougHennig/ProjectExplorer?path=ChangeLog.md&label=Latest%20Release)](ChangeLog.md) 4 | 5 | The Project Manager is one of the oldest tools built into VFP, and it has showed its age for a long time. For example, it doesn't provide integration with modern distributed version control systems (DVCS) such as Mercurial and Git, it doesn't have a way to filter or organize the list of items, and it can only work with one project at a time. 6 | 7 | Project Explorer is a VFPX project that replaces the Project Manager with a modern interface and modern capabilities. It has most of the features of the Project Manager but adds integration with DVCS (including built-in support for FoxBin2PRG and optional auto-commit after changes), support for multiple projects within a "solution," allows you to organize your items by keyword or other criteria, and has support for easy "auto-registering" addins that can customize the appearance and behavior of the tool. 8 | 9 | See [ProjectExplorer.pdf](ProjectExplorer.pdf) for documentation on Project Explorer. 10 | 11 | A [video](https://www.youtube.com/watch?v=0Rqs8nT7N68) is available showing Project Explorer and how it works. 12 | 13 | ## Releases 14 | 15 | See the [change log](ChangeLog.md) for release information. 16 | 17 | ## Helping with this project 18 | 19 | See [How to contribute to Project Explorer](.github/CONTRIBUTING.md) for details on how to help with this project. 20 | -------------------------------------------------------------------------------- /Source/ChangeFileName.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: ChangeFileName 3 | * Purpose: Returns a file path with a new stem name 4 | * Author: Doug Hennig 5 | * Last Revision: 04/20/2017 6 | * Parameters: tcName1 - the name and path of the file 7 | * tcName2 - the new stem name 8 | * Returns: the file path with a new stem name 9 | * Environment in: none 10 | * Environment out: none 11 | *============================================================================== 12 | 13 | lparameters tcName1, ; 14 | tcName2 15 | return forcepath(forceext(tcName2, justext(tcName1)), justpath(tcName1)) 16 | -------------------------------------------------------------------------------- /Source/CopyProperties.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: CopyProperties 3 | * Purpose: Copies all possible properties from one object to another 4 | * Author: Doug Hennig 5 | * Last revision: 03/20/2016 6 | * Parameters: toSource - the object to copy properties from 7 | * toTarget - the object to copy properties to 8 | * Returns: .T. 9 | * Environment in: toSource and toTarget must be objects 10 | * Environment out: all possible properties (those that exist in the target and 11 | * aren't read-only or protected) are copied from toSource 12 | * to toTarget 13 | *============================================================================== 14 | 15 | lparameters toSource, ; 16 | toTarget 17 | local laProperties[1], ; 18 | lnProperties, ; 19 | lnI, ; 20 | lcProperty, ; 21 | luValue, ; 22 | lnRows, ; 23 | lnCols 24 | lnProperties = amembers(laProperties, toSource) 25 | for lnI = 1 to lnProperties 26 | lcProperty = upper(laProperties[lnI]) 27 | if not inlist(lcProperty + ' ', 'BASECLASS ', 'CLASS ', 'CLASSLIBRARY ', ; 28 | 'CONTROLCOUNT ', 'CONTROLS ', 'NAME ', 'OBJECTS ', 'PARENT ', ; 29 | 'PARENTCLASS ') 30 | && the space is added so an exact match is found 31 | luValue = evaluate('toSource.' + lcProperty) 32 | 33 | * Ensure the property exists in the target object, is not read-only, and not 34 | * protected. Note: having separate statements for PEMSTATUS is a workaround 35 | * because VFP has a problem with two such commands within one line of code. 36 | 37 | if pemstatus(toTarget, lcProperty, 5) 38 | if not pemstatus(toTarget, lcProperty, 1) 39 | if not pemstatus(toTarget, lcProperty, 2) 40 | 41 | * If this is an array property, use ACOPY (the check for element 0 is a 42 | * workaround for a VFP bug that makes native properties look like arrays; that 43 | * is, TYPE('OBJECT.NAME[1]') is not "U"). Otherwise, save the value in the 44 | * property. 45 | 46 | if type('toTarget.' + lcProperty + '[0]') = 'U' and ; 47 | type('toTarget.' + lcProperty + '[1]') <> 'U' 48 | lnRows = alen(toSource.&lcProperty, 1) 49 | lnCols = alen(toSource.&lcProperty, 2) 50 | if lnCols > 0 51 | dimension toTarget.&lcProperty[lnRows, lnCols] 52 | else 53 | dimension toTarget.&lcProperty[lnRows] 54 | endif lnCols > 0 55 | acopy(toSource.&lcProperty, toTarget.&lcProperty) 56 | else 57 | store luValue to ('toTarget.' + lcProperty) 58 | endif type('toTarget.' + lcProperty + '[0]') = 'U' ... 59 | endif not pemstatus(toTarget, lcProperty, 2) 60 | endif not pemstatus(toTarget, lcProperty, 1) 61 | endif pemstatus(toTarget, lcProperty, 5) 62 | endif not inlist(lcProperty, ... 63 | next lnI 64 | return 65 | -------------------------------------------------------------------------------- /Source/ExecuteFile.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: ExecuteFile 3 | * Purpose: Opens a file in the application it's associated with 4 | * Author: Adapted from the FFC _ShellExecute class by Doug Hennig 5 | * Last revision: 02/21/2017 6 | * Parameters: tcFileName - the filename to open 7 | * tcOperation - the operation to perform (optional: if it 8 | * isn't specified, "Open" is used) 9 | * tcWorkDir - the working directory for the application 10 | * (optional) 11 | * tcParameters - other parameters to pass to the application 12 | * (optional) 13 | * tlNoShow - .T. to hide the window 14 | * Returns: -1: if no filename was passed 15 | * 2: file was not found 16 | * 3: path was not found 17 | * 31: no application association 18 | * Values over 32 indicate success and return an instance 19 | * handle for the application 20 | * See http://support.microsoft.com/kb/238245 for other values 21 | * Environment in: none 22 | * Environment out: if a valid value is returned, the application is running 23 | *============================================================================== 24 | 25 | lparameters tcFileName, ; 26 | tcOperation, ; 27 | tcWorkDir, ; 28 | tcParameters, ; 29 | tlNoShow 30 | local lcFileName, ; 31 | lcWorkDir, ; 32 | lcOperation, ; 33 | lcParameters, ; 34 | lnShow, ; 35 | lnReturn, ; 36 | loException as Exception 37 | if empty(tcFileName) 38 | return -1 39 | endif empty(tcFileName) 40 | lcFileName = alltrim(tcFileName) 41 | lcWorkDir = iif(vartype(tcWorkDir) = 'C', alltrim(tcWorkDir), '') 42 | lcOperation = iif(vartype(tcOperation) = 'C' and not empty(tcOperation), ; 43 | alltrim(tcOperation), 'Open') 44 | lcParameters = iif(vartype(tcParameters) = 'C', alltrim(tcParameters), '') 45 | lnShow = iif(upper(lcOperation) = 'PRINT' or tlNoShow, 0, 1) 46 | declare integer ShellExecute in SHELL32.DLL ; 47 | integer nWinHandle, ; && handle of parent window 48 | string cOperation, ; && operation to perform 49 | string cFileName, ; && filename 50 | string cParameters, ; && parameters for the executable 51 | string cDirectory, ; && default directory 52 | integer nShowWindow && window state 53 | try 54 | lnReturn = ShellExecute(0, lcOperation, lcFilename, lcParameters, ; 55 | lcWorkDir, lnShow) 56 | catch to loException when loException.ErrorNo = 12 57 | && Variable is not found 58 | catch to loException 59 | endtry 60 | return lnReturn 61 | -------------------------------------------------------------------------------- /Source/GetAssociation.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: GetAssociation 3 | * Purpose: Gets the file used to open the specified extension 4 | * Author: Doug Hennig 5 | * Last revision: 10/17/2019 6 | * Parameters: tcExt - the extension to get the association for 7 | * Returns: the executable associated with the extension 8 | * Environment in: none 9 | * Environment out: none 10 | * Notes: Modified from https://social.msdn.microsoft.com/Forums/en-US/d7a075ac-3a2a-40c5-89c9-87efc7d16563/pinvoking-assocquerystring-in-c-to-get-application-associated-with-a-file-extension?forum=csharplanguage 11 | *============================================================================== 12 | 13 | lparameters tcExt 14 | local lcExt, ; 15 | lcBuffer, ; 16 | lnBufferSize, ; 17 | lcFile 18 | #define ASSOCF_NOTRUNCATE 0x20 19 | #define ASSOCSTR_EXECUTABLE 2 20 | lcExt = iif(left(tcExt, 1) = '.', '', '.') + tcExt 21 | lcBuffer = replicate(chr(0), 1024) 22 | lnBufferSize = len(lcBuffer) 23 | declare AssocQueryString in Shlwapi.dll integer ASSOCF, integer ASSOCSTR, ; 24 | string pszAssoc, string pszExtra, string @pszOut, integer @pcchOut 25 | AssocQueryString(ASSOCF_NOTRUNCATE, ASSOCSTR_EXECUTABLE, lcExt, 'open', ; 26 | @lcBuffer, @lnBufferSize) 27 | lcFile = left(lcBuffer, at(chr(0), lcBuffer) - 1) 28 | return lcFile 29 | -------------------------------------------------------------------------------- /Source/GetChecksum.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: GetChecksum 3 | * Purpose: Returns the checksum for the specified file and associated 4 | * files 5 | * Author: Doug Hennig 6 | * Last Revision: 01/05/2018 7 | * Parameters: tcFileName - the name and path of the file 8 | * Returns: the checksum for the specified file and associated files 9 | * (comma-separated) 10 | * Environment in: none 11 | * Environment out: none 12 | *============================================================================== 13 | 14 | lparameters tcFileName 15 | local lcChecksum, ; 16 | lcOther 17 | CloseFile(tcFileName) 18 | lcChecksum = '' 19 | try 20 | lcChecksum = sys(2007, filetostr(tcFileName), 0, 1) 21 | lcOther = GetVFPBinaryOtherFile(tcFileName) 22 | lcChecksum = lcChecksum + ',' + sys(2007, filetostr(lcOther), 0, 1) 23 | lcOther = GetVFPBinaryOtherFile(tcFileName, .T.) 24 | if not empty(lcOther) 25 | lcChecksum = lcChecksum + ',' + sys(2007, filetostr(lcOther), 0, 1) 26 | endif not empty(lcOther) 27 | catch 28 | endtry 29 | return lcChecksum 30 | -------------------------------------------------------------------------------- /Source/GetRelativePath.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: GetRelativePath 3 | * Purpose: Returns the relative path for a file in the case as it 4 | * exists on disk 5 | * Author: Doug Hennig 6 | * Last revision: 06/26/2018 7 | * Parameters: tcTo - the file to get the relative path for 8 | * tcFrom - the file to get the relative path from 9 | * Returns: the file or folder name in the correct case 10 | * Environment in: none 11 | * Environment out: none 12 | *============================================================================== 13 | 14 | #define cnMAX_PATH 260 15 | #define cnFILE_ATTRIBUTE_DIRECTORY 0x10 16 | #define cnFILE_ATTRIBUTE_NORMAL 0x80 17 | 18 | lparameters tcTo, ; 19 | tcFrom 20 | local lcPath, ; 21 | lcFrom, ; 22 | lnFromAttrib, ; 23 | lcTo, ; 24 | lnToAttrib 25 | declare integer PathRelativePathTo in shlwapi.dll ; 26 | string @out, string @from, integer fromattrib, string @to, integer toattrib 27 | lcPath = space(cnMAX_PATH) 28 | lcFrom = iif(vartype(tcFrom) = 'C', tcFrom, sys(5) + curdir()) + chr(0) 29 | lnFromAttrib = iif(directory(lcFrom), cnFILE_ATTRIBUTE_DIRECTORY, ; 30 | cnFILE_ATTRIBUTE_NORMAL) 31 | lcTo = iif(vartype(tcTo) = 'C', tcTo, sys(5) + curdir()) + chr(0) 32 | lnToAttrib = iif(directory(lcTo), cnFILE_ATTRIBUTE_DIRECTORY, ; 33 | cnFILE_ATTRIBUTE_NORMAL) 34 | PathRelativePathTo(@lcPath, @lcFrom, lnFromAttrib, @lcTo, lnToAttrib) 35 | lcPath = alltrim(strtran(lcPath, chr(0), ' ')) 36 | do case 37 | case empty(lcPath) 38 | lcPath = tcTo 39 | case left(lcPath, 2) = '.\' 40 | lcPath = substr(lcPath, 3) 41 | endcase 42 | return lcPath 43 | -------------------------------------------------------------------------------- /Source/GetTimestampFromDateTime.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: GetTimestampFromDateTime 3 | * Purpose: Converts a DateTime to a VFP timestamp 4 | * Author: Adapted from _FRXCursor.GetFRXTimeStamp by Doug Hennig 5 | * Last revision: 03/31/2017 6 | * Parameters: ttDateTime - the DateTime value 7 | * Returns: the timestamp equivalent of the DateTime 8 | * Environment in: none 9 | * Environment out: none 10 | *============================================================================== 11 | 12 | lparameter ttDateTime 13 | local lnTemp, ; 14 | lnFoxTimeStamp 15 | 16 | *------------------------------------------------------- 17 | * bits 4-0, seconds in two-second increments 18 | *------------------------------------------------------- 19 | lnTemp = sec(ttDateTime) / 2 20 | lnFoxTimeStamp = padl(right(IntToBin(lnTemp), 5), 5, '0') 21 | 22 | *------------------------------------------------------- 23 | * bits 10-5, minutes 24 | *------------------------------------------------------- 25 | lnTemp = minute(ttDateTime) 26 | lnFoxTimeStamp = padl(right(IntToBin(lnTemp), 6), 6, '0') + lnFoxTimeStamp 27 | 28 | *------------------------------------------------------- 29 | * bits 15-11, hours 30 | *------------------------------------------------------- 31 | lnTemp = hour(ttDateTime) 32 | lnFoxTimeStamp = padl(right(IntToBin(lnTemp), 5), 5, '0') + lnFoxTimeStamp 33 | 34 | *------------------------------------------------------- 35 | * bits 20-16, days 36 | *------------------------------------------------------- 37 | lnTemp = day(ttDateTime) 38 | lnFoxTimeStamp = padl(right(IntToBin(lnTemp), 5), 5, '0') + lnFoxTimeStamp 39 | 40 | *------------------------------------------------------- 41 | * bits 24-21, months 42 | *------------------------------------------------------- 43 | lnTemp = month(ttDateTime) 44 | lnFoxTimeStamp = padl(right(IntToBin(lnTemp), 4), 4, '0') + lnFoxTimeStamp 45 | 46 | *------------------------------------------------------- 47 | * bits 31-25, years with a 1980 offset 48 | *------------------------------------------------------- 49 | lnTemp = year(ttDateTime) - 1980 50 | lnFoxTimeStamp = padl(right(IntToBin(lnTemp), 7), 7, '0') + lnFoxTimeStamp 51 | lnFoxTimeStamp = BinToInt(lnFoxTimeStamp) 52 | return lnFoxTimeStamp 53 | 54 | *======================================================= 55 | * Returns a binary form of an integer 56 | *======================================================= 57 | function IntToBin(tnInteger) 58 | local lnInteger, ; 59 | lcBinary, ; 60 | lnCount, ; 61 | lnDivisor 62 | if empty(tnInteger) 63 | return '0' 64 | endif empty(tnInteger) 65 | lnInteger = int(tnInteger) 66 | lcBinary = '' 67 | for lnCount = 31 to 0 step -1 68 | lnDivisor = 2^lnCount 69 | if lnDivisor > lnInteger 70 | lcBinary = lcBinary + '0' 71 | loop 72 | endif lnDivisor > lnInteger 73 | lcBinary = lcBinary + iif((lnInteger/lnDivisor) > 0, '1', '0') 74 | lnInteger = int(lnInteger - lnDivisor) 75 | next lnCount 76 | return lcBinary 77 | 78 | *======================================================= 79 | * Returns an integer form of binary data 80 | *======================================================= 81 | function BinToInt(tcBinary) 82 | local lnStrLen, ; 83 | lnInteger, ; 84 | lnCount 85 | if empty(tcBinary) 86 | return 0 87 | endif empty(tcBinary) 88 | lnStrLen = len(tcBinary) 89 | lnInteger = 0 90 | for lnCount = 0 to lnStrLen - 1 91 | if substr(tcBinary, lnStrLen - lnCount, 1) = '1' 92 | lnInteger = lnInteger + 2^lnCount 93 | endif substr(tcBinary, lnStrLen - lnCount, 1) = '1' 94 | next lnCount 95 | return int(lnInteger) 96 | -------------------------------------------------------------------------------- /Source/GetVFPBinaryOtherFile.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: GetVFPBinaryOtherFile 3 | * Purpose: Get the "other" filename for a VFP binary file 4 | * Author: Doug Hennig 5 | * Last Revision: 10/07/2017 6 | * Parameters: tcFile - the name of the file to check 7 | * tlOther - in the case of a DBC or DBF, specifies which of 8 | * the "other" filenames is returned: .F. = CDX/DCX, 9 | * .T. = FPT/DCT 10 | * Returns: the name of the "other" file from a VFP binary pair (for 11 | * example, returns "Form1.sct" if passed "Form1.scx") or 12 | * blank if there isn't such a file (for example, no CDX 13 | * for table) 14 | * Environment in: see GetProperFileCase.prg 15 | * Environment out: see GetProperFileCase.prg 16 | *============================================================================== 17 | 18 | lparameters tcFile, ; 19 | tlOther 20 | local lcExt, ; 21 | lcFile 22 | lcExt = lower(justext(tcFile)) 23 | do case 24 | case not inlist(lcExt, 'pjx', 'vcx', 'scx', 'mnx', 'frx', 'lbx', 'dbf', ; 25 | 'dbc') 26 | lcExt = '' 27 | lcFile = '' 28 | case lcExt = 'dbc' and tlOther 29 | lcExt = 'dct' 30 | case lcExt = 'dbc' 31 | lcExt = 'dcx' 32 | case lcExt = 'dbf' and tlOther 33 | lcExt = 'fpt' 34 | case lcExt = 'dbf' 35 | lcExt = 'cdx' 36 | case tlOther 37 | lcExt = '' 38 | lcFile = '' 39 | otherwise 40 | lcExt = strtran(lcExt, 'x', 't') 41 | endcase 42 | if not empty(lcExt) 43 | lcFile = forceext(tcFile, lcExt) 44 | if file(lcFile) 45 | lcFile = GetProperFileCase(lcFile) 46 | else 47 | lcFile = '' 48 | endif file(lcFile) 49 | endif not empty(lcExt) 50 | return lcFile 51 | -------------------------------------------------------------------------------- /Source/Images/ProjectExplorer.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/ProjectExplorer.ico -------------------------------------------------------------------------------- /Source/Images/projectexploreractivedoc.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexploreractivedoc.ico -------------------------------------------------------------------------------- /Source/Images/projectexploreradd.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexploreradd.bmp -------------------------------------------------------------------------------- /Source/Images/projectexploreradd.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexploreradd.msk -------------------------------------------------------------------------------- /Source/Images/projectexploreradded.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexploreradded.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerapplication.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerapplication.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerbuildsolution.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerbuildsolution.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerbuildsolution.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerbuildsolution.msk -------------------------------------------------------------------------------- /Source/Images/projectexplorercategory.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercategory.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorercheckbox.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercheckbox.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerclasslib.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerclasslib.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerclean.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerclean.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorercleanup.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercleanup.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorercleanup.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercleanup.msk -------------------------------------------------------------------------------- /Source/Images/projectexplorercode.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercode.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorercollapse.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercollapse.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorercollapse.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercollapse.msk -------------------------------------------------------------------------------- /Source/Images/projectexplorercollection.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercollection.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorercombobox.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercombobox.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorercommandbutton.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercommandbutton.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorercommandgroup.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercommandgroup.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorercommit.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercommit.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorercommit.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercommit.msk -------------------------------------------------------------------------------- /Source/Images/projectexplorerconnection.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerconnection.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorercontainer.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercontainer.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorercontrol.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercontrol.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorercursor.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercursor.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorercursoradapter.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercursoradapter.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorercustom.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorercustom.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerdatabase.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerdatabase.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerdataenvironment.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerdataenvironment.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorereditbox.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorereditbox.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerexcluded.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerexcluded.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerexpand.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerexpand.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerexpand.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerexpand.msk -------------------------------------------------------------------------------- /Source/Images/projectexplorerfetch.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerfetch.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerfield.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerfield.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerfilter.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerfilter.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerfilter.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerfilter.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerform.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerform.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerformset.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerformset.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorergoback.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorergoback.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorergrid.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorergrid.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerhyperlink.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerhyperlink.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerignored.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerignored.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerimage.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerimage.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerindex.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerindex.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerlabel.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerlabel.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerlabels.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerlabels.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerlibrary.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerlibrary.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerline.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerline.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerlistbox.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerlistbox.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerlocalview.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerlocalview.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorermenu.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorermenu.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorermenu.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorermenu.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorermodified.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorermodified.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorermodify.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorermodify.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorernewfile.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorernewfile.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorernewfile.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorernewfile.msk -------------------------------------------------------------------------------- /Source/Images/projectexploreroleboundcontrol.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexploreroleboundcontrol.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerolecontrol.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerolecontrol.ico -------------------------------------------------------------------------------- /Source/Images/projectexploreropen.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexploreropen.bmp -------------------------------------------------------------------------------- /Source/Images/projectexploreroptionbutton.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexploreroptionbutton.ico -------------------------------------------------------------------------------- /Source/Images/projectexploreroptiongroup.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexploreroptiongroup.ico -------------------------------------------------------------------------------- /Source/Images/projectexploreroptions.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexploreroptions.bmp -------------------------------------------------------------------------------- /Source/Images/projectexploreroptions.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexploreroptions.msk -------------------------------------------------------------------------------- /Source/Images/projectexplorerother.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerother.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerpage.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerpage.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerpageframe.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerpageframe.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerproject.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerproject.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerprojecthook.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerprojecthook.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerpush.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerpush.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerquery.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerquery.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerrefresh.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerrefresh.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerrelation.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerrelation.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerremoteview.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerremoteview.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerremove.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerremove.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerremove.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerremove.msk -------------------------------------------------------------------------------- /Source/Images/projectexplorerremoved.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerremoved.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerrepobrowser.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerrepobrowser.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerrepobrowser.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerrepobrowser.msk -------------------------------------------------------------------------------- /Source/Images/projectexplorerreportlistener.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerreportlistener.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerreports.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerreports.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerresolveconflict.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerresolveconflict.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerrevert.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerrevert.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerrevhistory.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerrevhistory.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerrevhistory.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerrevhistory.msk -------------------------------------------------------------------------------- /Source/Images/projectexplorerrun.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerrun.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerrun.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerrun.msk -------------------------------------------------------------------------------- /Source/Images/projectexplorerseparator.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerseparator.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorershape.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorershape.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorersortasc.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorersortasc.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorersortdesc.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorersortdesc.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerspinner.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerspinner.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerstorepro.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerstorepro.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorertable.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorertable.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorertags.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorertags.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorertext.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorertext.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorertextbox.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorertextbox.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorertimer.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorertimer.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorertobinary.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorertobinary.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorertoolbar.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorertoolbar.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorertotext.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorertotext.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorerunmerged.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerunmerged.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerunversioned.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerunversioned.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorervisualdiff.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorervisualdiff.bmp -------------------------------------------------------------------------------- /Source/Images/projectexplorervisualdiff.msk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorervisualdiff.msk -------------------------------------------------------------------------------- /Source/Images/projectexplorerxmladapter.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerxmladapter.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerxmlfield.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerxmlfield.ico -------------------------------------------------------------------------------- /Source/Images/projectexplorerxmltable.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/projectexplorerxmltable.ico -------------------------------------------------------------------------------- /Source/Images/vfpxpoweredby.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/Images/vfpxpoweredby.gif -------------------------------------------------------------------------------- /Source/IsVFPBinaryFile.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: IsVFPBinaryFile 3 | * Purpose: Returns .T. for a VFP binary file 4 | * Author: Doug Hennig 5 | * Last Revision: 04/11/2017 6 | * Parameters: tcFile - the name of the file to check 7 | * Returns: .T. if the specified file is a VFP binary file 8 | * Environment in: none 9 | * Environment out: none 10 | *============================================================================== 11 | 12 | lparameters tcFile 13 | local lcExt 14 | lcExt = lower(justext(tcFile)) 15 | return inlist(lcExt, 'pjx', 'vcx', 'scx', 'mnx', 'frx', 'lbx', 'dbf', 'dbc') 16 | -------------------------------------------------------------------------------- /Source/ProjectExplorerGetValidName.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: ProjectExplorerGetValidName 3 | * Purpose: Returns a valid VFP name 4 | * Author: Doug Hennig 5 | * Last revision: 01/13/2024 6 | * Parameters: tcName - the name 7 | * tlObject - .T. to only allow characters in an object name; 8 | * .F. to allow characters in a file name 9 | * Returns: the name with illegal characters converted to _ 10 | * Environment in: none 11 | * Environment out: none 12 | *============================================================================== 13 | 14 | lparameters tcName, ; 15 | tlObject 16 | local lcName, ; 17 | lnI, ; 18 | lcChar, ; 19 | lcIllegal 20 | if tlObject 21 | lcName = tcName 22 | for lnI = 1 to len(lcName) 23 | lcChar = substr(lcName, lnI, 1) 24 | if not isalpha(lcChar) and not isdigit(lcChar) 25 | lcName = stuff(lcName, lnI, 1, '_') 26 | endif not isalpha(lcChar) ... 27 | next lnI 28 | else 29 | lcIllegal = ' ~!@#$%^&*()-+=-/?`{}|<>,:;\' 30 | && illegal characters in VFP names 31 | lcName = chrtran(tcName, lcIllegal, replicate('_', len(lcIllegal))) 32 | endif tlObject 33 | return lcName 34 | -------------------------------------------------------------------------------- /Source/bindwinevent.PRG: -------------------------------------------------------------------------------- 1 | * Bind Win event 2 | * Allows multiple bindings for single Win Msg 3 | LPARAMETERS thWnd, tnMessage, toEventHandler, tcDelegate, tnFlags 4 | Local lnReturn 5 | 6 | IF !('BINDWINEVENTAPI' $ Upper(SET( 'Procedure' ))) 7 | SET PROCEDURE TO BindWinEventAPI ADDITIVE 8 | ENDIF 9 | 10 | IF !PEMSTATUS(_SCREEN,"oEventHandler",5) or IsNull(_Screen.oEventHandler) 11 | _SCREEN.NewObject("oEventHandler","VFPxWin32EventHandler","VFPxWin32EventHandler.prg") 12 | EndIf 13 | 14 | DO CASE 15 | CASE Pcount() = 4 16 | lnReturn = _Screen.oEventHandler.BindEvent(thWnd, tnMessage, toEventHandler, tcDelegate) 17 | CASE Pcount() = 5 18 | lnReturn = _Screen.oEventHandler.BindEvent(thWnd, tnMessage, toEventHandler, tcDelegate, tnFlags) 19 | Otherwise 20 | lnReturn = 0 21 | Assert .F. Message "BindWinEvent requires 4 or 5 parameters. Syntax: " + Chr(13) + Chr(13) + ; 22 | "BindWinEvent(thWnd, tnMessage, toEventHandler, tcDelegate, tnFlags)" 23 | ENDCASE 24 | 25 | Return lnReturn -------------------------------------------------------------------------------- /Source/bindwineventapi.prg: -------------------------------------------------------------------------------- 1 | * Declare Win32 API functions 2 | * Greg Green: The problem is we are both declare Win API functions and then clearing them 3 | * as part of our clean-up. I have found that by using a function wrapper around the DECLARE - DLL 4 | * call that you don't have to worry that another program has released a DECLARE of yours. 5 | * The SET PROCEDURE TO ensures that your program will always find the wrapper. 6 | FUNCTION CallWindowProc 7 | LPARAMETERS lpPrevWndFunc, hWnd, nMsg, wParam, lParam 8 | Declare Integer CallWindowProc In Win32API Integer lpPrevWndFunc, Integer hWnd, Integer nMsg, Integer wParam, Integer lParam 9 | RETURN CallWindowProc(lpPrevWndFunc, hWnd, nMsg, wParam, lParam) 10 | ENDFUNC 11 | 12 | 13 | FUNCTION GetWindowLong 14 | LPARAMETERS hWnd, nIndex 15 | Declare Integer GetWindowLong In Win32API Integer hWnd, Integer nIndex 16 | RETURN GetWindowLong(hWnd, nIndex) 17 | ENDFUNC 18 | -------------------------------------------------------------------------------- /Source/buildproject.prg: -------------------------------------------------------------------------------- 1 | lparameters toProject, ; 2 | tcOutputName, ; 3 | tnBuildAction, ; 4 | tlShowErrors, ; 5 | tlBuildNewGUIDs 6 | return toProject.Build(tcOutputName, int(tnBuildAction), .F., tlShowErrors, ; 7 | tlBuildNewGUIDs) 8 | -------------------------------------------------------------------------------- /Source/categoriessource.cdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/categoriessource.cdx -------------------------------------------------------------------------------- /Source/categoriessource.db2: -------------------------------------------------------------------------------- 1 | *-------------------------------------------------------------------------------------------------------------------------------------------------------- 2 | * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! 3 | *-------------------------------------------------------------------------------------------------------------------------------------------------------- 4 | *< FOXBIN2PRG: Version="1.21" SourceFile="categoriessource.dbf" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) 5 | * 6 | 7 | 8 | 9 | 10 | 1252 11 | 12 | 13 | 0x00000031 14 | Visual FoxPro, autoincrement enabled 15 | 16 | 17 | 18 | ID 19 | I 20 | 4 21 | 0 22 | .F. 23 | .F. 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 1 35 | 1 36 | 37 | 38 | LABEL 39 | C 40 | 20 41 | 0 42 | .F. 43 | .F. 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 0 55 | 0 56 | 57 | 58 | COLOR 59 | I 60 | 4 61 | 0 62 | .F. 63 | .F. 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 0 75 | 0 76 | 77 | 78 | BACKCOLOR 79 | I 80 | 4 81 | 0 82 | .F. 83 | .F. 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 0 95 | 0 96 | 97 | 98 | ORDER 99 | N 100 | 2 101 | 0 102 | .F. 103 | .F. 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 0 115 | 0 116 | 117 | 118 | DISPLAY 119 | N 120 | 1 121 | 0 122 | .F. 123 | .F. 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 0 135 | 0 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | ID 146 | REGULAR 147 | ID 148 | 149 | ASCENDING 150 | MACHINE 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 1 162 | 163 | 255 164 | 16777215 165 | 2 166 | 1 167 | 168 | 169 | 170 | 2 171 | 172 | 16711680 173 | 16777215 174 | 3 175 | 1 176 | 177 | 178 | 179 | 3 180 | 181 | 65280 182 | 16777215 183 | 4 184 | 1 185 | 186 | 187 | 188 | 4 189 | 190 | 65535 191 | 16777215 192 | 5 193 | 1 194 | 195 | 196 | 197 | 5 198 | 199 | 33023 200 | 16777215 201 | 6 202 | 1 203 | 204 | 205 | 206 | 6 207 | 208 | 10766755 209 | 16777215 210 | 7 211 | 1 212 | 213 | 214 | 215 | 7 216 | 217 | 13387839 218 | 16777215 219 | 8 220 | 1 221 | 222 | 223 | 224 | 0 225 | 226 | 0 227 | 16777215 228 | 1 229 | 1 230 | 231 | 232 | 233 | 234 | 235 |
236 | 237 | -------------------------------------------------------------------------------- /Source/categoriessource.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/categoriessource.dbf -------------------------------------------------------------------------------- /Source/closefile.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: CloseFile 3 | * Purpose: Closes the specified project, database container, table, or 4 | * class library in all data sessions 5 | * Author: Doug Hennig 6 | * Last Revision: 06/26/2018 7 | * Parameters: tcFile - the name and path of the project, database, table, 8 | * table name of a table, or class library 9 | * Returns: .T. 10 | * Environment in: none 11 | * Environment out: the file is closed if it was open 12 | *============================================================================== 13 | 14 | lparameters tcFile 15 | local lcExt, ; 16 | loProject, ; 17 | loException as Exception, ; 18 | lnDataSession, ; 19 | laSessions[1], ; 20 | lnSessions, ; 21 | lnI, ; 22 | lnSession, ; 23 | laTables[1], ; 24 | lnTables, ; 25 | lnJ 26 | lcExt = lower(justext(tcFile)) 27 | do case 28 | case lcExt = 'pjx' 29 | try 30 | loProject = _vfp.Projects[tcFile] 31 | loProject.Close() 32 | catch to loException 33 | endtry 34 | case lcExt = 'vcx' 35 | try 36 | clear classlib (tcFile) 37 | catch to loException 38 | endtry 39 | case lcExt = 'dbc' and dbused(tcFile) 40 | try 41 | set database to (tcFile) 42 | close databases 43 | catch to loException 44 | endtry 45 | case lcExt = 'dbf' or empty(lcExt) 46 | lnDataSession = set('DATASESSION') 47 | lnSessions = asessions(laSessions) 48 | for lnI = lnSessions to 1 step -1 49 | lnSession = laSessions[lnI] 50 | set datasession to lnSession 51 | lnTables = aused(laTables, lnSession, tcFile) 52 | for lnJ = 1 to lnTables 53 | use in (laTables[lnJ, 1]) 54 | next lnJ 55 | next lnI 56 | set datasession to lnDataSession 57 | endcase 58 | -------------------------------------------------------------------------------- /Source/evalexpr.prg: -------------------------------------------------------------------------------- 1 | lparameters tcExpression 2 | local lcExpression 3 | lcExpression = tcExpression 4 | if left(tcExpression, 1) = '{' 5 | try 6 | lcExpression = evaluate(substr(tcExpression, 2, ; 7 | len(tcExpression) - 2)) 8 | catch 9 | endtry 10 | endif left(tcExpression, 1) = '{' 11 | return lcExpression 12 | -------------------------------------------------------------------------------- /Source/getdatetimefromtimestamp.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: GetDateTimeFromTimestamp 3 | * Purpose: Converts a VFP timestamp to a DateTime 4 | * Author: Adapted from _FRXCursor.GetTimeStampString by Doug Hennig 5 | * with valid checking by Phil Sherwood 6 | * Last revision: 09/15/2017 7 | * Parameters: tiStamp - the timestamp value 8 | * Returns: the DateTime equivalent of the timestamp 9 | * Environment in: none 10 | * Environment out: none 11 | *============================================================================== 12 | 13 | lparameter tiStamp 14 | local lnYearOffset, ; 15 | lnYear, ; 16 | lnMonth, ; 17 | lnDay, ; 18 | lnHour, ; 19 | lnMinute, ; 20 | lnSecond 21 | if empty(tiStamp) or vartype(tiStamp) <> 'N' or tiStamp < 500000 22 | return {/:} 23 | endif empty(tiStamp) ... 24 | lnYearOffset = bitrshift(tiStamp, 25) 25 | && bits 31-25 26 | lnYear = 1980 + lnYearOffset 27 | lnMonth = bitrshift(tiStamp, 21) % 2^4 28 | && bits 24-21 29 | lnDay = bitrshift(tiStamp, 16) % 2^5 30 | && bits 20-16 31 | lnHour = bitrshift(tiStamp, 11) % 2^5 32 | && bits 15-11 33 | lnMinute = bitrshift(tiStamp, 5) % 2^6 34 | && bits 10-5 35 | lnSecond = bitlshift(tiStamp % 2^5, 1) 36 | && bits 4-0 (two-second increments) 37 | 38 | * Ensure the values are valid. 39 | 40 | if not between(lnYear, 1980, year(date())) 41 | lnYear = 1980 42 | endif not between(lnYear... 43 | if not between(lnMonth, 1, 12) 44 | lnMonth = 1 45 | endif not between(lnMonth... 46 | if not between(lnDay, 1, 31) 47 | lnDay = 1 48 | endif not between(lnDay... 49 | if not between(lnHour, 1, 24) 50 | lnHour = 12 51 | endif not between(lnHour... 52 | if not between(lnMinute, 0, 59) 53 | lnMinute = 0 54 | endif not between(lnMinute... 55 | if not between(lnSecond, 0, 60) 56 | lnSecond = 0 57 | endif not between(lnSecond... 58 | return datetime(lnYear, lnMonth, lnDay, lnHour, lnMinute, lnSecond) 59 | -------------------------------------------------------------------------------- /Source/getproperfilecase.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: GetProperFileCase 3 | * Purpose: Returns the specified file or folder name in the case as it 4 | * exists on disk 5 | * Author: Doug Hennig 6 | * Last revision: 06/26/2018 7 | * Parameters: tcName - the name of the file or folder 8 | * tlFolder - .T. if the name is a folder 9 | * Returns: the file or folder name in the correct case 10 | * Environment in: Scripting.FileSystemObject can be instantiated 11 | * if a public variable named __FSO exists, it may contain a 12 | * reference to Scripting.FileSystemObject 13 | * Environment out: a public variable named __FSO exist contains a reference to 14 | * Scripting.FileSystemObject 15 | *============================================================================== 16 | 17 | lparameters tcName, ; 18 | tlFolder 19 | local loFSO, ; 20 | llExists, ; 21 | loFile, ; 22 | lcName, ; 23 | lcFolder, ; 24 | loFolder 25 | try 26 | if type('__FSO') = 'O' 27 | loFSO = __FSO 28 | else 29 | loFSO = createobject('Scripting.FileSystemObject') 30 | public __FSO 31 | __FSO = loFSO 32 | endif type('__FSO') = 'O' 33 | if tlFolder 34 | llExists = directory(tcName) 35 | else 36 | llExists = file(tcName) 37 | endif tlFolder 38 | do case 39 | case llExists and tlFolder 40 | loFile = loFSO.GetFolder(tcName) 41 | lcName = addbs(loFile.Path) 42 | case llExists 43 | loFile = loFSO.GetFile(tcName) 44 | lcName = loFile.Path 45 | case '\' $ tcName 46 | lcFolder = justpath(tcName) 47 | loFolder = loFSO.GetFolder(lcFolder) 48 | lcName = addbs(loFolder.Path) + lower(justfname(tcName)) 49 | otherwise 50 | lcName = lower(tcName) 51 | endcase 52 | catch 53 | lcName = lower(tcName) 54 | endtry 55 | return lcName 56 | -------------------------------------------------------------------------------- /Source/messageboxextended.prg: -------------------------------------------------------------------------------- 1 | LPARAMETERS tcCaption, tnIcon, tcTitle, tcButtons, tcIconFile 2 | * Written by Cesar Chalom 3 | * http://weblogs.foxite.com/vfpimaging/2012/01/30/extended-messagebox-function-reviewed/ 4 | * description: modifies the Captions of messagebox Buttons 5 | * Parameters: 6 | * tcCaption - the text that appears in the dialog box. 7 | * tnIcon - the Icon sign: 8 | * stop sign: 16 or "x" 9 | * question mark: 32 or "?" 10 | * exclamation point: 48 or "!" 11 | * information: 64 or "i" 12 | * tcTitle - the text that appears in the Title bar of the dialog box 13 | * tcButtons - the Captions to be used in the Buttons using the comma "," delimiter 14 | * use the "&" character to determine the hotkeys to be used - eg: "option&1,option&2,option&3" 15 | * use a "\" to disable the Button 16 | * tcIconFile - the Icon File to replace the default from messagebox() 17 | * returns: the index number according to the option selected - eg. returns the value 3 if the 3rd Button was selected. 18 | * sample: 19 | * =MsgBoxEx("This is a common text", "!", "Window Title", "Option 1,Option 2,Option 3") 20 | 21 | * Special thanks to: 22 | * Herman Tan - Article: 'Centering VFP MessageBox in any Form' 23 | * http://hermantan.blogspot.com/2008/07/centering-vfp-messagebox-in-any-form.html 24 | * Craig boyd - Article: 'BindEvents on Steroids' 25 | * http://www.sweetpotatosoftware.com/spsblog/2005/08/07/bindeventonsteroids.aspx 26 | 27 | LOCAL loMsgB, lnReturn 28 | loMsgB = CREATEOBJECT("xmbMsgBoxEx") 29 | lnReturn = loMsgB.SendMessage(tcCaption, tnIcon, tcTitle, tcButtons, tcIconFile) 30 | loMsgB = NULL 31 | RETURN lnReturn 32 | 33 | DEFINE CLASS xmbMsgBoxEx AS CUSTOM 34 | nButtonCnt = 0 35 | cButtons = "" 36 | nbutttype = 0 37 | cIconFile = "" 38 | hIcon = 0 39 | 40 | PROCEDURE SendMessage 41 | LPARAMETERS tcCaption, tnIcon, tcTitle, tcButtons, tcIconFile 42 | This.cIconFile = IIF(EMPTY(tcIconFile),"", tcIconFile) 43 | This.nButtonCnt = GETWORDCOUNT(tcButtons, ",") 44 | This.cButtons = tcButtons 45 | *!* stop 16 46 | *!* question 32 47 | *!* exclamation 48 48 | *!* info 64 49 | IF VARTYPE(tnIcon) = "C" 50 | tnIcon = UPPER(tnIcon) 51 | DO CASE 52 | CASE tnIcon = "X" 53 | tnIcon = 16 54 | CASE tnIcon = "?" 55 | tnIcon = 32 56 | CASE tnIcon = "!" 57 | tnIcon = 48 58 | CASE tnIcon = "I" 59 | tnIcon = 64 60 | OTHERWISE 61 | tnIcon = 0 62 | ENDCASE 63 | ENDIF 64 | 65 | * check if an Icon will be shown 66 | * if an Icon File was passed, we need to ensure that messagebox() will 67 | * show an Icon, that will be changed further. 68 | 69 | #DEFINE image_bitmap 0 70 | #DEFINE image_Icon 1 71 | #DEFINE lr_loadfromFile 0x0010 72 | #DEFINE lr_defaultsize 0x0040 73 | This.hIcon = 0 74 | IF NOT EMPTY(This.cIconFile) AND ; 75 | (NOT (BITTEST(tnIcon, 4) OR BITTEST(tnIcon, 5) OR BITTEST(tnIcon, 6))) 76 | tnIcon = tnIcon + 16 77 | This.hIcon = xmbLoadImage(0, FULLPATH(This.cIconFile), image_Icon,; 78 | 0,0, lr_loadfromFile + lr_defaultsize) 79 | ENDIF 80 | 81 | * this messagebox will be modified before it is shown 82 | LOCAL lnoption, lnIndex 83 | DO CASE 84 | CASE This.nButtonCnt = 1 85 | This.nbutttype = 0 && ok 86 | CASE This.nButtonCnt = 2 87 | This.nbutttype = 4 && yes / no 88 | CASE This.nButtonCnt = 3 89 | This.nbutttype = 2 && abort / retry / ignore 90 | OTHERWISE 91 | ENDCASE 92 | 93 | BindWinEvent( 0, 0x06, THIS, 'WndProc' ) 94 | lnoption = MESSAGEBOX(tcCaption, tnIcon + This.nbutttype, tcTitle) 95 | UnBindWinEvents( 0, 0x06, THIS, 'WndProc' ) 96 | 97 | LOCAL lnOffset 98 | lnOffset = ICASE(This.nButtonCnt = 3, 2, This.nButtonCnt = 2, 5 , 0) 99 | lnIndex = lnoption - lnOffset 100 | 101 | IF This.hIcon <> 0 102 | =xmbdeleteobject(This.hIcon) && clear Icon handle 103 | ENDIF 104 | 105 | RETURN lnIndex 106 | 107 | ENDPROC 108 | 109 | * Windows event handler procedure 110 | * MSDN WindowProc callback function 111 | * http://msdn.microsoft.com/en-us/library/windows/desktop/ms633573(v=vs.85).aspx 112 | * http://hermantan.blogspot.com/2008/07/centering-vfp-messagebox-in-any-form.html 113 | * Here we will make all the modifications in the Windows dialog 114 | PROCEDURE WndProc( th_Wnd, tn_Msg, t_wParam, t_lParam ) 115 | local wParam 116 | 117 | IF (tn_Msg == 0x06) AND (t_wParam == 0) AND (t_lParam <> 0) 118 | 119 | wParam = t_lParam 120 | 121 | #DEFINE dlg_ctrlid_Icon 0x0014 122 | #DEFINE stm_setIcon 0x0170 123 | #DEFINE stm_setimage 0x0172 124 | IF NOT EMPTY(This.hIcon) 125 | * changing the dialog Icon 126 | LOCAL lhIconwindow 127 | lhIconwindow = xmbGetDlgItem(wParam, dlg_ctrlid_Icon) 128 | IF lhIconwindow <> 0 129 | IF This.hIcon <> 0 130 | =xmbSendMessage(lhIconwindow, stm_setIcon, This.hIcon, 0) 131 | ENDIF 132 | ENDIF 133 | ENDIF 134 | 135 | * Set tansparency 136 | IF VARTYPE(_Screen.xmbMessageboxTransp) = "N" 137 | LOCAL lnTransp 138 | lnTransp = _Screen.xmbMessageboxTransp 139 | IF lnTransp > 30 AND lnTransp < 255 && values lower than 30 generate an almost invisible dialog!!! 140 | lnTransp = MIN(INT(lnTransp), 254) 141 | =xmbSetWindowLong( wParam, -20, ; 142 | BITOR( xmbGetWindowLong( wParam, -20 ), 0x80000 )) 143 | =xmbSetLayeredWindowAttributes( wParam, 0, lnTransp, 2 ) 144 | ENDIF 145 | ENDIF 146 | 147 | * change Button attributes 148 | LOCAL N, lnOffset, lcCaption 149 | lnOffset = ICASE(This.nButtonCnt = 3, 2, This.nButtonCnt = 2, 5 , 0) 150 | LOCAL lnBtnhWnd 151 | FOR N = 1 TO This.nButtonCnt 152 | lcCaption = GETWORDNUM(This.cButtons, N, ",") + CHR(0) 153 | * disable current Button 154 | IF LEFT(lcCaption, 1) = "\" 155 | lcCaption = SUBSTR(lcCaption, 2) && get the rest of the string 156 | lnBtnhWnd = xmbGetDlgItem(wParam, lnOffset + N) 157 | =xmbEnableWindow(lnBtnhWnd, 0) 158 | ENDIF 159 | 160 | * change the Caption 161 | =xmbSetDlgItemtext(wParam, lnOffset + N, lcCaption) 162 | ENDFOR 163 | 164 | ENDIF 165 | 166 | LOCAL pOrgProc 167 | pOrgProc = xmbGetWindowLong( _VFP.hWnd, -4 ) 168 | = xmbCallWindowProc( pOrgProc, th_Wnd, tn_Msg, t_wParam, t_lParam ) 169 | ENDPROC 170 | 171 | ENDDEFINE 172 | 173 | ********************************************************************* 174 | FUNCTION xmbSetDlgItemtext(hdlg, nidDlgItem, lpString) 175 | ********************************************************************* 176 | DECLARE INTEGER SetDlgItemText IN user32 AS xmbsetDlgItemtext ; 177 | LONG hdlg,; 178 | LONG nidDlgItem,; 179 | STRING lpString 180 | RETURN xmbSetDlgItemtext(hdlg, nidDlgItem, lpString) 181 | ENDFUNC 182 | 183 | ********************************************************************* 184 | FUNCTION xmbCallNextHookEx(hhook, ncode, wParam, LParam) 185 | ********************************************************************* 186 | DECLARE LONG callnexthookex IN user32 AS xmbcallnexthookex ; 187 | LONG hhook, LONG ncode, LONG wParam, LONG LParam 188 | RETURN xmbcallnexthookex(hhook, ncode, wParam, LParam) 189 | ENDFUNC 190 | 191 | ********************************************************************* 192 | FUNCTION xmbGetDlgItem(hdlg, nidDlgItem) 193 | ********************************************************************* 194 | * hdlg [in] handle to the dialog box that contains the control. 195 | * nidDlgItem [in] specifies the identifier of the control to be retrieved. 196 | * http://msdn.microsoft.com/en-us/library/ms645481(vs.85).aspx 197 | DECLARE INTEGER GetDlgItem IN user32 AS xmbgetDlgItem ; 198 | LONG hdlg,; 199 | LONG nidDlgItem 200 | RETURN xmbGetDlgItem(hdlg, nidDlgItem) 201 | ENDFUNC 202 | 203 | ********************************************************************* 204 | FUNCTION xmbEnableWindow(hWnd, fEnable) 205 | ********************************************************************* 206 | DECLARE INTEGER EnableWindow IN user32 AS xmbEnablewindow INTEGER hWnd, INTEGER fEnable 207 | RETURN xmbEnableWindow(hWnd, fEnable) 208 | ENDFUNC 209 | 210 | ********************************************************************* 211 | FUNCTION xmbSendMessage(hwindow, msg, wParam, LParam) 212 | ********************************************************************* 213 | * http://msdn.microsoft.com/en-us/library/bb760780(vs.85).aspx 214 | * http://www.news2news.com/vfp/?group=-1&function=312 215 | DECLARE INTEGER SendMessage IN user32 AS xmbsendmessage; 216 | INTEGER hwindow, INTEGER msg,; 217 | INTEGER wParam, INTEGER LParam 218 | RETURN xmbSendMessage(hwindow, msg, wParam, LParam) 219 | ENDFUNC 220 | 221 | ********************************************************************* 222 | FUNCTION xmbLoadImage(hinst, lpszname, utype, cxdesired, cydesired, fuload) 223 | ********************************************************************* 224 | DECLARE INTEGER LoadImage IN user32 AS xmbloadimage; 225 | INTEGER hinst,; 226 | STRING lpszname,; 227 | INTEGER utype,; 228 | INTEGER cxdesired,; 229 | INTEGER cydesired,; 230 | INTEGER fuload 231 | RETURN xmbLoadImage(hinst, lpszname, uType, cxdesired, cydesired, fuload) 232 | ENDFUNC 233 | 234 | ********************************************************************* 235 | FUNCTION xmbDeleteObject(hobject) 236 | ********************************************************************* 237 | DECLARE INTEGER DeleteObject IN gdi32 AS xmbdeleteobject INTEGER hobject 238 | RETURN xmbdeleteobject(hobject) 239 | ENDFUNC 240 | 241 | ********************************************************************* 242 | FUNCTION xmbCallWindowProc(lpPrevWndFunc, nhWnd, uMsg, wParam, LParam) 243 | ********************************************************************* 244 | DECLARE LONG CallWindowProc IN User32 ; 245 | AS xmbCallWindowProc ; 246 | LONG lpPrevWndFunc, LONG nhWnd, ; 247 | LONG uMsg, LONG wParam, LONG LParam 248 | 249 | RETURN xmbCallWindowProc(lpPrevWndFunc, nhWnd, uMsg, wParam, LParam) 250 | ENDFUNC 251 | 252 | ********************************************************************* 253 | FUNCTION xmbGetWindowLong(nhWnd, nIndex) 254 | ********************************************************************* 255 | DECLARE LONG GetWindowLong IN User32 ; 256 | AS xmbGetWindowLong ; 257 | LONG nhWnd, INTEGER nIndex 258 | 259 | RETURN xmbGetWindowLong(nhWnd, nIndex) 260 | ENDFUNC 261 | 262 | ********************************************************************* 263 | FUNCTION xmbSetWindowLong(nHWnd, nIndex, nNewVal) 264 | ********************************************************************* 265 | DECLARE INTEGER SetWindowLong In Win32Api ; 266 | AS xmbSetWindowLong ; 267 | INTEGER nHWnd, INTEGER nIndex, INTEGER nNewVal 268 | RETURN xmbSetWindowLong(nHWnd, nIndex, nNewVal) 269 | 270 | ********************************************************************* 271 | FUNCTION xmbSetLayeredWindowAttributes(nHWnd, cColorKey, nOpacity, nFlags) 272 | ********************************************************************* 273 | DECLARE INTEGER SetLayeredWindowAttributes In Win32Api ; 274 | AS xmbSetLayeredWindowAttributes ; 275 | INTEGER nHWnd, STRING cColorKey, ; 276 | INTEGER nOpacity, INTEGER nFlags 277 | RETURN xmbSetLayeredWindowAttributes(nHWnd, cColorKey, nOpacity, nFlags) -------------------------------------------------------------------------------- /Source/projectexplorer.h: -------------------------------------------------------------------------------- 1 | #include ProjectExplorerTreeView.H 2 | #include ProjectExplorerRegistry.H 3 | 4 | #define ccVFP_OPTIONS 'Software\Microsoft\VisualFoxPro\9.0\Options' 5 | && the HKEY_CURRENT_USER location for VFP options 6 | #define ccPROJECT_EXPLORER_KEY 'Software\ProjectExplorer' 7 | && the HKEY_CURRENT_USER location for Project Explorer options 8 | #define ccVERSION_NUMBER '1.0.09273' 9 | && !! DO NOT CHANGE !! -- this is automatically updated by BuildProcess\BuildMe.prg 10 | 11 | #define ccSOLUTION_FILE 'Solution.xml' 12 | && the name of older solution files 13 | #define ccSOLUTION_EXT 'slx' 14 | && the extension for solution files 15 | #define ccMETADATA_FILE '_MetaData.dbf' 16 | && the suffix to add to the project filename for the meta data table 17 | 18 | #define ccHEADER_TYPE 'H' 19 | && the type for header records in the TreeView cursor 20 | #define ccVFPX_PAGE 'http://github.com/DougHennig/ProjectExplorer' 21 | && Project Explorer page on VFPX 22 | #define ccSTACK_SEPARATOR '@' 23 | && the separator used between information of items added to the stack 24 | 25 | * Version control status. 26 | 27 | #define ccVC_STATUS_ADDED 'A' 28 | #define ccVC_STATUS_CLEAN 'C' 29 | #define ccVC_STATUS_UNTRACKED '?' 30 | #define ccVC_STATUS_MODIFIED 'M' 31 | #define ccVC_STATUS_IGNORED 'I' 32 | #define ccVC_STATUS_REMOVED 'R' 33 | #define ccVC_STATUS_UNMERGED 'U' 34 | #define ccGIT_STATUS_REMOVED 'D' 35 | 36 | * Project item types (most are in FOXPRO.H as FILETYPE_* constants). 37 | 38 | #define FILETYPE_REMOTE_VIEW 'r' 39 | #define FILETYPE_LOCAL_VIEW 'l' 40 | #define FILETYPE_CONNECTION 'c' 41 | #define FILETYPE_STORED_PROCEDURE 'p' 42 | #define FILETYPE_CLASS 'Class' 43 | #define FILETYPE_FIELD 'Field' 44 | #define FILETYPE_INDEX 'Index' 45 | #define FILETYPE_TABLE_IN_DBC 't' 46 | #define FILETYPE_PROJECT 'H' 47 | 48 | * Titles of VFP designer windows. 49 | 50 | #define ccTITLE_VIEW_DESIGNER 'View Designer - ' 51 | #define ccTITLE_CONNECTION_DESIGNER 'Connection Designer - ' 52 | #define ccTITLE_STORED_PROCS 'Stored Procedures for ' 53 | #define ccTITLE_QUERY_DESIGNER 'Query Designer - ' 54 | #define ccTITLE_REPORT_DESIGNER 'Report Designer - ' 55 | #define ccTITLE_LABEL_DESIGNER 'Label Designer - ' 56 | #define ccTITLE_FORM_DESIGNER 'Form Designer - ' 57 | #define ccTITLE_MENU_DESIGNER 'Menu Designer - ' 58 | #define ccTITLE_CLASS_DESIGNER 'Class Designer - ' 59 | #define ccTITLE_DATABASE_DESIGNER 'Database Designer - ' 60 | #define ccTITLE_CLASS_BROWSER ' - Class Browser' 61 | 62 | * The descriptive names for the types. 63 | 64 | #define DESC_DATABASE 'Database' 65 | #define DESC_FREETABLE 'Free Table' 66 | #define DESC_QUERY 'Query' 67 | #define DESC_FORM 'Form' 68 | #define DESC_REPORT 'Report' 69 | #define DESC_LABEL 'Label' 70 | #define DESC_CLASSLIB 'Visual Class Library' 71 | #define DESC_PROGRAM 'Program' 72 | #define DESC_APILIB 'API Library' 73 | #define DESC_APPLICATION 'Application' 74 | #define DESC_MENU 'Menu' 75 | #define DESC_TEXT 'Text File' 76 | #define DESC_OTHER 'Other File' 77 | #define DESC_REMOTE_VIEW 'Remote View' 78 | #define DESC_LOCAL_VIEW 'Local View' 79 | #define DESC_CONNECTION 'Connection' 80 | #define DESC_STORED_PROCEDURE 'Stored Procedure' 81 | #define DESC_CLASS 'Class' 82 | #define DESC_FIELD 'Field' 83 | #define DESC_INDEX 'Index' 84 | #define DESC_TABLE_IN_DBC 'Table' 85 | 86 | * Windows events. 87 | 88 | #define WM_DESTROY 0x0002 89 | #define GWL_WNDPROC -4 90 | -------------------------------------------------------------------------------- /Source/projectexplorerabout.sc2: -------------------------------------------------------------------------------- 1 | *-------------------------------------------------------------------------------------------------------------------------------------------------------- 2 | * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! 3 | *-------------------------------------------------------------------------------------------------------------------------------------------------------- 4 | *< FOXBIN2PRG: Version="1.21" SourceFile="projectexplorerabout.scx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) 5 | * 6 | * 7 | #INCLUDE "projectexplorer.h" 8 | 9 | DEFINE CLASS dataenvironment AS dataenvironment 10 | *< CLASSDATA: Baseclass="dataenvironment" Timestamp="" Scale="" Uniqueid="" ClassIcon="1" /> 11 | 12 | * 13 | DataSource = .NULL. 14 | Height = 0 15 | Left = 0 16 | Name = "Dataenvironment" 17 | Top = 0 18 | Width = 0 19 | * 20 | 21 | ENDDEFINE 22 | 23 | DEFINE CLASS frmabout AS projectexplorermodaldialog OF "projectexplorerctrls.vcx" 24 | *< CLASSDATA: Baseclass="form" Timestamp="" Scale="" Uniqueid="" /> 25 | 26 | *-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder 27 | *< OBJECTDATA: ObjPath="imgVFPX" UniqueID="" Timestamp="" /> 28 | *< OBJECTDATA: ObjPath="lblTitle" UniqueID="" Timestamp="" /> 29 | *< OBJECTDATA: ObjPath="imgTitle" UniqueID="" Timestamp="" /> 30 | *< OBJECTDATA: ObjPath="cmdOK" UniqueID="" Timestamp="" /> 31 | *< OBJECTDATA: ObjPath="lblLink" UniqueID="" Timestamp="" /> 32 | *< OBJECTDATA: ObjPath="lblDescription" UniqueID="" Timestamp="" /> 33 | *< OBJECTDATA: ObjPath="lblVersion" UniqueID="" Timestamp="" /> 34 | 35 | * 36 | *p: cversion && The current version number 37 | * 38 | 39 | * 40 | BackColor = 255,255,255 41 | BorderStyle = 2 42 | cversion = 43 | DoCreate = .T. 44 | Height = 179 45 | Name = "frmAbout" 46 | TitleBar = 0 47 | Width = 265 48 | _memberdata = 49 | 50 | 51 | * 52 | 53 | ADD OBJECT 'cmdOK' AS projectexplorerokbutton WITH ; 54 | Left = 175, ; 55 | Name = "cmdOK", ; 56 | Top = 145 57 | *< END OBJECT: ClassLib="projectexplorerbutton.vcx" BaseClass="commandbutton" /> 58 | 59 | ADD OBJECT 'imgTitle' AS image WITH ; 60 | Height = 32, ; 61 | Left = 10, ; 62 | Name = "imgTitle", ; 63 | Picture = images\projectexplorer.ico, ; 64 | Top = 10, ; 65 | Width = 32 66 | *< END OBJECT: BaseClass="image" /> 67 | 68 | ADD OBJECT 'imgVFPX' AS image WITH ; 69 | Height = 16, ; 70 | Left = 10, ; 71 | Name = "imgVFPX", ; 72 | Picture = images\vfpxpoweredby.gif, ; 73 | Top = 150, ; 74 | Width = 76 75 | *< END OBJECT: BaseClass="image" /> 76 | 77 | ADD OBJECT 'lblDescription' AS projectexplorerlabel WITH ; 78 | Caption = "A replacement for the VFP Project Manager", ; 79 | Left = 12, ; 80 | Name = "lblDescription", ; 81 | Top = 58 82 | *< END OBJECT: ClassLib="projectexplorerctrls.vcx" BaseClass="label" /> 83 | 84 | ADD OBJECT 'lblLink' AS projectexplorerlabel WITH ; 85 | Caption = "Visit the Project Explorer VFPX page", ; 86 | FontUnderline = .T., ; 87 | ForeColor = 0,0,255, ; 88 | Left = 10, ; 89 | MousePointer = 15, ; 90 | Name = "lblLink", ; 91 | Top = 120 92 | *< END OBJECT: ClassLib="projectexplorerctrls.vcx" BaseClass="label" /> 93 | 94 | ADD OBJECT 'lblTitle' AS projectexplorerlabel WITH ; 95 | Caption = "Project Explorer", ; 96 | FontSize = 18, ; 97 | Left = 50, ; 98 | Name = "lblTitle", ; 99 | Top = 11 100 | *< END OBJECT: ClassLib="projectexplorerctrls.vcx" BaseClass="label" /> 101 | 102 | ADD OBJECT 'lblVersion' AS projectexplorerlabel WITH ; 103 | Caption = "Version <>", ; 104 | Left = 10, ; 105 | Name = "lblVersion", ; 106 | Top = 80 107 | *< END OBJECT: ClassLib="projectexplorerctrls.vcx" BaseClass="label" /> 108 | 109 | PROCEDURE Init 110 | lparameters tcVersionNumber 111 | dodefault() 112 | This.cVersion = tcVersionNumber 113 | This.lblVersion.Caption = textmerge(This.lblVersion.Caption) 114 | 115 | ENDPROC 116 | 117 | PROCEDURE cmdOK.Click 118 | Thisform.Release() 119 | 120 | ENDPROC 121 | 122 | PROCEDURE lblLink.Click 123 | ExecuteFile(ccVFPX_PAGE) 124 | 125 | ENDPROC 126 | 127 | ENDDEFINE 128 | -------------------------------------------------------------------------------- /Source/projectexplorerabout.sct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerabout.sct -------------------------------------------------------------------------------- /Source/projectexplorerabout.scx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerabout.scx -------------------------------------------------------------------------------- /Source/projectexplorerbutton.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerbutton.vct -------------------------------------------------------------------------------- /Source/projectexplorerbutton.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerbutton.vcx -------------------------------------------------------------------------------- /Source/projectexplorercombotree.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorercombotree.vct -------------------------------------------------------------------------------- /Source/projectexplorercombotree.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorercombotree.vcx -------------------------------------------------------------------------------- /Source/projectexplorercommondialog.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorercommondialog.vct -------------------------------------------------------------------------------- /Source/projectexplorercommondialog.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorercommondialog.vcx -------------------------------------------------------------------------------- /Source/projectexplorerctrls.h: -------------------------------------------------------------------------------- 1 | * Include other include files. 2 | 3 | #include FOXPRO.H 4 | 5 | * Control character constants. 6 | 7 | #define ccCRLF chr(13) + chr(10) 8 | #define ccCR chr(13) 9 | #define ccLF chr(10) 10 | #define ccNULL chr(0) 11 | #define ccTAB chr(9) 12 | #define ccAMP chr(38) 13 | #define ccREGISTERED_MARK chr(174) 14 | #define ccSINGLE_QUOTE chr(39) 15 | #define ccPLACEHOLDER chr(127) 16 | 17 | * Strings to substitute in error and other messages. 18 | 19 | #define ccMSG_INSERT1 '' 20 | #define ccMSG_INSERT2 '' 21 | #define ccMSG_INSERT3 '' 22 | #define ccMSG_INSERT4 '' 23 | 24 | * Error resolution return values. 25 | 26 | #define ccMSG_RETRY 'Retry' 27 | #define ccMSG_CONTINUE 'Continue' 28 | #define ccMSG_CLOSEFORM 'Close Form' 29 | #define ccMSG_QUIT 'Quit' 30 | #define ccMSG_CANCEL 'Cancel' 31 | #define ccMSG_DEBUG 'Debug' 32 | 33 | * Error message strings. 34 | 35 | #define ccMSG_ERROR_NUM 'Error #: ' 36 | #define ccMSG_MESSAGE 'Message: ' 37 | #define ccMSG_LINE_NUM 'Line #: ' 38 | #define ccMSG_CODE 'Code: ' 39 | #define ccMSG_METHOD 'Method: ' 40 | 41 | * AERROR() array dimensions, including added extensions: 42 | 43 | #define cnAERR_NUMBER 1 44 | #define cnAERR_MESSAGE 2 45 | #define cnAERR_OBJECT 3 46 | #define cnAERR_WORKAREA 4 47 | #define cnAERR_TRIGGER 5 48 | #define cnAERR_EXTRA1 6 49 | #define cnAERR_EXTRA2 7 50 | #define cnAERR_METHOD 8 51 | #define cnAERR_LINE 9 52 | #define cnAERR_SOURCE 10 53 | #define cnAERR_DATETIME 11 54 | #define cnAERR_USER 12 55 | #define cnAERR_MAX cnAERR_USER 56 | #define cnAERR_VFP_MAX cnAERR_EXTRA2 57 | 58 | * Windows messages. 59 | 60 | #define WM_DESTROY 0x0002 61 | #define WM_SETTEXT 0x000C 62 | 63 | 64 | * VFP error numbers: 65 | 66 | #define cnERR_FILE_NOT_FOUND 1 67 | * File does not exist 68 | #define cnERR_FILE_IN_USE 3 69 | * File is in use 70 | #define cnERR_DATA_TYPE_MISMATCH 9 71 | * Data type mismatch 72 | #define cnERR_ARGUMENT_INVALID 11 73 | * Function argument value, type, or count is invalid 74 | #define cnERR_ALIAS_NOTFOUND 13 75 | * Alias is not found 76 | #define cnERR_NOT_A_TABLE 15 77 | * Not a table 78 | #define cnERR_INDEX_FILE_TABLE 19 79 | * Index file doesn't match table 80 | #define cnERR_INVALID_SUBSCRIPT 31 81 | * Invalid subscrip reference 82 | #define cnERR_MEMO_FILE_CORRUPT 41 83 | * Memo file is missing or invalid 84 | #define cnERR_NO_FIELDS 47 85 | * No fields found to process 86 | #define cnERR_NO_TABLE_SELECTED 52 87 | * No table is open in the current work area 88 | #define cnERR_ADDITIONAL_PARAMETERS 94 89 | * Must specify additional parameters 90 | #define cnERR_CANNOT_CREATE_FILE 102 91 | * Cannot create file 92 | #define cnERR_FILEINUSE 108 93 | * File in use by another user 94 | #define cnERR_RECINUSE 109 95 | * Record in use by another user 96 | #define cnERR_INDEX_MATCH_TABLE 114 97 | * Index doesn't match table 98 | #define cnERR_PRINTER_NOT_READY 125 99 | * Printer not ready 100 | #define cnERR_INVALID_PATH_OR_FILE 202 101 | * Invalid path or filename 102 | #define cnERR_ARRAYDIM 230 103 | * Array dimensions are invalid 104 | #define cnERR_NOT_AN_ARRAY 232 105 | * Not an array 106 | #define cnERR_USER_DEFINED 1098 107 | * User-defined error 108 | #define cnERR_TOO_FEW_ARGS 1229 109 | * Too few arguments 110 | #define cnERR_SUBSCRIPT_RANGE 1234 111 | * Subscript is outside defined range 112 | #define cnERR_BAND_TOO_LARGE 1298 113 | * Band is too large to fit on a page 114 | #define cnERR_RUN_FAILED 1405 115 | * RUN command failed 116 | #define cnERR_OLE_EXEC_FAIL 1426 117 | * OLE error: remote procedure call failed 118 | #define cnERR_OLE_ERROR 1429 119 | * OLE error 120 | #define cnERR_OLE_OBJECT_CORRUPT 1440 121 | * OLE object may be corrupt 122 | #define cnERR_CONN_HANDLE_INVALID 1466 123 | * Connection handle is invalid 124 | #define cnERR_EXECUTION_CANCELED 1523 125 | * Execution was canceled by user 126 | #define cnODBC_ERROR 1526 127 | * ODBC error 128 | #define cnERR_TRIGGER_FAILED 1539 129 | * Trigger failed 130 | #define cnERR_PROPERTY_INVALID 1560 131 | * Property value invalid 132 | #define cnERR_PRIM_KEY_INVALID 1567 133 | * Primary key property invalid 134 | #define cnERR_NONULLS 1581 135 | * Field does not accept null values 136 | #define cnERR_FIELD_RULE_FAILED 1582 137 | * Field validation rule is violated 138 | #define cnERR_TABLE_RULE_FAILED 1583 139 | * Record validation rule is violated 140 | #define cnERR_RECMODIFIED 1585 141 | * Update conflict 142 | #define cnERR_TAG_NOT_FOUND 1683 143 | * Index tag is not found 144 | #define cnERR_ACCESS_DENIED 1705 145 | * File access is denied 146 | #define cnERR_CDX_NOT_FOUND 1707 147 | * Structural CDX not found 148 | #define cnDB_OBJECT_IN_USE 1709 149 | * Database object is being used by someone else 150 | #define cnERR_PROPERTY_TYPE_INVALID 1732 151 | * Data type invalid for this property 152 | #define cnERR_CLASS_DEF_NOT_FOUND 1733 153 | * Class definition not found 154 | #define cnERR_PROPERTY_NOT_FOUND 1734 155 | * Property not found 156 | #define cnERR_PROPERTY_READ_ONLY 1743 157 | * Property is read-only 158 | #define cnERR_OBJECT_CLASS_INVALID 1744 159 | * Object class is invalid for this container 160 | #define cnERR_CANNOT_FIND_DLL_ENTRY 1754 161 | * Cannot find entry point in DLL 162 | #define cnERR_SQL_COLUMN_NOT_FOUND 1806 163 | * SQL: column not found 164 | #define cnERR_TOO_MANY_FIELDS 1872 165 | * Too many fields 166 | #define cnERR_DUPLKEY 1884 167 | * Uniqueness of index is violated 168 | #define cnERR_COLLATE_NOT_FOUND 1915 169 | * Collate sequence not found 170 | #define cnERR_MEMBER_NOT_OBJECT 1943 171 | * Member does not evaluate to object 172 | #define cnERR_PRINTER_DRIVER 1958 173 | * Error loading printer driver 174 | #define cnERR_DE_UNLOADED 1967 175 | * Data environment is already unloaded 176 | #define cnERR_TABLE_IN_USE 1995 177 | * Error loading the data environment: table is in use 178 | #define cnERR_TABLE_MOVED 2004 179 | * The table has moved 180 | #define cnERR_CANT_SET_FOCUS 2012 181 | * Cannot call SetFocus from within a When, Valid ... 182 | #define cnERR_INVALID_DATE 2034 183 | * Date/DateTime evaluated to an invalid value 184 | #define cnERR_KEY_MUST_BE_SPECIFIED 2063 185 | * A Key must be specified when adding an item to this collection. 186 | -------------------------------------------------------------------------------- /Source/projectexplorerctrls.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerctrls.vct -------------------------------------------------------------------------------- /Source/projectexplorerctrls.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerctrls.vcx -------------------------------------------------------------------------------- /Source/projectexplorerengine.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerengine.vct -------------------------------------------------------------------------------- /Source/projectexplorerengine.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerengine.vcx -------------------------------------------------------------------------------- /Source/projectexplorerexplorer.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerexplorer.vct -------------------------------------------------------------------------------- /Source/projectexplorerexplorer.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerexplorer.vcx -------------------------------------------------------------------------------- /Source/projectexplorerfilectrls.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerfilectrls.vct -------------------------------------------------------------------------------- /Source/projectexplorerfilectrls.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerfilectrls.vcx -------------------------------------------------------------------------------- /Source/projectexplorergetfilename.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Function: ProjectExplorerGetFileName 3 | * Purpose: Displays a file selection dialog 4 | * Author: Doug Hennig 5 | * Last revision: 06/28/2018 6 | * Parameters: tcExtensions - the extensions to use, using the format: 7 | * Description (*.ext1, *.ext2):EXT2,EXT2; 8 | * Description (*.ext1, *.ext2):EXT1,EXT2 9 | * tcFileName - the default filename or default folder 10 | * tcCaption - the caption for the dialog 11 | * tlSaveDialog - .T. to display a save dialog 12 | * tnFilterIndex - the filter index to use (optional) 13 | * tlMultiSelect - .T. to allow multiple files to be selected 14 | * Returns: the filename chosen by the user or blank if none was chosen 15 | * (if tlMultiSelect is .T., the filenames are separated by 16 | * CR) 17 | * Environment in: ProjectExplorerCommonDialog.vcx is available 18 | * Environment out: none 19 | *============================================================================== 20 | 21 | lparameters tcExtensions, ; 22 | tcFileName, ; 23 | tcCaption, ; 24 | tlSaveDialog, ; 25 | tnFilterIndex, ; 26 | tlMultiSelect 27 | local loCommonDialog, ; 28 | lnTypes, ; 29 | laTypes[1], ; 30 | lnI, ; 31 | lcExt, ; 32 | lnPos, ; 33 | lcDescrip, ; 34 | lcExten, ; 35 | lnExt, ; 36 | laExt[1], ; 37 | lnJ, ; 38 | lcFileName 39 | #define ccCR chr(13) 40 | loCommonDialog = newobject('ProjectExplorerCommonDialog', ; 41 | 'ProjectExplorerCommonDialog.vcx') 42 | with loCommonDialog 43 | do case 44 | case empty(tcFileName) 45 | case empty(justext(tcFileName)) 46 | .cInitialDirectory = tcFileName 47 | otherwise 48 | .cFileName = tcFileName 49 | .cInitialDirectory = justpath(tcFileName) 50 | endcase 51 | if not empty(tcCaption) 52 | .cTitleBarText = tcCaption 53 | endif not empty(tcCaption) 54 | .nFilterIndex = evl(tnFilterIndex, 0) 55 | .lAllowMultiSelect = tlMultiSelect 56 | 57 | * Extensions are formatted as Description (*.ext):ext; Description (*.ext):ext 58 | * If there are multiple extensions for a given type, format it as: 59 | * Description (*.ext1, *.ext2):ext1,ext2; Description (*.ext):ext 60 | 61 | if not empty(tcExtensions) 62 | lnTypes = alines(laTypes, tcExtensions, .T., ';') 63 | .ClearFilters(.T.) 64 | for lnI = 1 to lnTypes 65 | lcExt = laTypes[lnI] 66 | if ':' $ lcExt 67 | lnPos = at(':', lcExt) 68 | lcDescrip = alltrim(left(lcExt, lnPos - 1)) 69 | lcExten = alltrim(substr(lcExt, lnPos + 1)) 70 | else 71 | lcDescrip = alltrim(lcExt) 72 | lcExten = lcExt 73 | endif ':' $ lcExt 74 | 75 | * There may be multiple extensions for this filter type, so handle that. 76 | 77 | lnExt = alines(laExt, lcExten, .T., ',') 78 | lcExten = '' 79 | for lnJ = 1 to lnExt 80 | lcExten = lcExten + iif(empty(lcExten), '', ';') + '*.' + ; 81 | laExt[lnJ] 82 | next lnJ 83 | if .nFilterIndex = 0 and upper(justext(.cFileName)) $ upper(lcExten) 84 | .nFilterIndex = lnI 85 | endif .nFilterIndex = 0 ... 86 | .AddFilter(lcDescrip, lcExten) 87 | next lnI 88 | endif not empty(tcExtensions) 89 | .lSaveDialog = tlSaveDialog 90 | .ShowDialog() 91 | if tlMultiSelect 92 | lcFileName = '' 93 | for lnI = 1 to .nFileCount 94 | lcFileName = lcFileName + addbs(.cFilePath) + .aFileNames[lnI] + ; 95 | ccCR 96 | next lnI 97 | else 98 | lcFileName = addbs(.cFilePath) + .cFileTitle 99 | endif tlMultiSelect 100 | endwith 101 | return lcFileName 102 | -------------------------------------------------------------------------------- /Source/projectexplorergetinput.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Method: ProjectExplorerGetInput 3 | * Purpose: A replacement for the VFP INPUTBOX function 4 | * Author: Doug Hennig 5 | * Last Revision: 06/26/2018 6 | * Parameters: tcPrompt - the prompt for the dialog 7 | * tcCaption - the caption for the dialog 8 | * tcDefault - the default value 9 | * tcCancelValue - the value to return if the user cancelled 10 | * (optional: blank is returned if not specified) 11 | * tlVFPName - .T. if the value must be a valid VFP name 12 | * Returns: the value the user entered if they clicked OK or the value 13 | * in tcCancelValue if not 14 | * Environment in: none 15 | * Environment out: none 16 | *============================================================================== 17 | 18 | lparameters tcPrompt, ; 19 | tcCaption, ; 20 | tcDefault, ; 21 | tcCancelValue, ; 22 | tlVFPName 23 | local loForm, ; 24 | lcReturn 25 | loForm = newobject('ProjectExplorerModalDialog', 'ProjectExplorerCtrls.vcx') 26 | loForm.Caption = evl(tcCaption, 'Input Value') 27 | loForm.NewObject('lblPrompt', 'ProjectExplorerLabel', ; 28 | 'ProjectExplorerCtrls.vcx') 29 | with loForm.lblPrompt 30 | .Caption = tcPrompt 31 | .Visible = .T. 32 | .Left = 10 33 | .Top = 10 34 | endwith 35 | if tlVFPName 36 | loForm.NewObject('txtValue', 'ProjectExplorerVFPNameTextBox', ; 37 | 'ProjectExplorerUI.vcx') 38 | else 39 | loForm.NewObject('txtValue', 'ProjectExplorerTextBox', ; 40 | 'ProjectExplorerCtrls.vcx') 41 | endif tlVFPName 42 | with loForm.txtValue 43 | .Visible = .T. 44 | .Left = 10 45 | .Top = loForm.lblPrompt.Top + loForm.lblPrompt.Height + 5 46 | .Width = 380 47 | .Value = evl(tcDefault, '') 48 | endwith 49 | loForm.Width = loForm.txtValue.Width + 2 * loForm.txtValue.Left 50 | loForm.NewObject('cmdOK', 'ProjectExplorerOKButton', ; 51 | 'ProjectExplorerButton.vcx') 52 | with loForm.cmdOK 53 | .Visible = .T. 54 | .Left = (loForm.Width - (.Width * 2 + 5))/2 55 | .Top = loForm.txtValue.Top + loForm.txtValue.Height + 10 56 | endwith 57 | loForm.NewObject('cmdCancel', 'ProjectExplorerCancelButton', ; 58 | 'ProjectExplorerButton.vcx') 59 | with loForm.cmdCancel 60 | .Visible = .T. 61 | .Left = loForm.cmdOK.Left + loForm.cmdOK.Width + 5 62 | .Top = loForm.cmdOK.Top 63 | endwith 64 | loForm.Height = loForm.cmdOK.Top + loForm.cmdOK.Height + 6 65 | loForm.Show() 66 | if vartype(loForm) = 'O' 67 | lcReturn = trim(loForm.txtValue.Value) 68 | else 69 | lcReturn = evl(tcCancelValue, '') 70 | endif vartype(loForm) = 'O' 71 | return lcReturn 72 | -------------------------------------------------------------------------------- /Source/projectexploreritems.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexploreritems.vct -------------------------------------------------------------------------------- /Source/projectexploreritems.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexploreritems.vcx -------------------------------------------------------------------------------- /Source/projectexplorerlabelledbox.vc2: -------------------------------------------------------------------------------- 1 | *-------------------------------------------------------------------------------------------------------------------------------------------------------- 2 | * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! 3 | *-------------------------------------------------------------------------------------------------------------------------------------------------------- 4 | *< FOXBIN2PRG: Version="1.21" SourceFile="projectexplorerlabelledbox.vcx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) 5 | * 6 | * 7 | DEFINE CLASS projectexplorerlabelledbox AS projectexplorercontainer OF "projectexplorerctrls.vcx" && Provides a box with a label on it 8 | *< CLASSDATA: Baseclass="container" Timestamp="" Scale="Pixels" Uniqueid="" /> 9 | 10 | *-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder 11 | *< OBJECTDATA: ObjPath="shpBox" UniqueID="" Timestamp="" /> 12 | *< OBJECTDATA: ObjPath="lblLabel" UniqueID="" Timestamp="" /> 13 | 14 | * 15 | *m: height_assign 16 | *m: width_assign 17 | * 18 | 19 | * 20 | builder = projectexplorerlabelledboxbuilder.prg 21 | Height = 100 22 | Name = "projectexplorerlabelledbox" 23 | Style = 3 24 | Width = 200 25 | _memberdata = 26 | 27 | 28 | 29 | * 30 | 31 | ADD OBJECT 'lblLabel' AS projectexplorerlabel WITH ; 32 | BackStyle = 1, ; 33 | Caption = " Box Label ", ; 34 | Left = 10, ; 35 | Name = "lblLabel", ; 36 | Style = 3, ; 37 | Top = 0 38 | *< END OBJECT: ClassLib="projectexplorerctrls.vcx" BaseClass="label" /> 39 | 40 | ADD OBJECT 'shpBox' AS projectexplorershape WITH ; 41 | Height = 94, ; 42 | Left = 0, ; 43 | Name = "shpBox", ; 44 | Style = 3, ; 45 | Top = 6, ; 46 | Width = 200 47 | *< END OBJECT: ClassLib="projectexplorerctrls.vcx" BaseClass="shape" /> 48 | 49 | PROCEDURE enabled_assign 50 | lparameters tlEnabled 51 | dodefault(tlEnabled) 52 | This.lblLabel.Style = iif(tlEnabled, 3, 4) 53 | 54 | ENDPROC 55 | 56 | PROCEDURE height_assign 57 | lparameters tnValue 58 | This.Height = tnValue 59 | This.shpBox.Height = tnValue - This.shpBox.Top 60 | 61 | ENDPROC 62 | 63 | PROCEDURE Init 64 | * If we're on an opaque container, use its BackColor for the label. 65 | 66 | if pemstatus(This.Parent, 'BackStyle', 5) and This.Parent.BackStyle = 1 67 | This.lblLabel.BackColor = This.Parent.BackColor 68 | This.lblLabel.Style = 0 69 | endif pemstatus(This.Parent, 'BackStyle', 5) ... 70 | 71 | ENDPROC 72 | 73 | PROCEDURE width_assign 74 | lparameters tnValue 75 | store tnValue to This.Width, This.shpBox.Width 76 | 77 | ENDPROC 78 | 79 | PROCEDURE lblLabel.Init 80 | This.BackColor = This.Parent.Parent.BackColor 81 | if sys(2700) = '0' 82 | This.FontBold = .T. 83 | endif sys(2700) = '0' 84 | dodefault() 85 | 86 | ENDPROC 87 | 88 | ENDDEFINE 89 | -------------------------------------------------------------------------------- /Source/projectexplorerlabelledbox.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerlabelledbox.vct -------------------------------------------------------------------------------- /Source/projectexplorerlabelledbox.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerlabelledbox.vcx -------------------------------------------------------------------------------- /Source/projectexplorerlabelledboxbuilder.prg: -------------------------------------------------------------------------------- 1 | lparameters tu1, ; 2 | tu2, ; 3 | tu3 4 | local laObjects[1], ; 5 | loObject, ; 6 | lcCaption 7 | aselobj(laObjects) 8 | loObject = laObjects[1] 9 | with loObject 10 | .shpBox.Width = .Width 11 | .shpBox.Height = .Height - .shpBox.Top 12 | lcCaption = inputbox('Caption:', 'Labeled Box Builder', .lblLabel.Caption) 13 | if not empty(lcCaption) 14 | .lblLabel.Caption = lcCaption 15 | endif not empty(lcCaption) 16 | endwith 17 | -------------------------------------------------------------------------------- /Source/projectexplorermain.prg: -------------------------------------------------------------------------------- 1 | *============================================================================== 2 | * Program: ProjectExplorerMain.prg 3 | * Purpose: Startup program for Project Explorer 4 | * Author: Doug Hennig 5 | * Last Revision: 01/13/2024 6 | * Parameters: tuStartupParameter - a parameter to pass to the Project 7 | * Explorer (optional) 8 | * tlForcePrompt - .T. to prompt the user to select a 9 | * solution or project 10 | * Returns: none 11 | * Environment in: if we're being run from this PRG, the current folder is 12 | * the root of the source code 13 | * Environment out: _screen.oProjectExplorers is a collection of 14 | * ProjectExplorer objects 15 | * one or more projects may be open 16 | *============================================================================== 17 | 18 | #include ProjectExplorer.H 19 | lparameters tuStartupParameter, ; 20 | tlForcePrompt 21 | local lcCurrTalk, ; 22 | lcCurrPath, ; 23 | lcProgram, ; 24 | lcPath, ; 25 | loRegistry, ; 26 | lnWindowType, ; 27 | llDesktop, ; 28 | llDockable, ; 29 | lnDockPosition, ; 30 | loProjectExplorer 31 | 32 | * Save the current TALK setting and turn it off. 33 | 34 | if set('TALK') = 'ON' 35 | set talk off 36 | lcCurrTalk = 'ON' 37 | else 38 | lcCurrTalk = 'OFF' 39 | endif set('TALK') = 'ON' 40 | 41 | * Set a path if we're not running from an APP so we can find our files. 42 | 43 | lcProgram = sys(16, program(-1)) 44 | lcCurrPath = set('PATH') 45 | lcPath = justpath(lcProgram) 46 | if 'MAIN.FXP' $ lcProgram and not lcPath $ upper(lcCurrPath) 47 | lcPath = left(lcPath, rat('\', lcPath) - 1) 48 | set path to lcPath + ',' + lcPath + '\Source,' + lcPath + ; 49 | '\Source\Images' additive 50 | endif 'MAIN.FXP' $ lcProgram ... 51 | 52 | * Create a collection of ProjectExplorers in _screen so there can be more than 53 | * one and they can live once this program is done. 54 | 55 | if type('_screen.oProjectExplorers.Name') <> 'C' 56 | addproperty(_screen, 'oProjectExplorers', ; 57 | newobject('ProjectExplorerCollection', 'ProjectExplorerCtrls.vcx')) 58 | endif type('_screen.oProjectExplorers.Name') <> 'C' 59 | 60 | * See what type of window to use (note the Desktop and Dockable keys are used 61 | * for backward compatibility). 62 | 63 | loRegistry = newobject('ProjectExplorerRegistry', ; 64 | 'ProjectExplorerRegistry.vcx') 65 | lnWindowType = val(loRegistry.GetKey(ccPROJECT_EXPLORER_KEY, 'WindowType', '0')) 66 | if lnWindowType > 0 67 | llDesktop = lnWindowType = 1 68 | llDockable = lnWindowType = 2 69 | else 70 | llDesktop = loRegistry.GetKey(ccPROJECT_EXPLORER_KEY, 'Desktop', 'Y') = 'Y' 71 | llDockable = loRegistry.GetKey(ccPROJECT_EXPLORER_KEY, 'Dockable', 'Y') = 'Y' 72 | endif lnWindowType > 0 73 | lnDockPosition = val(loRegistry.GetKey(ccPROJECT_EXPLORER_KEY, 'DockPosition', '-1')) 74 | 75 | * Run the ProjectExplorer form and add it to the collection. 76 | 77 | loProjectExplorer = newobject(icase(llDockable, 'ProjectExplorerFormDockable', ; 78 | llDesktop, 'ProjectExplorerFormDesktop', ; 79 | 'ProjectExplorerForm'), 'ProjectExplorerUI.vcx', '', tuStartupParameter, ; 80 | tlForcePrompt) 81 | if vartype(loProjectExplorer) = 'O' 82 | _screen.oProjectExplorers.Add(loProjectExplorer, ; 83 | loProjectExplorer.cSolutionFile) 84 | loProjectExplorer.cCurrPath = lcCurrPath 85 | if llDockable and lnDockPosition >= 0 86 | loProjectExplorer.Dock(lnDockPosition) 87 | endif llDockable ... 88 | loProjectExplorer.Show() 89 | endif vartype(loProjectExplorer) = 'O' 90 | 91 | * Restore the settings we changed. 92 | 93 | if lcCurrTalk = 'ON' 94 | set talk on 95 | endif lcCurrTalk = 'ON' 96 | -------------------------------------------------------------------------------- /Source/projectexplorermenu.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorermenu.vct -------------------------------------------------------------------------------- /Source/projectexplorermenu.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorermenu.vcx -------------------------------------------------------------------------------- /Source/projectexplorerpersist.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerpersist.vct -------------------------------------------------------------------------------- /Source/projectexplorerpersist.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerpersist.vcx -------------------------------------------------------------------------------- /Source/projectexplorerregistry.h: -------------------------------------------------------------------------------- 1 | #include ProjectExplorerCtrls.H 2 | 3 | * Registry constants. 4 | 5 | #define cnSUCCESS 0 6 | #define cnERROR_EOF 259 7 | * no more entries in key 8 | #define cnRESERVED 0 9 | #define cnBUFFER_SIZE 256 10 | * the size of the buffer for the key value 11 | 12 | * Registry key values. 13 | 14 | #define cnHKEY_CLASSES_ROOT -2147483648 15 | #define cnHKEY_CURRENT_USER -2147483647 16 | #define cnHKEY_LOCAL_MACHINE -2147483646 17 | #define cnHKEY_USERS -2147483645 18 | 19 | * Data types. 20 | 21 | #define cnREG_SZ 1 && Data string 22 | #define cnREG_EXPAND_SZ 2 && Unicode string 23 | #define cnREG_BINARY 3 && Binary 24 | #define cnREG_DWORD 4 && 32-bit number 25 | 26 | * ODBC constants. 27 | 28 | #define ccODBC_DATA_KEY 'Software\ODBC\ODBC.INI\' 29 | #define ccODBC_DRVRS_KEY 'Software\ODBC\ODBCINST.INI\' 30 | #define cnSQL_FETCH_NEXT 1 31 | #define cnSQL_NO_DATA 100 32 | #define cnSQL_SUCCESS_WITH_INFO 1 33 | 34 | * SQLConfigureDataSource API constants. 35 | 36 | #define cnODBC_ADD_DSN 1 37 | #define cnODBC_CONFIG_DSN 2 38 | #define cnODBC_REMOVE_DSN 3 39 | #define cnODBC_ADD_SYS_DSN 4 40 | #define cnODBC_CONFIG_SYS_DSN 5 41 | #define cnODBC_REMOVE_SYS_DSN 6 42 | #define cnODBC_REMOVE_DEFAULT_DSN 7 43 | -------------------------------------------------------------------------------- /Source/projectexplorerregistry.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerregistry.vct -------------------------------------------------------------------------------- /Source/projectexplorerregistry.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerregistry.vcx -------------------------------------------------------------------------------- /Source/projectexplorersettingssource.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Source/projectexplorersplitter.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorersplitter.vct -------------------------------------------------------------------------------- /Source/projectexplorersplitter.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorersplitter.vcx -------------------------------------------------------------------------------- /Source/projectexplorerstack.vc2: -------------------------------------------------------------------------------- 1 | *-------------------------------------------------------------------------------------------------------------------------------------------------------- 2 | * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! 3 | *-------------------------------------------------------------------------------------------------------------------------------------------------------- 4 | *< FOXBIN2PRG: Version="1.21" SourceFile="projectexplorerstack.vcx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) 5 | * 6 | * 7 | DEFINE CLASS projectexplorerstack AS projectexplorercollection OF "projectexplorerctrls.vcx" 8 | *< CLASSDATA: Baseclass="collection" Timestamp="" Scale="Pixels" Uniqueid="" /> 9 | 10 | * 11 | *m: pop && Pops an item off the stack 12 | *m: push && Pushes an item onto the stack 13 | * 14 | 15 | * 16 | Name = "projectexplorerstack" 17 | _memberdata = 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | * 40 | 41 | PROCEDURE pop && Pops an item off the stack 42 | local luValue 43 | with This 44 | if .Count > 0 45 | luValue = .Item(.Count) 46 | .Remove(.Count) 47 | else 48 | luValue = .NULL. 49 | endif This.Count > 0 50 | endwith 51 | return luValue 52 | 53 | ENDPROC 54 | 55 | PROCEDURE push && Pushes an item onto the stack 56 | lparameters tuValue 57 | This.Add(tuValue) 58 | 59 | ENDPROC 60 | 61 | ENDDEFINE 62 | -------------------------------------------------------------------------------- /Source/projectexplorerstack.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerstack.vct -------------------------------------------------------------------------------- /Source/projectexplorerstack.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerstack.vcx -------------------------------------------------------------------------------- /Source/projectexplorertreeview.h: -------------------------------------------------------------------------------- 1 | #include ProjectExplorerCtrls.H 2 | 3 | * Constants for converting twips to pixels. 4 | 5 | #define cnLOG_PIXELS_X 88 6 | * From WINGDI.H 7 | #define cnLOG_PIXELS_Y 90 8 | * From WINGDI.H 9 | #define cnTWIPS_PER_INCH 1440 10 | * 1440 twips per inch 11 | 12 | * Other constants. 13 | 14 | #define ccLOADING 'Loading...' 15 | * text for "dummy" node when child nodes aren't loaded at the start 16 | #define ccKEY_SEPARATOR '~' 17 | * the character used to separate parts of the key 18 | -------------------------------------------------------------------------------- /Source/projectexplorertreeview.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorertreeview.vct -------------------------------------------------------------------------------- /Source/projectexplorertreeview.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorertreeview.vcx -------------------------------------------------------------------------------- /Source/projectexplorerui.vc2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerui.vc2 -------------------------------------------------------------------------------- /Source/projectexplorerui.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerui.vct -------------------------------------------------------------------------------- /Source/projectexplorerui.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/projectexplorerui.vcx -------------------------------------------------------------------------------- /Source/putprop.prg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/putprop.prg -------------------------------------------------------------------------------- /Source/runcommand.prg: -------------------------------------------------------------------------------- 1 | DEFINE CLASS msdos As Custom 2 | #DEFINE SW_HIDE 0 3 | #DEFINE DUPLICATE_SAME_ACCESS 2 4 | #DEFINE STARTF_USESTDHANDLES 0x0100 5 | #DEFINE STARTF_USESHOWWINDOW 1 6 | 7 | #DEFINE SECURITYATTR_SIZE 12 8 | #DEFINE STARTUPINFO_SIZE 68 9 | #DEFINE FILEINFO_SIZE 52 10 | #DEFINE crlf CHR(13)+CHR(10) 11 | #DEFINE MsdosShell "cmd.exe" 12 | 13 | PROTECTED hChildStdinWrdup, hChildStdoutRddup,; 14 | hMsdosProcess, hMsdosThread 15 | hChildStdinWrdup=0 16 | hChildStdoutRddup=0 17 | hMsdosProcess=0 18 | hMsdosThread=0 19 | 20 | PROCEDURE Init 21 | THIS.declare 22 | 23 | PROCEDURE Destroy 24 | THIS.ReleaseMsdosSession 25 | 26 | PROCEDURE RunCommand(cCommand) 27 | IF NOT THIS.ValidMsdosSession() 28 | IF NOT THIS.CreateMsdosSession() 29 | RETURN "" 30 | ENDIF 31 | ENDIF 32 | THIS.WriteToPipe(cCommand + crlf) 33 | 34 | PROCEDURE GetResponse 35 | LOCAL cResponse 36 | cResponse = THIS.ReadFromPipe() 37 | cResponse = STRTRAN(cResponse, CHR(13)+CHR(13), CHR(13)) 38 | RETURN m.cResponse 39 | 40 | FUNCTION CreateMsdosSession 41 | THIS.ReleaseMsdosSession 42 | 43 | LOCAL hChildStdinRd, hChildStdinWr, hChildStdinWrdup,; 44 | hChildStdoutRd, hChildStdoutWr, hChildStdoutRddup,; 45 | cSecurityAttributes, hProcess, cProcInfo, cStartupInfo, hThread 46 | 47 | STORE 0 TO hChildStdinRd, hChildStdinWr, hChildStdinWrdup,; 48 | hChildStdoutRd, hChildStdoutWr, hChildStdoutRddup 49 | 50 | hProcess = GetCurrentProcess() 51 | 52 | * allocate and populate SECURITY_ATTRIBUTES structure 53 | * note that bInheritHandle is set to True 54 | cSecurityAttributes = num2dword(SECURITYATTR_SIZE) +; 55 | num2dword(0) + num2dword(1) 56 | 57 | * create STDOUT pipe and noninheritable read handle 58 | * to be used with ReadFromPipe method 59 | = CreatePipe(@m.hChildStdoutRd, @m.hChildStdoutWr,; 60 | @cSecurityAttributes, 0) 61 | = DuplicateHandle(m.hProcess, hChildStdoutRd, m.hProcess,; 62 | @hChildStdoutRddup, 0, 0, DUPLICATE_SAME_ACCESS) 63 | 64 | * create STDIN pipe and noninheritable write handle 65 | * to be used with WriteToPipe method 66 | = CreatePipe(@hChildStdinRd, @hChildStdinWr,; 67 | @cSecurityAttributes, 0) 68 | = DuplicateHandle(m.hProcess, hChildStdinWr, m.hProcess,; 69 | @hChildStdinWrdup, 0, 0, DUPLICATE_SAME_ACCESS) 70 | 71 | * allocate space for STARTUPINFO structure 72 | cStartupInfo = PADR(Chr(STARTUPINFO_SIZE), STARTUPINFO_SIZE, Chr(0)) 73 | 74 | * set dwFlags member of STARTUPINFO 75 | * using STARTF_USESHOWWINDOW flag with wShowWindow=0 76 | * will create hidden msdos shell window 77 | cStartupInfo = STUFF(cStartupInfo, 45, 4,; 78 | num2dword(STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW)) 79 | 80 | * set hStdInput member to the read handle of STDIN pipe 81 | cStartupInfo = STUFF(cStartupInfo, 57, 4,; 82 | num2dword(m.hChildStdinRd)) && IN 83 | 84 | * set hStdOutput member to the write handle of STDOUT pipe 85 | cStartupInfo = STUFF(cStartupInfo, 61, 4,; 86 | num2dword(m.hChildStdoutWr)) && OUT 87 | 88 | * set hStdError member to the write handle of STDOUT pipe 89 | cStartupInfo = STUFF(cStartupInfo, 65, 4,; 90 | num2dword(m.hChildStdoutWr)) && ERR 91 | 92 | * allocate space for PROCESS_INFORMATION structure 93 | cProcInfo = REPLICATE(Chr(0), 16) 94 | 95 | * create child process -- msdos shell window 96 | * note that bInheritHandles input parameter is set to True 97 | = CreateProcess(THIS.GetSysDir() + "\" + MsdosShell, "",; 98 | 0,0, 1, 0,0, SYS(5)+SYS(2003), @cStartupInfo, @cProcInfo) 99 | 100 | * retrieve process and thread handles for the created msdos shell 101 | * from the PROCESS_INFORMATION structure 102 | hProcess = buf2dword(SUBSTR(cProcInfo, 1,4)) 103 | hThread = buf2dword(SUBSTR(cProcInfo, 5,4)) 104 | 105 | THIS.hChildStdoutRddup = m.hChildStdoutRddup 106 | THIS.hChildStdinWrdup = m.hChildStdinWrdup 107 | 108 | * close inheritable handles 109 | = CloseHandle(m.hChildStdinRd) 110 | = CloseHandle(m.hChildStdinWr) 111 | = CloseHandle(m.hChildStdoutRd) 112 | = CloseHandle(m.hChildStdoutWr) 113 | 114 | IF THIS.ValidMsdosSession() 115 | * store process and thread handles in class properties; 116 | * on exit you will need them to terminate the msdos shell process 117 | THIS.hMsdosProcess = m.hProcess 118 | THIS.hMsdosThread = m.hThread 119 | RETURN .T. 120 | ELSE 121 | * failed to start msdos shell as a child process 122 | THIS.ReleaseMsdosSession 123 | RETURN .F. 124 | ENDIF 125 | 126 | FUNCTION ValidMsdosSession 127 | RETURN (THIS.hChildStdoutRddup <> 0); 128 | AND (THIS.hChildStdinWrdup <> 0) 129 | 130 | PROTECTED PROCEDURE ReleaseMsdosSession 131 | = CloseHandle(THIS.hChildStdinWrdup) 132 | = CloseHandle(THIS.hChildStdoutRddup) 133 | STORE 0 TO THIS.hChildStdinWrdup, THIS.hChildStdoutRddup 134 | IF THIS.hMsdosProcess <> 0 135 | = TerminateProcess(THIS.hMsdosProcess, 0) 136 | = CloseHandle(THIS.hMsdosProcess) 137 | = CloseHandle(THIS.hMsdosThread) 138 | STORE 0 TO THIS.hMsdosProcess, THIS.hMsdosThread 139 | ENDIF 140 | 141 | PROTECTED PROCEDURE WriteToPipe(cWrite) 142 | LOCAL nWritten 143 | nWritten=0 144 | IF WriteFile(THIS.hChildStdinWrdup, @cWrite,; 145 | LEN(cWrite), @nWritten, 0) = 0 146 | RETURN 0 147 | ENDIF 148 | RETURN m.nWritten 149 | 150 | PROTECTED PROCEDURE ReadFromPipe 151 | LOCAL cBuffer, nBytes, cRead, nRead 152 | cBuffer = REPLICATE(CHR(0), FILEINFO_SIZE) 153 | 154 | = GetFileInformationByHandle(; 155 | THIS.hChildStdoutRddup, @cBuffer) 156 | nBytes = buf2dword(SUBSTR(cBuffer, 37,4)) 157 | 158 | IF nBytes = 0 && nothing to read 159 | RETURN "" 160 | ENDIF 161 | 162 | cRead = REPLICATE(CHR(0), 16384) 163 | nRead = 0 164 | IF ReadFile(THIS.hChildStdoutRddup, @cRead,; 165 | LEN(cRead), @nRead, 0) = 0 166 | RETURN "" 167 | ENDIF 168 | RETURN SUBSTR(cRead, 1, nRead) 169 | 170 | PROTECTED PROCEDURE GetSysDir 171 | LOCAL cBuffer, nBufsize 172 | cBuffer = REPLICATE(CHR(0), 260) 173 | nBufsize = GetSystemDirectory(@cBuffer, LEN(cBuffer)) 174 | RETURN SUBSTR(cBuffer, 1, nBufsize) 175 | 176 | PROTECTED PROCEDURE declare 177 | DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject 178 | DECLARE INTEGER GetCurrentProcess IN kernel32 179 | 180 | DECLARE INTEGER CreatePipe IN kernel32; 181 | INTEGER @hReadPipe, INTEGER @hWritePipe,; 182 | STRING @lpPipeAttributes, LONG nSize 183 | 184 | DECLARE INTEGER ReadFile IN kernel32; 185 | INTEGER hFile, STRING @lpBuffer, INTEGER nBytesToRead,; 186 | INTEGER @lpBytesRead, INTEGER lpOverlapped 187 | 188 | DECLARE INTEGER WriteFile IN kernel32; 189 | INTEGER hFile, STRING @lpBuffer, INTEGER nBt2Write,; 190 | INTEGER @lpBtWritten, INTEGER lpOverlapped 191 | 192 | DECLARE INTEGER GetFileInformationByHandle IN kernel32; 193 | INTEGER hFile, STRING @lpFileInformation 194 | 195 | DECLARE INTEGER DuplicateHandle IN kernel32; 196 | INTEGER hSourceProcessHandle, INTEGER hSourceHandle,; 197 | INTEGER hTargetProcessHandle, INTEGER @lpTargetHandle,; 198 | LONG dwDesiredAccess, INTEGER bInheritHandle, INTEGER dwOptions 199 | 200 | DECLARE INTEGER CreateProcess IN kernel32; 201 | STRING lpApplicationName, STRING lpCommandLine,; 202 | INTEGER lpProcessAttr, INTEGER lpThreadAttr,; 203 | INTEGER bInheritHandles, INTEGER dwCreationFlags,; 204 | INTEGER lpEnvironment, STRING lpCurrentDirectory,; 205 | STRING @lpStartupInfo, STRING @lpProcessInformation 206 | 207 | DECLARE INTEGER GetSystemDirectory IN kernel32; 208 | STRING @lpBuffer, INTEGER nSize 209 | 210 | DECLARE INTEGER TerminateProcess IN kernel32; 211 | INTEGER hProcess, INTEGER uExitCode 212 | ENDDEFINE 213 | 214 | FUNCTION buf2dword(lcBuffer) 215 | RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ; 216 | BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +; 217 | BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +; 218 | BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24) 219 | 220 | FUNCTION num2dword(lnValue) 221 | #DEFINE m0 256 222 | #DEFINE m1 65536 223 | #DEFINE m2 16777216 224 | IF lnValue < 0 225 | lnValue = 0x100000000 + lnValue 226 | ENDIF 227 | LOCAL b0, b1, b2, b3 228 | b3 = Int(lnValue/m2) 229 | b2 = Int((lnValue - b3*m2)/m1) 230 | b1 = Int((lnValue - b3*m2 - b2*m1)/m0) 231 | b0 = Mod(lnValue, m0) 232 | RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3) -------------------------------------------------------------------------------- /Source/tagsource.cdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Source/tagsource.cdx -------------------------------------------------------------------------------- /Source/tagsource.db2: -------------------------------------------------------------------------------- 1 | *-------------------------------------------------------------------------------------------------------------------------------------------------------- 2 | * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! 3 | *-------------------------------------------------------------------------------------------------------------------------------------------------------- 4 | *< FOXBIN2PRG: Version="1.21" SourceFile="tagsource.dbf" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) 5 | * 6 | 7 | 8 | 9 | 10 | 1252 11 | 12 | 13 | 0x00000030 14 | Visual FoxPro 15 | 16 | 17 | 18 | NAME 19 | C 20 | 40 21 | 0 22 | .F. 23 | .F. 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 0 35 | 0 36 | 37 | 38 | BUILTIN 39 | L 40 | 1 41 | 0 42 | .F. 43 | .F. 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 0 55 | 0 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | NAME 66 | REGULAR 67 | UPPER(NAME) 68 | 69 | ASCENDING 70 | MACHINE 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | Classes 82 | .T. 83 | 84 | 85 | 86 | Documents 87 | .T. 88 | 89 | 90 | 91 | Code 92 | .T. 93 | 94 | 95 | 96 | Data 97 | .T. 98 | 99 | 100 | 101 | Other 102 | .T. 103 | 104 | 105 | 106 | 107 | 108 |
109 | 110 | -------------------------------------------------------------------------------- /Source/tagsource.dbf: -------------------------------------------------------------------------------- 1 | 0h*NAMEC(BUILTINL) Classes T Documents T Code T Data T Other T -------------------------------------------------------------------------------- /Source/unbindwinevents.prg: -------------------------------------------------------------------------------- 1 | * Unbind Win event bound with BindWinEvent() 2 | * Allows multiple bindings for single Win Msg 3 | LPARAMETERS thWnd, tnMessage, toEventHandler, tcDelegate 4 | 5 | IF !PEMSTATUS(_SCREEN,"oEventHandler",5) or IsNull(_Screen.oEventHandler) 6 | Return 7 | EndIf 8 | 9 | DO CASE 10 | CASE Pcount() = 1 11 | _Screen.oEventHandler.UnBindEvents(thWnd) 12 | CASE Pcount() = 2 13 | _Screen.oEventHandler.UnBindEvents(thWnd, tnMessage) 14 | Otherwise 15 | _Screen.oEventHandler.UnBindEvents(thWnd, tnMessage, toEventHandler, tcDelegate) 16 | EndCase 17 | -------------------------------------------------------------------------------- /Source/versionnumber.prg: -------------------------------------------------------------------------------- 1 | local lnJulian, ; 2 | lcJulian 3 | lnJulian = val(sys(11, date())) - val(sys(11, {^2000-01-01})) 4 | lcJulian = padl(transform(lnJulian), 4, '0') 5 | _cliptext = '1.0.' + lcJulian 6 | -------------------------------------------------------------------------------- /Source/vfpxwin32eventhandler.prg: -------------------------------------------------------------------------------- 1 | *-*********************************************************************************************** 2 | *-* Written by: Gregory A. Green & Joel Leach 3 | *-* Initial Development: 6 May 2009 4 | *-* 5 | *-* Change History 6 | *-* 6 May 2009 Added check in UnBindEvent to execute UNBINDEVENTS() if no longer requested 7 | *-* Renamed method UnBindEvent to UnBindEvents to match VFP name 8 | *-* 9 | *-* 10 April 2010 Joel Leach made several changes to design and implementation, but overall 10 | *-* concept is the same. 11 | *-*********************************************************************************************** 12 | *-* Class for managing the BINDEVENT() Command for a common foundation for Win32 Events 13 | *-* 14 | *-* && Sample for implementation and use 15 | *-* && Check if class is loaded 16 | *-* IF !PEMSTATUS(_SCREEN,"oEventHandler",5) 17 | *-* _SCREEN.NewObject("oEventHandler","VFPxWin32EventHandler","VFPxWin32EventHandler.prg") 18 | *-* ENDIF 19 | *-* 20 | *-* && To bind to a Win32 Event 21 | *-* _SCREEN.oEventHandler.BindEvent(0, WM_CREATE, this, "MyEventHandler", lnFlags) 22 | *-* 23 | *-* && To unbind to a Win32 Event 24 | *-* lhWnd = 0 25 | *-* lnMessage = WM_CREATE 26 | *-* _SCREEN.oEventHandler.UnBindEvent(lhWnd, lnMessage, loEventHandler, lcDelegate) 27 | *-* Pass 0 to lnMessage to unbind all messages from hWnd/Delegate. 28 | *-* 29 | *-*********************************************************************************************** 30 | #define GWL_WNDPROC (-4) 31 | 32 | DEFINE CLASS VFPxWin32EventHandler AS Collection 33 | bDebug = .F. 34 | hdlDebug = -1 35 | PrevWndFunc = 0 36 | 37 | PROCEDURE BindEvent 38 | LPARAMETERS thWnd, tnMessage, toEventHandler, tcDelegate, tnFlags 39 | LOCAL loBind as WinEvent of VFPxWin32EventHandler.prg, lnNum, lnNdx, lbEventNotBinded, lcKey, lnReturn 40 | LOCAL ARRAY laEvents[1,4] 41 | *-* Add the requested Event Binding to the collection 42 | lcKey = Transform(thWnd) + "~" + Transform(tnMessage) 43 | If this.GetKey(lcKey) = 0 44 | loBind = NewObject("WinEvent", "VFPxWin32EventHandler.prg") 45 | loBind.hWnd = thWnd 46 | loBind.nMessage = tnMessage 47 | loBind.PrevWndFunc = This.PrevWndFunc 48 | this.Add(loBind,lcKey) 49 | * Bind Win event to collection 50 | BindEvent(thWnd, tnMessage, loBind, "EventFired") 51 | Else 52 | loBind = This.Item(lcKey) 53 | EndIf 54 | * Bind collection object to event handler/delegate 55 | IF PCOUNT() = 4 56 | lnReturn = BindEvent(loBind, "EventFired", toEventHandler, tcDelegate) 57 | ELSE 58 | lnReturn = BindEvent(loBind, "EventFired", toEventHandler, tcDelegate, tnFlags) 59 | EndIf 60 | 61 | This.CleanupEvents() 62 | 63 | Return lnReturn 64 | 65 | ENDPROC 66 | 67 | 68 | PROCEDURE Init 69 | IF this.bDebug 70 | this.hdlDebug = FCREATE("GKKWin32EventHandler.log",0) 71 | ENDIF 72 | 73 | IF !('BINDWINEVENTAPI' $ Upper(SET( 'Procedure' ))) 74 | SET PROCEDURE TO BindWinEventAPI ADDITIVE 75 | ENDIF 76 | 77 | * Store handle for use in CallWindowProc 78 | This.PrevWndFunc = GetWindowLong(_Vfp.hWnd, GWL_WNDPROC) 79 | 80 | ENDPROC 81 | 82 | 83 | PROCEDURE Destroy 84 | IF this.bDebug 85 | =FCLOSE(this.hdlDebug) 86 | this.hdlDebug = -1 87 | ENDIF 88 | ENDPROC 89 | 90 | 91 | * Unbind Win events. Supports all UnBindEvents interfaces 92 | Procedure UnBindEvents 93 | LPARAMETERS thWnd, tnMessage, toEventHandler, tcDelegate 94 | Local lcKey, loWinEvent as WinEvent of VFPxWin32EventHandler.prg, lnItem 95 | DO CASE 96 | CASE Pcount() = 1 97 | * UNBINDEVENTS(oEventObject) 98 | * Unbinds all events associated with this object. This includes events that are bound 99 | * to it as an event source and its delegate methods that serve as event handlers. 100 | UnBindEvents(thWnd) 101 | CASE Pcount() = 2 102 | * Unbind specific event/message 103 | UnBindEvents(thWnd, tnMessage) 104 | CASE Pcount() = 4 105 | If !Empty(tnMessage) 106 | * Unbind specific event/message 107 | lcKey = Transform(thWnd) + "~" + Transform(tnMessage) 108 | If This.GetKey(lcKey) <> 0 109 | loWinEvent = This.Item(lcKey) 110 | UnBindEvents(loWinEvent, "EventFired", toEventHandler, tcDelegate) 111 | EndIf 112 | Else 113 | * Unbind all messages for hWnd and delegate 114 | FOR lnItem = 1 to This.Count 115 | loWinEvent = This.Item(lnItem) 116 | If loWinEvent.hWnd = thWnd 117 | UnBindEvents(loWinEvent, "EventFired", toEventHandler, tcDelegate) 118 | EndIf 119 | ENDFOR 120 | EndIf 121 | Otherwise 122 | Assert .f. Message "UnBindEvents requires 1, 2, or 4 parameters. Syntax: " + Chr(13) + Chr(13) + ; 123 | "UnBindEvents(oEventObject)" + Chr(13) + ; 124 | "UnBindEvents(thWnd, tnMessage)" + Chr(13) + ; 125 | "UnBindEvents(thWnd, tnMessage, toEventHandler, tcDelegate)" 126 | ENDCASE 127 | 128 | This.CleanupEvents() 129 | 130 | EndProc 131 | 132 | * Check all events and remove any objects that are no longer used 133 | Procedure CleanupEvents 134 | Local array laObjEvents[1,5], laWinEvents[1,4] 135 | Local lnItem, loWinEvent as WinEvent of VFPxWin32EventHandler.prg, lnRow, llEventFound, lnEvents 136 | 137 | * Array of current Win event bindings 138 | lnEvents = AEvents(laWinEvents, 1) 139 | 140 | * For loops don't work well when removing items from collection 141 | lnItem = 1 142 | Do While lnItem <= This.Count 143 | 144 | llEventFound = .f. 145 | loWinEvent = This.Item(lnItem) 146 | 147 | * Check if there are any bindings for this Win event 148 | For lnRow = 1 to lnEvents 149 | If laWinEvents[lnRow,1] = loWinEvent.hWnd and ; 150 | laWinEvents[lnRow,2] = loWinEvent.nMessage 151 | llEventFound = .t. 152 | Exit 153 | EndIf 154 | EndFor 155 | * No Win events for this object, so remove 156 | If !llEventFound 157 | This.Remove(lnItem) 158 | Loop 159 | EndIf 160 | 161 | * If no bindings to this object, remove 162 | If AEvents(laObjEvents, This.Item(lnItem)) = 0 163 | This.Remove(lnItem) 164 | Loop 165 | EndIf 166 | 167 | lnItem = lnItem + 1 168 | 169 | EndDo 170 | 171 | EndProc 172 | 173 | EndDefine 174 | 175 | DEFINE CLASS WinEvent AS Custom 176 | 177 | hWnd = 0 178 | nMessage = 0 179 | PrevWndFunc = 0 180 | 181 | * Bind events to this method 182 | PROCEDURE EventFired 183 | LPARAMETERS thWnd, tnMessage, twParam, tnParam 184 | Local lnReturn 185 | * Pass message on. Must do here or VFP will crash in some scenarios. 186 | * See https://vfpx.codeplex.com/workitem/33260 187 | lnReturn = CallWindowProc(This.PrevWndFunc, thWnd, tnMessage, twParam, tnParam) 188 | Return lnReturn 189 | ENDPROC 190 | 191 | ENDDEFINE 192 | -------------------------------------------------------------------------------- /Tests/Integration Tests.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/Integration Tests.xlsx -------------------------------------------------------------------------------- /Tests/ProjectAddinsTests.prg: -------------------------------------------------------------------------------- 1 | ******************************************************************************* 2 | define class ProjectAddinsTests as FxuTestCase of FxuTestCase.prg 3 | ******************************************************************************* 4 | #IF .f. 5 | LOCAL THIS AS ProjectAddinsTests OF ProjectAddinsTests.PRG 6 | #ENDIF 7 | 8 | cTestFolder = '' 9 | cTestDataFolder = '' 10 | cTestProgram = '' 11 | icTestPrefix = 'Test_' 12 | 13 | oAddins = .NULL. 14 | cAddinsFolder = '' 15 | lErrorEventRaised = .F. 16 | lExecuteEventRaised = .F. 17 | 18 | ******************************************************************************* 19 | * Setup for the tests 20 | ******************************************************************************* 21 | function Setup 22 | 23 | * Get the folder the tests are running from, the name of this test 24 | * program, and create a test data folder if necessary. 25 | 26 | lcProgram = sys(16) 27 | This.cTestProgram = substr(lcProgram, at(' ', lcProgram, 2) + 1) 28 | This.cTestFolder = addbs(justpath(This.cTestProgram)) 29 | This.cTestDataFolder = This.cTestFolder + 'TestData\' 30 | if not directory(This.cTestDataFolder) 31 | md (This.cTestDataFolder) 32 | endif not directory(This.cTestDataFolder) 33 | 34 | * Set up other things. 35 | 36 | This.cAddinsFolder = This.cTestDataFolder + 'Addins\' 37 | if not directory(This.cAddinsFolder) 38 | md (This.cAddinsFolder) 39 | endif not directory(This.cAddinsFolder) 40 | endfunc 41 | 42 | ******************************************************************************* 43 | * Clean up on exit. 44 | ******************************************************************************* 45 | function TearDown 46 | erase (This.cAddinsFolder + '*.prg') 47 | erase (This.cAddinsFolder + '*.fxp') 48 | erase (This.cAddinsFolder + '*.err') 49 | rd (This.cAddinsFolder) 50 | endfunc 51 | 52 | ******************************************************************************* 53 | * Set up addins object. 54 | ******************************************************************************* 55 | function SetupAddins(tcMethod, tlActive, tcCode, tlReturn) 56 | erase (This.cAddinsFolder + 'addin.prg') 57 | if not empty(tcMethod) 58 | text to lcCode noshow textmerge 59 | lparameters toParameter1, ; 60 | tuParameter2, ; 61 | tuParameter3 62 | if pcount() = 1 63 | toParameter1.Method = '<>' 64 | toParameter1.Active = <> 65 | return 66 | endif 67 | <> 68 | return <> 69 | endtext 70 | strtofile(lcCode, This.cAddinsFolder + 'addin.prg') 71 | endif not empty(tcMethod) 72 | This.oAddins = newobject('ProjectAddins', ; 73 | 'Source\ProjectExplorerEngine.vcx', '', This.cTestDataFolder) 74 | endfunc 75 | 76 | ******************************************************************************* 77 | * Test that ExecuteAddin fails when invalid method passed. 78 | ******************************************************************************* 79 | function Test_ExecuteAddin_Fails_InvalidMethod 80 | This.SetupAddins() 81 | llOK = This.oAddins.ExecuteAddin() 82 | This.AssertFalse(llOK, 'Did not return .F. when nothing passed') 83 | llOK = This.oAddins.ExecuteAddin(5) 84 | This.AssertFalse(llOK, 'Did not return .F. when non-char passed') 85 | llOK = This.oAddins.ExecuteAddin('') 86 | This.AssertFalse(llOK, 'Did not return .F. when blank passed') 87 | endfunc 88 | 89 | ******************************************************************************* 90 | * Test that ExecuteAddin returns .T. when there are no addins 91 | ******************************************************************************* 92 | function Test_ExecuteAddin_ReturnsTrue_NoAddins 93 | This.SetupAddins() 94 | llOK = This.oAddins.ExecuteAddin('test') 95 | This.AssertTrue(llOK, 'Did not return .T. when no addins') 96 | endfunc 97 | 98 | ******************************************************************************* 99 | * Test that ExecuteAddin clears lAddinsExecuted when there are no addins 100 | ******************************************************************************* 101 | function Test_ExecuteAddin_ClearsAddinsExecutedFlag_NoAddins 102 | This.SetupAddins() 103 | This.oAddins.ExecuteAddin('test') 104 | This.AssertFalse(This.oAddins.lAddinsExecuted, ; 105 | 'lAddinsExecuted is .T. when no addins') 106 | endfunc 107 | 108 | ******************************************************************************* 109 | * Test that ExecuteAddin clears lAddinsExecuted when only inactive addins 110 | ******************************************************************************* 111 | function Test_ExecuteAddin_ClearsAddinsExecutedFlag_NoActiveAddins 112 | This.SetupAddins('test', .F., '', .T.) 113 | This.oAddins.ExecuteAddin('test') 114 | This.AssertFalse(This.oAddins.lAddinsExecuted, ; 115 | 'lAddinsExecuted is .T. when no active addins') 116 | endfunc 117 | 118 | ******************************************************************************* 119 | * Test that ExecuteAddin clears lAddinsExecuted when no addins for specified 120 | * method 121 | ******************************************************************************* 122 | function Test_ExecuteAddin_ClearsAddinsExecutedFlag_NoAddinsForMethod 123 | This.SetupAddins('test', .F., '', .T.) 124 | This.oAddins.ExecuteAddin('test2') 125 | This.AssertFalse(This.oAddins.lAddinsExecuted, ; 126 | 'lAddinsExecuted is .T. when no addins for method') 127 | endfunc 128 | 129 | ******************************************************************************* 130 | * Test that ExecuteAddin sets lAddinsExecuted when addin executed 131 | ******************************************************************************* 132 | function Test_ExecuteAddin_SetsAddinsExecutedFlag 133 | This.SetupAddins('test', .T., '', .T.) 134 | This.oAddins.ExecuteAddin('test') 135 | This.AssertTrue(This.oAddins.lAddinsExecuted, ; 136 | 'lAddinsExecuted is .F. when addin executed') 137 | endfunc 138 | 139 | ******************************************************************************* 140 | * Test that ExecuteAddin returns .T. when addin returns .T. 141 | ******************************************************************************* 142 | function Test_ExecuteAddin_ReturnsTrue_WhenAddinDoes 143 | This.SetupAddins('test', .T., '', .T.) 144 | llOK = This.oAddins.ExecuteAddin('test') 145 | This.AssertTrue(llOK, 'Returned .F. when addin returned .T.') 146 | endfunc 147 | 148 | ******************************************************************************* 149 | * Test that ExecuteAddin returns .F. when addin returns .F. 150 | ******************************************************************************* 151 | function Test_ExecuteAddin_ReturnsFalse_WhenAddinDoes 152 | This.SetupAddins('test', .T., '', .F.) 153 | llOK = This.oAddins.ExecuteAddin('test') 154 | This.AssertFalse(llOK, 'Returned .T. when addin returned .F.') 155 | endfunc 156 | 157 | ******************************************************************************* 158 | * Test that ExecuteAddin returns .F. and lSuccess is .F. when addin returns 0 159 | ******************************************************************************* 160 | function Test_ExecuteAddin_ReturnsFalse_WhenAddinReturns0 161 | This.SetupAddins('test', .T., '', 0) 162 | llOK = This.oAddins.ExecuteAddin('test') 163 | This.AssertFalse(llOK, 'Returned .T. when addin returned 0') 164 | This.AssertFalse(This.oAddins.lSuccess, 'lSuccess .T. when addin returned 0') 165 | endfunc 166 | 167 | ******************************************************************************* 168 | * Test that ExecuteAddin returns .F. and lSuccess is .T. when addin returns 1 169 | ******************************************************************************* 170 | function Test_ExecuteAddin_ReturnsFalse_WhenAddinReturns1 171 | This.SetupAddins('test', .T., '', 1) 172 | llOK = This.oAddins.ExecuteAddin('test') 173 | This.AssertFalse(llOK, 'Returned .T. when addin returned 1') 174 | This.AssertTrue(This.oAddins.lSuccess, 'lSuccess .F. when addin returned 1') 175 | endfunc 176 | 177 | ******************************************************************************* 178 | * Test that ExecuteAddin returns .T. and lSuccess is .T. when addin returns 2 179 | ******************************************************************************* 180 | function Test_ExecuteAddin_ReturnsTrue_WhenAddinReturns2 181 | This.SetupAddins('test', .T., '', 2) 182 | llOK = This.oAddins.ExecuteAddin('test') 183 | This.AssertTrue(llOK, 'Returned .F. when addin returned 2') 184 | This.AssertTrue(This.oAddins.lSuccess, 'lSuccess .F. when addin returned 2') 185 | endfunc 186 | 187 | ******************************************************************************* 188 | * Test that ExecuteAddin raises ErrorOccurred when an error occurs 189 | * during addin execution 190 | ******************************************************************************* 191 | function Test_ExecuteAddin_RaisesErrorOccurred 192 | This.SetupAddins('test', .T., 'x = y', .F.) 193 | bindevent(This.oAddins, 'ErrorOccurred', This, 'ErrorEventRaised') 194 | This.oAddins.ExecuteAddin('test') 195 | This.AssertTrue(This.lErrorEventRaised, 'Event not raised') 196 | endfunc 197 | 198 | function ErrorEventRaised(tcMessage) 199 | This.lErrorEventRaised = .T. 200 | endfunc 201 | 202 | ******************************************************************************* 203 | * Test that ExecuteAddin raises AddinsExecuted 204 | ******************************************************************************* 205 | function Test_ExecuteAddin_RaisesAddinsExecuted 206 | This.SetupAddins('test', .T., '', .T.) 207 | bindevent(This.oAddins, 'AddinsExecuted', This, 'ExecuteEventRaised') 208 | This.oAddins.ExecuteAddin('test') 209 | This.AssertTrue(This.lExecuteEventRaised, 'Event not raised') 210 | endfunc 211 | 212 | function ExecuteEventRaised(tcMessage) 213 | This.lExecuteEventRaised = .T. 214 | endfunc 215 | 216 | ******************************************************************************* 217 | * Test that GetAddins compiles PRGs 218 | ******************************************************************************* 219 | function Test_GetAddins_CompilesPRGs 220 | This.SetupAddins('test', .T., '', .F.) 221 | This.AssertTrue(file(This.cAddinsFolder + 'addin.fxp'), ; 222 | 'Did not compile PRG') 223 | endfunc 224 | 225 | ******************************************************************************* 226 | * Test that GetAddins sets cErrorMessage when run fails 227 | ******************************************************************************* 228 | function Test_GetAddins_SetsErrorMessage_RunFails 229 | This.SetupAddins('test', 5, '', .F.) 230 | This.AssertTrue(not empty(This.oAddins.cErrorMessage), ; 231 | 'Did not set cErrorMessage') 232 | endfunc 233 | 234 | ******************************************************************************* 235 | * Test that GetAddins sets cErrorMessage when compile fails 236 | ******************************************************************************* 237 | function Test_GetAddins_SetsErrorMessage_CompileFails 238 | strtofile('xxx', This.cAddinsFolder + 'addin2.prg') 239 | This.SetupAddins('test', .T., '', .F.) 240 | This.AssertTrue(not empty(This.oAddins.cErrorMessage), ; 241 | 'Did not set cErrorMessage') 242 | endfunc 243 | enddefine 244 | -------------------------------------------------------------------------------- /Tests/TestSourceFiles/classlib.vct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/classlib.vct -------------------------------------------------------------------------------- /Tests/TestSourceFiles/classlib.vcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/classlib.vcx -------------------------------------------------------------------------------- /Tests/TestSourceFiles/data.dbc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/data.dbc -------------------------------------------------------------------------------- /Tests/TestSourceFiles/data.dct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/data.dct -------------------------------------------------------------------------------- /Tests/TestSourceFiles/data.dcx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/data.dcx -------------------------------------------------------------------------------- /Tests/TestSourceFiles/file.xxx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/file.xxx -------------------------------------------------------------------------------- /Tests/TestSourceFiles/form.sct: -------------------------------------------------------------------------------- 1 | YVERSION = 3.00dataenvironmentdataenvironmentDataenvironmentYTop = 0 2 | Left = 0 3 | Width = 0 4 | Height = 0 5 | DataSource = .NULL. 6 | Name = "Dataenvironment" 7 | 11formformForm13DoCreate = .T. 8 | Caption = "Form1" 9 | Name = "Form1" 10 | !Arial, 0, 9, 5, 15, 12, 32, 3, 0 11 | -------------------------------------------------------------------------------- /Tests/TestSourceFiles/form.scx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/form.scx -------------------------------------------------------------------------------- /Tests/TestSourceFiles/freetable.cdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/freetable.cdx -------------------------------------------------------------------------------- /Tests/TestSourceFiles/freetable.dbf: -------------------------------------------------------------------------------- 1 | 0hFIELD1CFIELD2M -------------------------------------------------------------------------------- /Tests/TestSourceFiles/freetable.fpt: -------------------------------------------------------------------------------- 1 | @ -------------------------------------------------------------------------------- /Tests/TestSourceFiles/image.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/image.bmp -------------------------------------------------------------------------------- /Tests/TestSourceFiles/label.lbt: -------------------------------------------------------------------------------- 1 | !Segoe UI LightHORIENTATION=0 2 | PAPERSIZE=1 3 | PAPERLENGTH=2794 4 | PAPERWIDTH=2159 5 | COLOR=2 6 | Segoe UI LightdataenvironmentYTop = 0 7 | Left = 0 8 | Width = 0 9 | Height = 0 10 | DataSource = .NULL. 11 | Name = "Dataenvironment" 12 |  -------------------------------------------------------------------------------- /Tests/TestSourceFiles/label.lbx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/label.lbx -------------------------------------------------------------------------------- /Tests/TestSourceFiles/menu.mnx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/menu.mnx -------------------------------------------------------------------------------- /Tests/TestSourceFiles/program.prg: -------------------------------------------------------------------------------- 1 | * test -------------------------------------------------------------------------------- /Tests/TestSourceFiles/query.qpr: -------------------------------------------------------------------------------- 1 | SELECT Freetable.field1; 2 | FROM freetable 3 | -------------------------------------------------------------------------------- /Tests/TestSourceFiles/report.frt: -------------------------------------------------------------------------------- 1 | !Segoe UI LightHORIENTATION=0 2 | PAPERSIZE=1 3 | PAPERLENGTH=2794 4 | PAPERWIDTH=2159 5 | COLOR=2 6 | Segoe UI LightdataenvironmentYTop = 0 7 | Left = 0 8 | Width = 0 9 | Height = 0 10 | DataSource = .NULL. 11 | Name = "Dataenvironment" 12 |  -------------------------------------------------------------------------------- /Tests/TestSourceFiles/report.frx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/report.frx -------------------------------------------------------------------------------- /Tests/TestSourceFiles/table.cdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/table.cdx -------------------------------------------------------------------------------- /Tests/TestSourceFiles/table.dbf: -------------------------------------------------------------------------------- 1 | 0H FIELD1C 2 | data.dbc -------------------------------------------------------------------------------- /Tests/TestSourceFiles/text.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/text.txt -------------------------------------------------------------------------------- /Tests/TestSourceFiles/vfpcompression.fll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/Tests/TestSourceFiles/vfpcompression.fll -------------------------------------------------------------------------------- /ThorUpdater/ProjectExplorer.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/ThorUpdater/ProjectExplorer.zip -------------------------------------------------------------------------------- /ThorUpdater/ProjectExplorerVersion.txt: -------------------------------------------------------------------------------- 1 | lparameters toUpdateObject 2 | 3 | * Set the properties of the passed updater object. 4 | 5 | with toUpdateObject 6 | .VersionNumber = '1.0.09273 - 20250522' 7 | .AvailableVersion = 'Project Explorer-1.0.09273-update-20250522' 8 | .Component = 'No' 9 | .Notes = GetNotes() 10 | .RegisterWithThor = GetRegisterWithThor() 11 | endwith 12 | return toUpdateObject 13 | 14 | * Get the notes for the project. 15 | 16 | procedure GetNotes 17 | local lcNotes 18 | text to lcNotes noshow 19 | # Project Explorer 20 | 21 | Project Explorer replaces the VFP Project Manager with a modern interface and modern capabilities. 22 | 23 | ## Release History 24 | 25 | ### 2025-05-22, version 1.0.09273 26 | 27 | * A tag starting with "Code" no longer conflicts with the built-in Code tag. 28 | 29 | * Project Explorer no longer adds a file with the same name as an existing file but in a different folder. 30 | 31 | ### 2024-03-10, Version 1.0.08835 32 | 33 | * The EditFile method now returns .F. if it can't edit the file (for example, the specified file isn't part of the project). 34 | 35 | ### 2024-01-13, Version 1.0.08778 36 | 37 | * Restores the former dock position of the form when it's opened (issue #223). 38 | 39 | * Handle tags with special characters (issue #211). 40 | 41 | * Automated generation of version number when using VFPX Deployment. 42 | 43 | * ProjectExplorerForm.SelectNodeForFile: return .T. if an item was selected in the TreeView. 44 | 45 | ### 2023-03-05, Version 1.0.08464 46 | 47 | * Added support for editing an MPR in the project as a program (issue #220). 48 | 49 | * Fixed an issue with Project Explorer hanging after saving changes to a file under some conditions (issue #219). 50 | 51 | ### 2023-01-21, Version 1.0.08421 52 | 53 | * Added a new add-in, SetCurDirOnProjectOpen.prg, which automatically does a CD to the solution's folder when a solution is opened. 54 | 55 | * Added support for [VFPX Deployment](https://github.com/VFPX/VFPXDeployment) as the deployment mechanism. 56 | 57 | ### 2022-06-15, Version 1.0.8201 58 | 59 | * Fixed a bug: when adding a file, it doesn't appear in "All" until you close and reopen Project Explorer. 60 | 61 | * Fixed a bug: binary files show with version control status "?" (unknown) if only text equivalents are included in the repository and there is no .gitignore or it doesn't exclude binary files. 62 | 63 | ### 2022-03-26, Version 1.0.8120 64 | 65 | * Added support for binary-to-text conversion using Christof Wollenhaupt's TwoFox. 66 | 67 | * Added support for selecting which binary-to-text converter to use on a project-by-project basis (for example, one project may use FoxBin2PRG while another uses TwoFox). 68 | 69 | endtext 70 | return lcNotes 71 | 72 | * Register the tool with Thor. Note: Thor replaces ##InstallFolder## with the 73 | * installation path for the tool when this code is executed. 74 | 75 | procedure GetRegisterWithThor 76 | local lcCommand 77 | text to lcCommand noshow 78 | 79 | * Create the tool under Thor Tools. 80 | 81 | loThorInfo = Execscript (_Screen.cThorDispatcher, 'Thor Register=') 82 | with loThorInfo 83 | 84 | * Required properties. 85 | 86 | .PRGName = 'Thor_Tool_ProjectExplorer' 87 | .FolderName = '##InstallFolder##' 88 | .Prompt = 'Project Explorer' 89 | 90 | * Optional properties. 91 | 92 | .Description = 'Project Explorer' 93 | 94 | * These are used to group and sort tools when they are displayed in menus or 95 | * the Thor form. 96 | 97 | .Category = 'Applications' 98 | .CanRunAtStartUp = .F. 99 | 100 | * This is the code to execute when the tool is selected. 101 | 102 | .Code = "do ('##InstallFolder##ProjectExplorer.app')" 103 | 104 | * Register the tool with Thor. 105 | 106 | llRegister = .Register() 107 | endwith 108 | 109 | endtext 110 | return lcCommand 111 | -------------------------------------------------------------------------------- /ThorUpdater/Thor_Tool_ProjectExplorer.prg: -------------------------------------------------------------------------------- 1 | * Registered with Thor: 10/16/17 01:50:37 PM 2 | Lparameters lxParam1 3 | 4 | **************************************************************** 5 | **************************************************************** 6 | * Standard prefix for all tools for Thor, allowing this tool to 7 | * tell Thor about itself. 8 | 9 | If Pcount() = 1 ; 10 | And 'O' = Vartype (lxParam1) ; 11 | And 'thorinfo' = Lower (lxParam1.Class) 12 | 13 | With lxParam1 14 | 15 | * Required 16 | .Prompt = 'Project Explorer' && used when tool appears in a menu 17 | .Description = 'Project Explorer' 18 | .PRGName = 'Thor_Tool_ProjectExplorer' && a unique name for the tool; note the required prefix 19 | 20 | * Optional 21 | .FolderName = 'D:\DEVELOPMENT\TOOLS\THOR\Thor\Tools\Apps\Project Explorer\' && folder name for APP 22 | .CanRunAtStartup = .F. 23 | 24 | * For public tools, such as PEM Editor, etc. 25 | .Category = 'Applications' 26 | Endwith 27 | 28 | Return lxParam1 29 | Endif 30 | 31 | If Pcount() = 0 32 | Do ToolCode 33 | Else 34 | Do ToolCode With lxParam1 35 | Endif 36 | 37 | Return 38 | 39 | **************************************************************** 40 | **************************************************************** 41 | * Normal processing for this tool begins here. 42 | Procedure ToolCode 43 | Lparameters lxParam1 44 | do ('D:\DEVELOPMENT\TOOLS\THOR\Thor\Tools\Apps\Project Explorer\ProjectExplorer.app') 45 | EndProc 46 | -------------------------------------------------------------------------------- /projectexplorer.app: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/projectexplorer.app -------------------------------------------------------------------------------- /system.app: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DougHennig/ProjectExplorer/7e2954ad537fd1e872e8a91853bf685f8eef352f/system.app --------------------------------------------------------------------------------