diff --git a/CHANGELOG.md b/CHANGELOG.md index b9c2b9ca..fcbd43e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ These are the changes to each version that has been released in the Visual Studi **2018-10-20** - [x] Conversion to async packages - [x] Fix github issues +- [x] Add VS2019 versions ## 1.1.48 **2017-09-25** diff --git a/src/OpenInApp.Common/Helpers/ApplicationToOpenHelper.cs b/src/OpenInApp.Common/Helpers/ApplicationToOpenHelper.cs index 26038dd3..3beda963 100644 --- a/src/OpenInApp.Common/Helpers/ApplicationToOpenHelper.cs +++ b/src/OpenInApp.Common/Helpers/ApplicationToOpenHelper.cs @@ -331,6 +331,27 @@ public ApplicationToOpenDto GetApplicationToOpenDto(KeyToExecutableEnum keyToExe applicationToOpenDto.SeparateProcessPerFileToBeOpened = false; applicationToOpenDto.UseShellExecute = false; break; + case KeyToExecutableEnum.VS2019Community: + applicationToOpenDto.ExcludeBinAndObjFoldersWhenOpeningProjectNode = true; + applicationToOpenDto.ExecutableFilesToBrowseFor = new List { "devenv.exe" }; + applicationToOpenDto.SecondaryFilePathSegment = @"Microsoft Visual Studio\2019\Community\Common7\IDE"; + applicationToOpenDto.SeparateProcessPerFileToBeOpened = false; + applicationToOpenDto.UseShellExecute = false; + break; + case KeyToExecutableEnum.VS2019Enterprise: + applicationToOpenDto.ExcludeBinAndObjFoldersWhenOpeningProjectNode = true; + applicationToOpenDto.ExecutableFilesToBrowseFor = new List { "devenv.exe" }; + applicationToOpenDto.SecondaryFilePathSegment = @"Microsoft Visual Studio\2019\Enterprise\Common7\IDE"; + applicationToOpenDto.SeparateProcessPerFileToBeOpened = false; + applicationToOpenDto.UseShellExecute = false; + break; + case KeyToExecutableEnum.VS2019Professional: + applicationToOpenDto.ExcludeBinAndObjFoldersWhenOpeningProjectNode = true; + applicationToOpenDto.ExecutableFilesToBrowseFor = new List { "devenv.exe" }; + applicationToOpenDto.SecondaryFilePathSegment = @"Microsoft Visual Studio\2019\Professional\Common7\IDE"; + applicationToOpenDto.SeparateProcessPerFileToBeOpened = false; + applicationToOpenDto.UseShellExecute = false; + break; case KeyToExecutableEnum.WinDirStat: applicationToOpenDto.ArtefactTypeToOpen = ArtefactTypeToOpen.Folder; applicationToOpenDto.OpenIndividualFilesInFolderRatherThanFolderItself = false; diff --git a/src/OpenInApp.Common/Helpers/KeyToExecutable.cs b/src/OpenInApp.Common/Helpers/KeyToExecutable.cs index 6b15c7c6..74520347 100644 --- a/src/OpenInApp.Common/Helpers/KeyToExecutable.cs +++ b/src/OpenInApp.Common/Helpers/KeyToExecutable.cs @@ -73,6 +73,15 @@ public enum KeyToExecutableEnum [Description("devenv.exe")] VS2017Professional, + [Description("devenv.exe")] + VS2019Community, + + [Description("devenv.exe")] + VS2019Enterprise, + + [Description("devenv.exe")] + VS2019Professional, + [Description("windirstat.exe")] WinDirStat, @@ -108,6 +117,9 @@ public static class KeyToExecutableString //TODO auto sync to the enum class abo public const string VS2017Community = "devenv.exeVS2017Community"; public const string VS2017Enterprise = "devenv.exeVS2017Enterprise"; public const string VS2017Professional = "devenv.exeVS2017Professional"; + public const string VS2019Community = "devenv.exeVS2019Community"; + public const string VS2019Enterprise = "devenv.exeVS2019Enterprise"; + public const string VS2019Professional = "devenv.exeVS2019Professional"; public const string WinDirStat = "windirstat.exe"; public const string XamarinStudio = "XamarinStudio.exe"; } diff --git a/src/OpenInApp.Launcher.sln b/src/OpenInApp.Launcher.sln index 7e40045c..b5730d14 100644 --- a/src/OpenInApp.Launcher.sln +++ b/src/OpenInApp.Launcher.sln @@ -82,6 +82,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\Zappveyor.yml = ..\Zappveyor.yml EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenInVS2019Community", "OpenInVS2019Community\OpenInVS2019Community.csproj", "{84ED17E7-7027-49E3-8B3D-532B4600D3AE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenInVS2019Enterprise", "OpenInVS2019Enterprise\OpenInVS2019Enterprise.csproj", "{5F0FE53B-60D8-4CF3-AC10-75CA4F2C859B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenInVS2019Professional", "OpenInVS2019Professional\OpenInVS2019Professional.csproj", "{38A17EBB-816D-416B-9F0C-B48DF447E51F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -208,6 +214,18 @@ Global {543A271A-FB6E-4918-BF68-0202EE7F1CAD}.Debug|Any CPU.Build.0 = Debug|Any CPU {543A271A-FB6E-4918-BF68-0202EE7F1CAD}.Release|Any CPU.ActiveCfg = Release|Any CPU {543A271A-FB6E-4918-BF68-0202EE7F1CAD}.Release|Any CPU.Build.0 = Release|Any CPU + {84ED17E7-7027-49E3-8B3D-532B4600D3AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84ED17E7-7027-49E3-8B3D-532B4600D3AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84ED17E7-7027-49E3-8B3D-532B4600D3AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84ED17E7-7027-49E3-8B3D-532B4600D3AE}.Release|Any CPU.Build.0 = Release|Any CPU + {5F0FE53B-60D8-4CF3-AC10-75CA4F2C859B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5F0FE53B-60D8-4CF3-AC10-75CA4F2C859B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5F0FE53B-60D8-4CF3-AC10-75CA4F2C859B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5F0FE53B-60D8-4CF3-AC10-75CA4F2C859B}.Release|Any CPU.Build.0 = Release|Any CPU + {38A17EBB-816D-416B-9F0C-B48DF447E51F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38A17EBB-816D-416B-9F0C-B48DF447E51F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38A17EBB-816D-416B-9F0C-B48DF447E51F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38A17EBB-816D-416B-9F0C-B48DF447E51F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/OpenInVS2019Community/Commands/OpenInAppCommand.cs b/src/OpenInVS2019Community/Commands/OpenInAppCommand.cs new file mode 100644 index 00000000..53d08ee0 --- /dev/null +++ b/src/OpenInVS2019Community/Commands/OpenInAppCommand.cs @@ -0,0 +1,41 @@ +using Microsoft.VisualStudio.Shell; +using OpenInApp.Common.Helpers; +using OpenInApp.Menu; +using OpenInVS2019Community.Options.VS2019Community; +using System; + +namespace OpenInVS2019Community.Commands +{ + internal sealed class OpenInAppCommand + { + private readonly Package _package; + private IServiceProvider serviceProvider { get { return _package; } } + + public OpenInAppCommand(Package package) + { + _package = package; + } + + public void Initialize() + { + var menuCore = new MenuCore( + Vsix.Name, + Vsix.Version, + PackageGuids.guidOpenInVsCmdSetString, + PackageIds.CmdIdOpenInAppItemNode, + PackageIds.CmdIdOpenInAppCodeWin, + PackageIds.CmdIdOpenInAppFolderNode, + PackageIds.CmdIdOpenInAppProjNode, + GeneralOptions.keyToExecutableEnum, + VSPackage.Options.ActualPathToExe, + VSPackage.Options.FileQuantityWarningLimit, + VSPackage.Options.SuppressTypicalFileExtensionsWarning, + VSPackage.Options.TypicalFileExtensions, + GeneralOptions.keyToExecutableEnum.Description(), + serviceProvider, + VSPackage.Options); + + menuCore.MenuCoreOpenInAppCommand(_package); + } + } +} \ No newline at end of file diff --git a/src/OpenInVS2019Community/OpenInVS2019Community.csproj b/src/OpenInVS2019Community/OpenInVS2019Community.csproj new file mode 100644 index 00000000..90e9d518 --- /dev/null +++ b/src/OpenInVS2019Community/OpenInVS2019Community.csproj @@ -0,0 +1,285 @@ + + + + + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + true + + + + + 14.0 + + + + false + + + + + + + + Debug + AnyCPU + 2.0 + {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + {84ED17E7-7027-49E3-8B3D-532B4600D3AE} + Library + Properties + OpenInVS2019Community + OpenInVS2019Community + v4.6.1 + true + true + true + true + true + false + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + True + False + true + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + $([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory)\..\packages\VsixCompress.1.0.1\tools\vsix-compress.targets )) + + + + + source.extension.cs + + + Component + + + source.extension.vsixmanifest + + + True + True + VSCommandTable.vsct + + + + + + + + + + Designer + VsixManifestGenerator + source.extension.resx + + + + + Menus.ctmenu + Designer + VsctGenerator + VSCommandTable.cs + + + + + LICENSE.txt + true + Always + + + true + Always + + + Always + true + + + Always + true + + + source.extension.vsixmanifest + true + Always + + + + + True + True + source.extension.vsixmanifest + true + VSPackage + + + + + {fb454d10-d473-4e49-a289-9bb8713da1a1} + OpenInApp.Command + + + {78680fb3-22e5-4200-9756-2c2cec66161d} + OpenInApp.Common + + + {89623b25-af78-475c-819f-1c5990199f87} + OpenInApp.Menu + + + + + False + ..\packages\EnvDTE.8.0.1\lib\net10\EnvDTE.dll + True + + + False + + + True + + + False + + + ..\packages\Microsoft.ApplicationInsights.2.3.0\lib\net45\Microsoft.ApplicationInsights.dll + + + + + ..\packages\Microsoft.VisualStudio.Imaging.15.0.26201\lib\net45\Microsoft.VisualStudio.Imaging.dll + True + + + ..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interop.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.14.0.14.3.25407\lib\Microsoft.VisualStudio.Shell.14.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.10.0.10.0.30319\lib\net40\Microsoft.VisualStudio.Shell.Immutable.10.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.11.0.11.0.50727\lib\net45\Microsoft.VisualStudio.Shell.Immutable.11.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.12.0.12.0.21003\lib\net45\Microsoft.VisualStudio.Shell.Immutable.12.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.14.0.14.3.25407\lib\net45\Microsoft.VisualStudio.Shell.Immutable.14.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.7.10.6071\lib\Microsoft.VisualStudio.Shell.Interop.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.10.0.10.0.30319\lib\Microsoft.VisualStudio.Shell.Interop.10.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.11.0.11.0.61030\lib\Microsoft.VisualStudio.Shell.Interop.11.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.12.0.12.0.30110\lib\Microsoft.VisualStudio.Shell.Interop.12.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.Shell.Interop.8.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.9.0.9.0.30729\lib\Microsoft.VisualStudio.Shell.Interop.9.0.dll + True + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.7.10.6070\lib\Microsoft.VisualStudio.TextManager.Interop.dll + True + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.TextManager.Interop.8.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Threading.15.3.23\lib\net45\Microsoft.VisualStudio.Threading.dll + + + ..\packages\Microsoft.VisualStudio.Utilities.15.0.26201\lib\net45\Microsoft.VisualStudio.Utilities.dll + True + + + ..\packages\Microsoft.VisualStudio.Validation.15.3.15\lib\net45\Microsoft.VisualStudio.Validation.dll + + + True + ..\packages\stdole.7.0.3301\lib\net10\stdole.dll + True + + + + + + + + + ..\packages\VsixLogger.1.1.44.0\lib\net45\VsixLogger.dll + True + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Community/OpenInVS2019Community.csproj.user b/src/OpenInVS2019Community/OpenInVS2019Community.csproj.user new file mode 100644 index 00000000..02121626 --- /dev/null +++ b/src/OpenInVS2019Community/OpenInVS2019Community.csproj.user @@ -0,0 +1,11 @@ + + + + ProjectFiles + + + Program + C:\Program Files %28x86%29\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe + /rootSuffix Exp + + \ No newline at end of file diff --git a/src/OpenInVS2019Community/Options/GeneralOptions.cs b/src/OpenInVS2019Community/Options/GeneralOptions.cs new file mode 100644 index 00000000..ac256f6f --- /dev/null +++ b/src/OpenInVS2019Community/Options/GeneralOptions.cs @@ -0,0 +1,163 @@ +using Microsoft.VisualStudio.Shell; +using OpenInApp.Command; +using OpenInApp.Common.Helpers; +using System.Collections.Generic; +using System.ComponentModel; +using System.Windows.Forms; +using OpenInApp.Menu; + +namespace OpenInVS2019Community.Options.VS2019Community +{ + public class GeneralOptions : DialogPage, IGeneralOptionsFile // or set to IGeneralOptionsFolder + { + internal static KeyToExecutableEnum keyToExecutableEnum = KeyToExecutableEnum.VS2019Community; + private IEnumerable defaultTypicalFileExtensions = new ConstantsForAppCommon().GetDefaultTypicalFileExtensions(keyToExecutableEnum); + private const string CommonActualPathToExeOptionLabel = CommonConstants.ActualPathToExeOptionLabelPrefix + KeyToExecutableString.VS2019Community; + + [Category(CommonConstants.CategorySubLevel)] + [DisplayName(CommonActualPathToExeOptionLabel)] + [Description(CommonConstants.ActualPathToExeOptionDetailedDescription)] + public string ActualPathToExe { get; set; } + + [Category(CommonConstants.CategorySubLevel)] + [DisplayName(CommonConstants.TypicalFileExtensionsOptionLabel)] + [Description(CommonConstants.TypicalFileExtensionsOptionDetailedDescription)] + // Set to 'internal' to hide in IDE Options (e.g. TreeSizeFree) + public string TypicalFileExtensions + { + get + { + if (string.IsNullOrEmpty(typicalFileExtensions)) + { + return AllAppsHelper.GetDefaultTypicalFileExtensionsAsCsv(defaultTypicalFileExtensions); + } + else + { + return typicalFileExtensions; + } + } + set + { + typicalFileExtensions = value; + } + } + + [Category(CommonConstants.CategorySubLevel)] + [DisplayName(CommonConstants.SuppressTypicalFileExtensionsWarningOptionLabel)] + [Description(CommonConstants.SuppressTypicalFileExtensionsWarningDetailedDescription)] + // Set to 'internal' to hide in IDE Options (e.g. TreeSizeFree) + public bool SuppressTypicalFileExtensionsWarning { get; set; } = false; + + [Category(CommonConstants.CategorySubLevel)] + [DisplayName(CommonConstants.FileQuantityWarningLimitOptionLabel)] + [Description(CommonConstants.FileQuantityWarningLimitOptionDetailedDescription)] + public string FileQuantityWarningLimit + { + get + { + if (string.IsNullOrEmpty(fileQuantityWarningLimit)) + { + return CommonConstants.DefaultFileQuantityWarningLimit; + } + else + { + return fileQuantityWarningLimit; + } + } + set + { + int x; + var isInteger = int.TryParse(value, out x); + if (!isInteger) + { + MessageBox.Show( + CommonConstants.FileQuantityWarningLimitInvalid, + new ConstantsForAppCommon().Caption, + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + else + { + fileQuantityWarningLimit = value; + } + } + } + + private string fileQuantityWarningLimit; + private string typicalFileExtensions; + + internal int FileQuantityWarningLimitInt + { + get + { + int x; + var isInteger = int.TryParse(FileQuantityWarningLimit, out x); + if (isInteger) + { + return x; + } + else + { + return 0; + } + } + } + + public override void LoadSettingsFromStorage() + { + base.LoadSettingsFromStorage(); + + if (string.IsNullOrEmpty(TypicalFileExtensions)) + { + TypicalFileExtensions = AllAppsHelper.GetDefaultTypicalFileExtensionsAsCsv(defaultTypicalFileExtensions); + } + + if (string.IsNullOrEmpty(ActualPathToExe)) + { + ActualPathToExe = GeneralOptionsHelper.GetActualPathToExe(keyToExecutableEnum); + } + + previousActualPathToExe = ActualPathToExe; + } + + private string previousActualPathToExe { get; set; } + + protected override void OnApply(PageApplyEventArgs e) + { + var actualPathToExeChanged = false; + + if (ActualPathToExe != previousActualPathToExe) + { + actualPathToExeChanged = true; + previousActualPathToExe = ActualPathToExe; + } + + if (actualPathToExeChanged) + { + if (!ArtefactsHelper.DoesActualPathToExeExist(ActualPathToExe)) + { + e.ApplyBehavior = ApplyKind.Cancel; + + var caption = new ConstantsForAppCommon().Caption; + + var filePrompterHelper = new FilePrompterHelper(caption, keyToExecutableEnum.Description()); + + var persistOptionsDto = filePrompterHelper.PromptForActualExeFile(ActualPathToExe); + + if (persistOptionsDto.Persist) + { + PersistVSToolOptions(persistOptionsDto.ValueToPersist); + } + } + } + + base.OnApply(e); + } + + public void PersistVSToolOptions(string fileName) + { + VSPackage.Options.ActualPathToExe = fileName; + VSPackage.Options.SaveSettingsToStorage(); + } + } +} \ No newline at end of file diff --git a/src/OpenInVS2019Community/Properties/AssemblyInfo.cs b/src/OpenInVS2019Community/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..b5eabad8 --- /dev/null +++ b/src/OpenInVS2019Community/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using OpenInVS2019Community; +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle(Vsix.Name)] +[assembly: AssemblyDescription(Vsix.Description)] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany(Vsix.Author)] +[assembly: AssemblyProduct(Vsix.Name)] +[assembly: AssemblyCopyright(Vsix.Author)] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture(Vsix.Language)] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +//[assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion(Vsix.Version + ".*")] +//[assembly: AssemblyVersion("1.0.0.0")] +//[assembly: AssemblyFileVersion("1.0.0.0")] +//[assembly: AssemblyInformationalVersion("1.0.0-alpha")] \ No newline at end of file diff --git a/src/OpenInVS2019Community/Properties/vsix-compress.props b/src/OpenInVS2019Community/Properties/vsix-compress.props new file mode 100644 index 00000000..f57c7b39 --- /dev/null +++ b/src/OpenInVS2019Community/Properties/vsix-compress.props @@ -0,0 +1,19 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Community/Resources/VsixCommandIcon_16x16.png b/src/OpenInVS2019Community/Resources/VsixCommandIcon_16x16.png new file mode 100644 index 00000000..2cef7619 Binary files /dev/null and b/src/OpenInVS2019Community/Resources/VsixCommandIcon_16x16.png differ diff --git a/src/OpenInVS2019Community/Resources/VsixExtensionIcon_90x90.png b/src/OpenInVS2019Community/Resources/VsixExtensionIcon_90x90.png new file mode 100644 index 00000000..4c827401 Binary files /dev/null and b/src/OpenInVS2019Community/Resources/VsixExtensionIcon_90x90.png differ diff --git a/src/OpenInVS2019Community/Resources/VsixExtensionPreview_175x175.png b/src/OpenInVS2019Community/Resources/VsixExtensionPreview_175x175.png new file mode 100644 index 00000000..4ecf00c1 Binary files /dev/null and b/src/OpenInVS2019Community/Resources/VsixExtensionPreview_175x175.png differ diff --git a/src/OpenInVS2019Community/VSCommandTable.cs b/src/OpenInVS2019Community/VSCommandTable.cs new file mode 100644 index 00000000..5664a0f8 --- /dev/null +++ b/src/OpenInVS2019Community/VSCommandTable.cs @@ -0,0 +1,37 @@ +// ------------------------------------------------------------------------------ +// +// This file was generated by Extensibility Tools v1.10.188 +// +// ------------------------------------------------------------------------------ +namespace OpenInVS2019Community +{ + using System; + + /// + /// Helper class that exposes all GUIDs used across VS Package. + /// + internal sealed partial class PackageGuids + { + public const string guidOpenInAppPackageString = "d9d270cb-7536-4b10-a346-3db370c601f3"; + public const string guidOpenInVsCmdSetString = "b625ab24-cc62-4e9a-b7b6-2dfcb99a7aad"; + public const string guidImagesString = "b53c0c59-7b6f-4261-8849-5f7b26fdd949"; + public static Guid guidOpenInAppPackage = new Guid(guidOpenInAppPackageString); + public static Guid guidOpenInVsCmdSet = new Guid(guidOpenInVsCmdSetString); + public static Guid guidImages = new Guid(guidImagesString); + } + /// + /// Helper class that encapsulates all CommandIDs uses across VS Package. + /// + internal sealed partial class PackageIds + { + public const int GroupOpenInAppCodeWin = 0x1030; + public const int CmdIdOpenInAppCodeWin = 0x0100; + public const int GroupOpenInAppItemNode = 0x1040; + public const int CmdIdOpenInAppItemNode = 0x0110; + public const int GroupOpenInAppFolderNode = 0x1050; + public const int CmdIdOpenInAppFolderNode = 0x0120; + public const int GroupOpenInAppProjNode = 0x1060; + public const int CmdIdOpenInAppProjNode = 0x0130; + public const int bmpPic1 = 0x0001; + } +} diff --git a/src/OpenInVS2019Community/VSCommandTable.vsct b/src/OpenInVS2019Community/VSCommandTable.vsct new file mode 100644 index 00000000..d6c05c51 --- /dev/null +++ b/src/OpenInVS2019Community/VSCommandTable.vsct @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Community/VSPackage.cs b/src/OpenInVS2019Community/VSPackage.cs new file mode 100644 index 00000000..4d54563a --- /dev/null +++ b/src/OpenInVS2019Community/VSPackage.cs @@ -0,0 +1,29 @@ +using Microsoft.VisualStudio.Shell; +using OpenInApp.Common.Helpers; +using OpenInVS2019Community.Commands; +using OpenInVS2019Community.Options.VS2019Community; +using System; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +namespace OpenInVS2019Community +{ + [PackageRegistration(UseManagedResourcesOnly = true)] + [InstalledProductRegistration(productName: "#110", productDetails: "#112", productId: Vsix.Version, IconResourceID = 400)] + [ProvideMenuResource("Menus.ctmenu", 1)] + [Guid(PackageGuids.guidOpenInAppPackageString)] + [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")] + [ProvideOptionPage(typeof(GeneralOptions), Vsix.Name, CommonConstants.CategorySubLevel, 0, 0, true)] + public sealed class VSPackage : Package + { + public static GeneralOptions Options { get; private set; } + + protected override void Initialize() + { + Options = (GeneralOptions)GetDialogPage(typeof(GeneralOptions)); + + new OpenInAppCommand(this).Initialize(); + base.Initialize(); + } + } +} diff --git a/src/OpenInVS2019Community/app.config b/src/OpenInVS2019Community/app.config new file mode 100644 index 00000000..41766109 --- /dev/null +++ b/src/OpenInVS2019Community/app.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/OpenInVS2019Community/packages.config b/src/OpenInVS2019Community/packages.config new file mode 100644 index 00000000..1d2c18d5 --- /dev/null +++ b/src/OpenInVS2019Community/packages.config @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Community/source.extension.Designer.cs b/src/OpenInVS2019Community/source.extension.Designer.cs new file mode 100644 index 00000000..a73b5654 --- /dev/null +++ b/src/OpenInVS2019Community/source.extension.Designer.cs @@ -0,0 +1,101 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace OpenInAppVS2019Community { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class source_extension { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal source_extension() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpenInXxx.source.extension", typeof(source_extension).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Open in Altova XMLSpy. + /// + public static string _110 { + get { + return ResourceManager.GetString("110", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open a file in Altova XMLSpy XML editor directly from Solution Explorer within Visual Studio.. + /// + public static string _112 { + get { + return ResourceManager.GetString("112", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap ExtensionIcon_32x32 { + get { + object obj = ResourceManager.GetObject("ExtensionIcon_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap ExtensionIcon_32x321 { + get { + object obj = ResourceManager.GetObject("ExtensionIcon_32x321", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/src/OpenInVS2019Community/source.extension.cs b/src/OpenInVS2019Community/source.extension.cs new file mode 100644 index 00000000..5f9ced9e --- /dev/null +++ b/src/OpenInVS2019Community/source.extension.cs @@ -0,0 +1,18 @@ +// ------------------------------------------------------------------------------ +// +// This file was generated by Extensibility Tools v1.10.211 +// +// ------------------------------------------------------------------------------ +namespace OpenInVS2019Community +{ + static class Vsix + { + public const string Id = "077346DD-CC6F-4D46-BC6B-2634EE1720D0"; + public const string Name = "Open in Visual Studio 2019 Community"; + public const string Description = @"Open multiple files simultaneously in Visual Studio 2019 Community Edition directly from Solution Explorer or Code Editor window."; + public const string Language = "en-US"; + public const string Version = "1.1.51"; + public const string Author = "GregTrevellick"; + public const string Tags = "open, open in, open in VS2019, VS2019, open in Visual Studio 2019, Visual Studio 2019, community"; + } +} diff --git a/src/OpenInVS2019Community/source.extension.ico b/src/OpenInVS2019Community/source.extension.ico new file mode 100644 index 00000000..0ccd5437 Binary files /dev/null and b/src/OpenInVS2019Community/source.extension.ico differ diff --git a/src/OpenInVS2019Community/source.extension.resx b/src/OpenInVS2019Community/source.extension.resx new file mode 100644 index 00000000..962dc701 --- /dev/null +++ b/src/OpenInVS2019Community/source.extension.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Open in Visual Studio 2019 Community + + + Open multiple files simultaneously in Visual Studio 2019 Community Edition directly from Solution Explorer or Code Editor window. + + + + source.extension.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/src/OpenInVS2019Community/source.extension.vsixmanifest b/src/OpenInVS2019Community/source.extension.vsixmanifest new file mode 100644 index 00000000..915a226c --- /dev/null +++ b/src/OpenInVS2019Community/source.extension.vsixmanifest @@ -0,0 +1,25 @@ + + + + + Open in Visual Studio 2019 Community + Open multiple files simultaneously in Visual Studio 2019 Community Edition directly from Solution Explorer or Code Editor window. + https://github.com/GregTrevellick/OpenInApp.Launcher + LICENSE.txt + https://github.com/GregTrevellick/OpenInApp.Launcher/blob/master/CHANGELOG.md + Resources\VsixExtensionIcon_90x90.png + Resources\VsixExtensionPreview_175x175.png + open, open in, open in VS2019, VS2019, open in Visual Studio 2019, Visual Studio 2019, community + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Enterprise/Commands/OpenInAppCommand.cs b/src/OpenInVS2019Enterprise/Commands/OpenInAppCommand.cs new file mode 100644 index 00000000..b19f4bfe --- /dev/null +++ b/src/OpenInVS2019Enterprise/Commands/OpenInAppCommand.cs @@ -0,0 +1,41 @@ +using Microsoft.VisualStudio.Shell; +using OpenInApp.Common.Helpers; +using OpenInApp.Menu; +using OpenInVS2019Enterprise.Options.VS2019Enterprise; +using System; + +namespace OpenInVS2019Enterprise.Commands +{ + internal sealed class OpenInAppCommand + { + private readonly Package _package; + private IServiceProvider serviceProvider { get { return _package; } } + + public OpenInAppCommand(Package package) + { + _package = package; + } + + public void Initialize() + { + var menuCore = new MenuCore( + Vsix.Name, + Vsix.Version, + PackageGuids.guidOpenInVsCmdSetString, + PackageIds.CmdIdOpenInAppItemNode, + PackageIds.CmdIdOpenInAppCodeWin, + PackageIds.CmdIdOpenInAppFolderNode, + PackageIds.CmdIdOpenInAppProjNode, + GeneralOptions.keyToExecutableEnum, + VSPackage.Options.ActualPathToExe, + VSPackage.Options.FileQuantityWarningLimit, + VSPackage.Options.SuppressTypicalFileExtensionsWarning, + VSPackage.Options.TypicalFileExtensions, + GeneralOptions.keyToExecutableEnum.Description(), + serviceProvider, + VSPackage.Options); + + menuCore.MenuCoreOpenInAppCommand(_package); + } + } +} \ No newline at end of file diff --git a/src/OpenInVS2019Enterprise/OpenInVS2019Enterprise.csproj b/src/OpenInVS2019Enterprise/OpenInVS2019Enterprise.csproj new file mode 100644 index 00000000..f901a7aa --- /dev/null +++ b/src/OpenInVS2019Enterprise/OpenInVS2019Enterprise.csproj @@ -0,0 +1,285 @@ + + + + + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + true + + + + + 14.0 + + + + false + + + + + + + + Debug + AnyCPU + 2.0 + {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + {5F0FE53B-60D8-4CF3-AC10-75CA4F2C859B} + Library + Properties + OpenInVS2019Enterprise + OpenInVS2019Enterprise + v4.6.1 + true + true + true + true + true + false + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + True + False + true + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + $([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory)\..\packages\VsixCompress.1.0.1\tools\vsix-compress.targets )) + + + + + source.extension.cs + + + Component + + + source.extension.vsixmanifest + + + True + True + VSCommandTable.vsct + + + + + + + + + + Designer + VsixManifestGenerator + source.extension.resx + + + + + Menus.ctmenu + VsctGenerator + VSCommandTable.cs + Designer + + + + + LICENSE.txt + true + Always + + + true + Always + + + Always + true + + + Always + true + + + source.extension.vsixmanifest + true + Always + + + + + True + True + source.extension.vsixmanifest + true + VSPackage + + + + + {fb454d10-d473-4e49-a289-9bb8713da1a1} + OpenInApp.Command + + + {78680fb3-22e5-4200-9756-2c2cec66161d} + OpenInApp.Common + + + {89623b25-af78-475c-819f-1c5990199f87} + OpenInApp.Menu + + + + + False + ..\packages\EnvDTE.8.0.1\lib\net10\EnvDTE.dll + True + + + False + + + True + + + False + + + ..\packages\Microsoft.ApplicationInsights.2.3.0\lib\net45\Microsoft.ApplicationInsights.dll + + + + + ..\packages\Microsoft.VisualStudio.Imaging.15.0.26201\lib\net45\Microsoft.VisualStudio.Imaging.dll + True + + + ..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interop.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.14.0.14.3.25407\lib\Microsoft.VisualStudio.Shell.14.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.10.0.10.0.30319\lib\net40\Microsoft.VisualStudio.Shell.Immutable.10.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.11.0.11.0.50727\lib\net45\Microsoft.VisualStudio.Shell.Immutable.11.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.12.0.12.0.21003\lib\net45\Microsoft.VisualStudio.Shell.Immutable.12.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.14.0.14.3.25407\lib\net45\Microsoft.VisualStudio.Shell.Immutable.14.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.7.10.6071\lib\Microsoft.VisualStudio.Shell.Interop.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.10.0.10.0.30319\lib\Microsoft.VisualStudio.Shell.Interop.10.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.11.0.11.0.61030\lib\Microsoft.VisualStudio.Shell.Interop.11.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.12.0.12.0.30110\lib\Microsoft.VisualStudio.Shell.Interop.12.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.Shell.Interop.8.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.9.0.9.0.30729\lib\Microsoft.VisualStudio.Shell.Interop.9.0.dll + True + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.7.10.6070\lib\Microsoft.VisualStudio.TextManager.Interop.dll + True + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.TextManager.Interop.8.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Threading.15.3.23\lib\net45\Microsoft.VisualStudio.Threading.dll + + + ..\packages\Microsoft.VisualStudio.Utilities.15.0.26201\lib\net45\Microsoft.VisualStudio.Utilities.dll + True + + + ..\packages\Microsoft.VisualStudio.Validation.15.3.15\lib\net45\Microsoft.VisualStudio.Validation.dll + + + True + ..\packages\stdole.7.0.3301\lib\net10\stdole.dll + True + + + + + + + + + ..\packages\VsixLogger.1.1.44.0\lib\net45\VsixLogger.dll + True + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Enterprise/OpenInVS2019Enterprise.csproj.user b/src/OpenInVS2019Enterprise/OpenInVS2019Enterprise.csproj.user new file mode 100644 index 00000000..af0af56b --- /dev/null +++ b/src/OpenInVS2019Enterprise/OpenInVS2019Enterprise.csproj.user @@ -0,0 +1,11 @@ + + + + ProjectFiles + + + Program + C:\Program Files %28x86%29\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe + /rootsuffix Exp + + \ No newline at end of file diff --git a/src/OpenInVS2019Enterprise/Options/GeneralOptions.cs b/src/OpenInVS2019Enterprise/Options/GeneralOptions.cs new file mode 100644 index 00000000..71cb6007 --- /dev/null +++ b/src/OpenInVS2019Enterprise/Options/GeneralOptions.cs @@ -0,0 +1,163 @@ +using Microsoft.VisualStudio.Shell; +using OpenInApp.Command; +using OpenInApp.Common.Helpers; +using System.Collections.Generic; +using System.ComponentModel; +using System.Windows.Forms; +using OpenInApp.Menu; + +namespace OpenInVS2019Enterprise.Options.VS2019Enterprise +{ + public class GeneralOptions : DialogPage, IGeneralOptionsFile // or set to IGeneralOptionsFolder + { + internal static KeyToExecutableEnum keyToExecutableEnum = KeyToExecutableEnum.VS2019Enterprise; + private IEnumerable defaultTypicalFileExtensions = new ConstantsForAppCommon().GetDefaultTypicalFileExtensions(keyToExecutableEnum); + private const string CommonActualPathToExeOptionLabel = CommonConstants.ActualPathToExeOptionLabelPrefix + KeyToExecutableString.VS2019Enterprise; + + [Category(CommonConstants.CategorySubLevel)] + [DisplayName(CommonActualPathToExeOptionLabel)] + [Description(CommonConstants.ActualPathToExeOptionDetailedDescription)] + public string ActualPathToExe { get; set; } + + [Category(CommonConstants.CategorySubLevel)] + [DisplayName(CommonConstants.TypicalFileExtensionsOptionLabel)] + [Description(CommonConstants.TypicalFileExtensionsOptionDetailedDescription)] + // Set to 'internal' to hide in IDE Options (e.g. TreeSizeFree) + public string TypicalFileExtensions + { + get + { + if (string.IsNullOrEmpty(typicalFileExtensions)) + { + return AllAppsHelper.GetDefaultTypicalFileExtensionsAsCsv(defaultTypicalFileExtensions); + } + else + { + return typicalFileExtensions; + } + } + set + { + typicalFileExtensions = value; + } + } + + [Category(CommonConstants.CategorySubLevel)] + [DisplayName(CommonConstants.SuppressTypicalFileExtensionsWarningOptionLabel)] + [Description(CommonConstants.SuppressTypicalFileExtensionsWarningDetailedDescription)] + // Set to 'internal' to hide in IDE Options (e.g. TreeSizeFree) + public bool SuppressTypicalFileExtensionsWarning { get; set; } = false; + + [Category(CommonConstants.CategorySubLevel)] + [DisplayName(CommonConstants.FileQuantityWarningLimitOptionLabel)] + [Description(CommonConstants.FileQuantityWarningLimitOptionDetailedDescription)] + public string FileQuantityWarningLimit + { + get + { + if (string.IsNullOrEmpty(fileQuantityWarningLimit)) + { + return CommonConstants.DefaultFileQuantityWarningLimit; + } + else + { + return fileQuantityWarningLimit; + } + } + set + { + int x; + var isInteger = int.TryParse(value, out x); + if (!isInteger) + { + MessageBox.Show( + CommonConstants.FileQuantityWarningLimitInvalid, + new ConstantsForAppCommon().Caption, + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + else + { + fileQuantityWarningLimit = value; + } + } + } + + private string fileQuantityWarningLimit; + private string typicalFileExtensions; + + internal int FileQuantityWarningLimitInt + { + get + { + int x; + var isInteger = int.TryParse(FileQuantityWarningLimit, out x); + if (isInteger) + { + return x; + } + else + { + return 0; + } + } + } + + public override void LoadSettingsFromStorage() + { + base.LoadSettingsFromStorage(); + + if (string.IsNullOrEmpty(TypicalFileExtensions)) + { + TypicalFileExtensions = AllAppsHelper.GetDefaultTypicalFileExtensionsAsCsv(defaultTypicalFileExtensions); + } + + if (string.IsNullOrEmpty(ActualPathToExe)) + { + ActualPathToExe = GeneralOptionsHelper.GetActualPathToExe(keyToExecutableEnum); + } + + previousActualPathToExe = ActualPathToExe; + } + + private string previousActualPathToExe { get; set; } + + protected override void OnApply(PageApplyEventArgs e) + { + var actualPathToExeChanged = false; + + if (ActualPathToExe != previousActualPathToExe) + { + actualPathToExeChanged = true; + previousActualPathToExe = ActualPathToExe; + } + + if (actualPathToExeChanged) + { + if (!ArtefactsHelper.DoesActualPathToExeExist(ActualPathToExe)) + { + e.ApplyBehavior = ApplyKind.Cancel; + + var caption = new ConstantsForAppCommon().Caption; + + var filePrompterHelper = new FilePrompterHelper(caption, keyToExecutableEnum.Description()); + + var persistOptionsDto = filePrompterHelper.PromptForActualExeFile(ActualPathToExe); + + if (persistOptionsDto.Persist) + { + PersistVSToolOptions(persistOptionsDto.ValueToPersist); + } + } + } + + base.OnApply(e); + } + + public void PersistVSToolOptions(string fileName) + { + VSPackage.Options.ActualPathToExe = fileName; + VSPackage.Options.SaveSettingsToStorage(); + } + } +} \ No newline at end of file diff --git a/src/OpenInVS2019Enterprise/Properties/AssemblyInfo.cs b/src/OpenInVS2019Enterprise/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..f558c085 --- /dev/null +++ b/src/OpenInVS2019Enterprise/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using OpenInVS2019Enterprise; +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle(Vsix.Name)] +[assembly: AssemblyDescription(Vsix.Description)] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany(Vsix.Author)] +[assembly: AssemblyProduct(Vsix.Name)] +[assembly: AssemblyCopyright(Vsix.Author)] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture(Vsix.Language)] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +//[assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion(Vsix.Version + ".*")] +//[assembly: AssemblyVersion("1.0.0.0")] +//[assembly: AssemblyFileVersion("1.0.0.0")] +//[assembly: AssemblyInformationalVersion("1.0.0-alpha")] \ No newline at end of file diff --git a/src/OpenInVS2019Enterprise/Properties/vsix-compress.props b/src/OpenInVS2019Enterprise/Properties/vsix-compress.props new file mode 100644 index 00000000..f57c7b39 --- /dev/null +++ b/src/OpenInVS2019Enterprise/Properties/vsix-compress.props @@ -0,0 +1,19 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Enterprise/Resources/VsixCommandIcon_16x16.png b/src/OpenInVS2019Enterprise/Resources/VsixCommandIcon_16x16.png new file mode 100644 index 00000000..2cef7619 Binary files /dev/null and b/src/OpenInVS2019Enterprise/Resources/VsixCommandIcon_16x16.png differ diff --git a/src/OpenInVS2019Enterprise/Resources/VsixExtensionIcon_90x90.png b/src/OpenInVS2019Enterprise/Resources/VsixExtensionIcon_90x90.png new file mode 100644 index 00000000..4c827401 Binary files /dev/null and b/src/OpenInVS2019Enterprise/Resources/VsixExtensionIcon_90x90.png differ diff --git a/src/OpenInVS2019Enterprise/Resources/VsixExtensionPreview_175x175.png b/src/OpenInVS2019Enterprise/Resources/VsixExtensionPreview_175x175.png new file mode 100644 index 00000000..4ecf00c1 Binary files /dev/null and b/src/OpenInVS2019Enterprise/Resources/VsixExtensionPreview_175x175.png differ diff --git a/src/OpenInVS2019Enterprise/VSCommandTable.cs b/src/OpenInVS2019Enterprise/VSCommandTable.cs new file mode 100644 index 00000000..b4bb5d90 --- /dev/null +++ b/src/OpenInVS2019Enterprise/VSCommandTable.cs @@ -0,0 +1,37 @@ +// ------------------------------------------------------------------------------ +// +// This file was generated by Extensibility Tools v1.10.188 +// +// ------------------------------------------------------------------------------ +namespace OpenInVS2019Enterprise +{ + using System; + + /// + /// Helper class that exposes all GUIDs used across VS Package. + /// + internal sealed partial class PackageGuids + { + public const string guidOpenInAppPackageString = "73964048-7313-47fa-a646-5d719fdfeea3"; + public const string guidOpenInVsCmdSetString = "711e6e25-6e9d-4cbb-8e25-052a17abd64b"; + public const string guidImagesString = "b1b0350b-e81b-47b5-ab93-933084a83a54"; + public static Guid guidOpenInAppPackage = new Guid(guidOpenInAppPackageString); + public static Guid guidOpenInVsCmdSet = new Guid(guidOpenInVsCmdSetString); + public static Guid guidImages = new Guid(guidImagesString); + } + /// + /// Helper class that encapsulates all CommandIDs uses across VS Package. + /// + internal sealed partial class PackageIds + { + public const int GroupOpenInAppCodeWin = 0x1030; + public const int CmdIdOpenInAppCodeWin = 0x0100; + public const int GroupOpenInAppItemNode = 0x1040; + public const int CmdIdOpenInAppItemNode = 0x0110; + public const int GroupOpenInAppFolderNode = 0x1050; + public const int CmdIdOpenInAppFolderNode = 0x0120; + public const int GroupOpenInAppProjNode = 0x1060; + public const int CmdIdOpenInAppProjNode = 0x0130; + public const int bmpPic1 = 0x0001; + } +} diff --git a/src/OpenInVS2019Enterprise/VSCommandTable.vsct b/src/OpenInVS2019Enterprise/VSCommandTable.vsct new file mode 100644 index 00000000..bfe8e12b --- /dev/null +++ b/src/OpenInVS2019Enterprise/VSCommandTable.vsct @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Enterprise/VSPackage.cs b/src/OpenInVS2019Enterprise/VSPackage.cs new file mode 100644 index 00000000..4a027ecb --- /dev/null +++ b/src/OpenInVS2019Enterprise/VSPackage.cs @@ -0,0 +1,29 @@ +using Microsoft.VisualStudio.Shell; +using OpenInApp.Common.Helpers; +using OpenInVS2019Enterprise.Commands; +using OpenInVS2019Enterprise.Options.VS2019Enterprise; +using System; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +namespace OpenInVS2019Enterprise +{ + [PackageRegistration(UseManagedResourcesOnly = true)] + [InstalledProductRegistration(productName: "#110", productDetails: "#112", productId: Vsix.Version, IconResourceID = 400)] + [ProvideMenuResource("Menus.ctmenu", 1)] + [Guid(PackageGuids.guidOpenInAppPackageString)] + [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")] + [ProvideOptionPage(typeof(GeneralOptions), Vsix.Name, CommonConstants.CategorySubLevel, 0, 0, true)] + public sealed class VSPackage : Package + { + public static GeneralOptions Options { get; private set; } + + protected override void Initialize() + { + Options = (GeneralOptions)GetDialogPage(typeof(GeneralOptions)); + + new OpenInAppCommand(this).Initialize(); + base.Initialize(); + } + } +} diff --git a/src/OpenInVS2019Enterprise/app.config b/src/OpenInVS2019Enterprise/app.config new file mode 100644 index 00000000..41766109 --- /dev/null +++ b/src/OpenInVS2019Enterprise/app.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/OpenInVS2019Enterprise/packages.config b/src/OpenInVS2019Enterprise/packages.config new file mode 100644 index 00000000..1d2c18d5 --- /dev/null +++ b/src/OpenInVS2019Enterprise/packages.config @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Enterprise/source.extension.Designer.cs b/src/OpenInVS2019Enterprise/source.extension.Designer.cs new file mode 100644 index 00000000..73c6bb8c --- /dev/null +++ b/src/OpenInVS2019Enterprise/source.extension.Designer.cs @@ -0,0 +1,101 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace OpenInVS2019Enterprise { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class source_extension { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal source_extension() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpenInXxx.source.extension", typeof(source_extension).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Open in Altova XMLSpy. + /// + public static string _110 { + get { + return ResourceManager.GetString("110", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open a file in Altova XMLSpy XML editor directly from Solution Explorer within Visual Studio.. + /// + public static string _112 { + get { + return ResourceManager.GetString("112", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap ExtensionIcon_32x32 { + get { + object obj = ResourceManager.GetObject("ExtensionIcon_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap ExtensionIcon_32x321 { + get { + object obj = ResourceManager.GetObject("ExtensionIcon_32x321", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/src/OpenInVS2019Enterprise/source.extension.cs b/src/OpenInVS2019Enterprise/source.extension.cs new file mode 100644 index 00000000..dc5d63b0 --- /dev/null +++ b/src/OpenInVS2019Enterprise/source.extension.cs @@ -0,0 +1,18 @@ +// ------------------------------------------------------------------------------ +// +// This file was generated by Extensibility Tools v1.10.211 +// +// ------------------------------------------------------------------------------ +namespace OpenInVS2019Enterprise +{ + static class Vsix + { + public const string Id = "348687B9-1B76-47EB-931C-1605660E3D7B"; + public const string Name = "Open in Visual Studio 2019 Enterprise"; + public const string Description = @"Open multiple files simultaneously in Visual Studio 2019 Enterprise Edition directly from Solution Explorer or Code Editor window."; + public const string Language = "en-US"; + public const string Version = "1.1.51"; + public const string Author = "GregTrevellick"; + public const string Tags = "open, open in, open in VS2019, VS2019, open in Visual Studio 2019, Visual Studio 2019, enterprise"; + } +} diff --git a/src/OpenInVS2019Enterprise/source.extension.ico b/src/OpenInVS2019Enterprise/source.extension.ico new file mode 100644 index 00000000..0ccd5437 Binary files /dev/null and b/src/OpenInVS2019Enterprise/source.extension.ico differ diff --git a/src/OpenInVS2019Enterprise/source.extension.resx b/src/OpenInVS2019Enterprise/source.extension.resx new file mode 100644 index 00000000..ba8b6f05 --- /dev/null +++ b/src/OpenInVS2019Enterprise/source.extension.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Open in Visual Studio 2019 Enterprise + + + Open multiple files simultaneously in Visual Studio 2019 Enterprise Edition directly from Solution Explorer or Code Editor window. + + + + source.extension.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/src/OpenInVS2019Enterprise/source.extension.vsixmanifest b/src/OpenInVS2019Enterprise/source.extension.vsixmanifest new file mode 100644 index 00000000..0e68582e --- /dev/null +++ b/src/OpenInVS2019Enterprise/source.extension.vsixmanifest @@ -0,0 +1,25 @@ + + + + + Open in Visual Studio 2019 Enterprise + Open multiple files simultaneously in Visual Studio 2019 Enterprise Edition directly from Solution Explorer or Code Editor window. + https://github.com/GregTrevellick/OpenInApp.Launcher + LICENSE.txt + https://github.com/GregTrevellick/OpenInApp.Launcher/blob/master/CHANGELOG.md + Resources\VsixExtensionIcon_90x90.png + Resources\VsixExtensionPreview_175x175.png + open, open in, open in VS2019, VS2019, open in Visual Studio 2019, Visual Studio 2019, enterprise + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Professional/Commands/OpenInAppCommand.cs b/src/OpenInVS2019Professional/Commands/OpenInAppCommand.cs new file mode 100644 index 00000000..90c725ee --- /dev/null +++ b/src/OpenInVS2019Professional/Commands/OpenInAppCommand.cs @@ -0,0 +1,41 @@ +using Microsoft.VisualStudio.Shell; +using OpenInApp.Common.Helpers; +using OpenInApp.Menu; +using OpenInVS2019Professional.Options.VS2019Professional; +using System; + +namespace OpenInVS2019Professional.Commands +{ + internal sealed class OpenInAppCommand + { + private readonly Package _package; + private IServiceProvider serviceProvider { get { return _package; } } + + public OpenInAppCommand(Package package) + { + _package = package; + } + + public void Initialize() + { + var menuCore = new MenuCore( + Vsix.Name, + Vsix.Version, + PackageGuids.guidOpenInVsCmdSetString, + PackageIds.CmdIdOpenInAppItemNode, + PackageIds.CmdIdOpenInAppCodeWin, + PackageIds.CmdIdOpenInAppFolderNode, + PackageIds.CmdIdOpenInAppProjNode, + GeneralOptions.keyToExecutableEnum, + VSPackage.Options.ActualPathToExe, + VSPackage.Options.FileQuantityWarningLimit, + VSPackage.Options.SuppressTypicalFileExtensionsWarning, + VSPackage.Options.TypicalFileExtensions, + GeneralOptions.keyToExecutableEnum.Description(), + serviceProvider, + VSPackage.Options); + + menuCore.MenuCoreOpenInAppCommand(_package); + } + } +} \ No newline at end of file diff --git a/src/OpenInVS2019Professional/OpenInVS2019Professional.csproj b/src/OpenInVS2019Professional/OpenInVS2019Professional.csproj new file mode 100644 index 00000000..f5121382 --- /dev/null +++ b/src/OpenInVS2019Professional/OpenInVS2019Professional.csproj @@ -0,0 +1,285 @@ + + + + + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + true + + + + + 14.0 + + + + false + + + + + + + + Debug + AnyCPU + 2.0 + {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + {38A17EBB-816D-416B-9F0C-B48DF447E51F} + Library + Properties + OpenInVS2019Professional + OpenInVS2019Professional + v4.6.1 + true + true + true + true + true + false + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + True + False + true + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + $([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory)\..\packages\VsixCompress.1.0.1\tools\vsix-compress.targets )) + + + + + source.extension.cs + + + Component + + + source.extension.vsixmanifest + + + True + True + VSCommandTable.vsct + + + + + + + + + + Designer + VsixManifestGenerator + source.extension.resx + + + + + Menus.ctmenu + VsctGenerator + VSCommandTable.cs + Designer + + + + + LICENSE.txt + true + Always + + + true + Always + + + Always + true + + + Always + true + + + source.extension.vsixmanifest + true + Always + + + + + True + True + source.extension.vsixmanifest + true + VSPackage + + + + + {fb454d10-d473-4e49-a289-9bb8713da1a1} + OpenInApp.Command + + + {78680fb3-22e5-4200-9756-2c2cec66161d} + OpenInApp.Common + + + {89623b25-af78-475c-819f-1c5990199f87} + OpenInApp.Menu + + + + + False + ..\packages\EnvDTE.8.0.1\lib\net10\EnvDTE.dll + True + + + False + + + True + + + False + + + ..\packages\Microsoft.ApplicationInsights.2.3.0\lib\net45\Microsoft.ApplicationInsights.dll + + + + + ..\packages\Microsoft.VisualStudio.Imaging.15.0.26201\lib\net45\Microsoft.VisualStudio.Imaging.dll + True + + + ..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interop.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.14.0.14.3.25407\lib\Microsoft.VisualStudio.Shell.14.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.10.0.10.0.30319\lib\net40\Microsoft.VisualStudio.Shell.Immutable.10.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.11.0.11.0.50727\lib\net45\Microsoft.VisualStudio.Shell.Immutable.11.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.12.0.12.0.21003\lib\net45\Microsoft.VisualStudio.Shell.Immutable.12.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.14.0.14.3.25407\lib\net45\Microsoft.VisualStudio.Shell.Immutable.14.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.7.10.6071\lib\Microsoft.VisualStudio.Shell.Interop.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.10.0.10.0.30319\lib\Microsoft.VisualStudio.Shell.Interop.10.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.11.0.11.0.61030\lib\Microsoft.VisualStudio.Shell.Interop.11.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.12.0.12.0.30110\lib\Microsoft.VisualStudio.Shell.Interop.12.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.Shell.Interop.8.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.9.0.9.0.30729\lib\Microsoft.VisualStudio.Shell.Interop.9.0.dll + True + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.7.10.6070\lib\Microsoft.VisualStudio.TextManager.Interop.dll + True + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.TextManager.Interop.8.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Threading.15.3.23\lib\net45\Microsoft.VisualStudio.Threading.dll + + + ..\packages\Microsoft.VisualStudio.Utilities.15.0.26201\lib\net45\Microsoft.VisualStudio.Utilities.dll + True + + + ..\packages\Microsoft.VisualStudio.Validation.15.3.15\lib\net45\Microsoft.VisualStudio.Validation.dll + + + True + ..\packages\stdole.7.0.3301\lib\net10\stdole.dll + True + + + + + + + + + ..\packages\VsixLogger.1.1.44.0\lib\net45\VsixLogger.dll + True + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Professional/OpenInVS2019Professional.csproj.user b/src/OpenInVS2019Professional/OpenInVS2019Professional.csproj.user new file mode 100644 index 00000000..af0af56b --- /dev/null +++ b/src/OpenInVS2019Professional/OpenInVS2019Professional.csproj.user @@ -0,0 +1,11 @@ + + + + ProjectFiles + + + Program + C:\Program Files %28x86%29\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe + /rootsuffix Exp + + \ No newline at end of file diff --git a/src/OpenInVS2019Professional/Options/GeneralOptions.cs b/src/OpenInVS2019Professional/Options/GeneralOptions.cs new file mode 100644 index 00000000..049d04e7 --- /dev/null +++ b/src/OpenInVS2019Professional/Options/GeneralOptions.cs @@ -0,0 +1,163 @@ +using Microsoft.VisualStudio.Shell; +using OpenInApp.Command; +using OpenInApp.Common.Helpers; +using System.Collections.Generic; +using System.ComponentModel; +using System.Windows.Forms; +using OpenInApp.Menu; + +namespace OpenInVS2019Professional.Options.VS2019Professional +{ + public class GeneralOptions : DialogPage, IGeneralOptionsFile // or set to IGeneralOptionsFolder + { + internal static KeyToExecutableEnum keyToExecutableEnum = KeyToExecutableEnum.VS2019Professional; + private IEnumerable defaultTypicalFileExtensions = new ConstantsForAppCommon().GetDefaultTypicalFileExtensions(keyToExecutableEnum); + private const string CommonActualPathToExeOptionLabel = CommonConstants.ActualPathToExeOptionLabelPrefix + KeyToExecutableString.VS2019Professional; + + [Category(CommonConstants.CategorySubLevel)] + [DisplayName(CommonActualPathToExeOptionLabel)] + [Description(CommonConstants.ActualPathToExeOptionDetailedDescription)] + public string ActualPathToExe { get; set; } + + [Category(CommonConstants.CategorySubLevel)] + [DisplayName(CommonConstants.TypicalFileExtensionsOptionLabel)] + [Description(CommonConstants.TypicalFileExtensionsOptionDetailedDescription)] + // Set to 'internal' to hide in IDE Options (e.g. TreeSizeFree) + public string TypicalFileExtensions + { + get + { + if (string.IsNullOrEmpty(typicalFileExtensions)) + { + return AllAppsHelper.GetDefaultTypicalFileExtensionsAsCsv(defaultTypicalFileExtensions); + } + else + { + return typicalFileExtensions; + } + } + set + { + typicalFileExtensions = value; + } + } + + [Category(CommonConstants.CategorySubLevel)] + [DisplayName(CommonConstants.SuppressTypicalFileExtensionsWarningOptionLabel)] + [Description(CommonConstants.SuppressTypicalFileExtensionsWarningDetailedDescription)] + // Set to 'internal' to hide in IDE Options (e.g. TreeSizeFree) + public bool SuppressTypicalFileExtensionsWarning { get; set; } = false; + + [Category(CommonConstants.CategorySubLevel)] + [DisplayName(CommonConstants.FileQuantityWarningLimitOptionLabel)] + [Description(CommonConstants.FileQuantityWarningLimitOptionDetailedDescription)] + public string FileQuantityWarningLimit + { + get + { + if (string.IsNullOrEmpty(fileQuantityWarningLimit)) + { + return CommonConstants.DefaultFileQuantityWarningLimit; + } + else + { + return fileQuantityWarningLimit; + } + } + set + { + int x; + var isInteger = int.TryParse(value, out x); + if (!isInteger) + { + MessageBox.Show( + CommonConstants.FileQuantityWarningLimitInvalid, + new ConstantsForAppCommon().Caption, + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + else + { + fileQuantityWarningLimit = value; + } + } + } + + private string fileQuantityWarningLimit; + private string typicalFileExtensions; + + internal int FileQuantityWarningLimitInt + { + get + { + int x; + var isInteger = int.TryParse(FileQuantityWarningLimit, out x); + if (isInteger) + { + return x; + } + else + { + return 0; + } + } + } + + public override void LoadSettingsFromStorage() + { + base.LoadSettingsFromStorage(); + + if (string.IsNullOrEmpty(TypicalFileExtensions)) + { + TypicalFileExtensions = AllAppsHelper.GetDefaultTypicalFileExtensionsAsCsv(defaultTypicalFileExtensions); + } + + if (string.IsNullOrEmpty(ActualPathToExe)) + { + ActualPathToExe = GeneralOptionsHelper.GetActualPathToExe(keyToExecutableEnum); + } + + previousActualPathToExe = ActualPathToExe; + } + + private string previousActualPathToExe { get; set; } + + protected override void OnApply(PageApplyEventArgs e) + { + var actualPathToExeChanged = false; + + if (ActualPathToExe != previousActualPathToExe) + { + actualPathToExeChanged = true; + previousActualPathToExe = ActualPathToExe; + } + + if (actualPathToExeChanged) + { + if (!ArtefactsHelper.DoesActualPathToExeExist(ActualPathToExe)) + { + e.ApplyBehavior = ApplyKind.Cancel; + + var caption = new ConstantsForAppCommon().Caption; + + var filePrompterHelper = new FilePrompterHelper(caption, keyToExecutableEnum.Description()); + + var persistOptionsDto = filePrompterHelper.PromptForActualExeFile(ActualPathToExe); + + if (persistOptionsDto.Persist) + { + PersistVSToolOptions(persistOptionsDto.ValueToPersist); + } + } + } + + base.OnApply(e); + } + + public void PersistVSToolOptions(string fileName) + { + VSPackage.Options.ActualPathToExe = fileName; + VSPackage.Options.SaveSettingsToStorage(); + } + } +} \ No newline at end of file diff --git a/src/OpenInVS2019Professional/Properties/AssemblyInfo.cs b/src/OpenInVS2019Professional/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..075ce4a5 --- /dev/null +++ b/src/OpenInVS2019Professional/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using OpenInVS2019Professional; +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle(Vsix.Name)] +[assembly: AssemblyDescription(Vsix.Description)] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany(Vsix.Author)] +[assembly: AssemblyProduct(Vsix.Name)] +[assembly: AssemblyCopyright(Vsix.Author)] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture(Vsix.Language)] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +//[assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion(Vsix.Version + ".*")] +//[assembly: AssemblyVersion("1.0.0.0")] +//[assembly: AssemblyFileVersion("1.0.0.0")] +//[assembly: AssemblyInformationalVersion("1.0.0-alpha")] \ No newline at end of file diff --git a/src/OpenInVS2019Professional/Properties/vsix-compress.props b/src/OpenInVS2019Professional/Properties/vsix-compress.props new file mode 100644 index 00000000..f57c7b39 --- /dev/null +++ b/src/OpenInVS2019Professional/Properties/vsix-compress.props @@ -0,0 +1,19 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Professional/Resources/VsixCommandIcon_16x16.png b/src/OpenInVS2019Professional/Resources/VsixCommandIcon_16x16.png new file mode 100644 index 00000000..2cef7619 Binary files /dev/null and b/src/OpenInVS2019Professional/Resources/VsixCommandIcon_16x16.png differ diff --git a/src/OpenInVS2019Professional/Resources/VsixExtensionIcon_90x90.png b/src/OpenInVS2019Professional/Resources/VsixExtensionIcon_90x90.png new file mode 100644 index 00000000..4c827401 Binary files /dev/null and b/src/OpenInVS2019Professional/Resources/VsixExtensionIcon_90x90.png differ diff --git a/src/OpenInVS2019Professional/Resources/VsixExtensionPreview_175x175.png b/src/OpenInVS2019Professional/Resources/VsixExtensionPreview_175x175.png new file mode 100644 index 00000000..4ecf00c1 Binary files /dev/null and b/src/OpenInVS2019Professional/Resources/VsixExtensionPreview_175x175.png differ diff --git a/src/OpenInVS2019Professional/VSCommandTable.cs b/src/OpenInVS2019Professional/VSCommandTable.cs new file mode 100644 index 00000000..11aa674c --- /dev/null +++ b/src/OpenInVS2019Professional/VSCommandTable.cs @@ -0,0 +1,37 @@ +// ------------------------------------------------------------------------------ +// +// This file was generated by Extensibility Tools v1.10.188 +// +// ------------------------------------------------------------------------------ +namespace OpenInVS2019Professional +{ + using System; + + /// + /// Helper class that exposes all GUIDs used across VS Package. + /// + internal sealed partial class PackageGuids + { + public const string guidOpenInAppPackageString = "44147a97-9f32-4b28-b313-4a257b6ee3ae"; + public const string guidOpenInVsCmdSetString = "90dab6ad-0bde-4dd5-b84d-a0da46180e1c"; + public const string guidImagesString = "fccf8183-d712-4f44-b365-680ba2444ef4"; + public static Guid guidOpenInAppPackage = new Guid(guidOpenInAppPackageString); + public static Guid guidOpenInVsCmdSet = new Guid(guidOpenInVsCmdSetString); + public static Guid guidImages = new Guid(guidImagesString); + } + /// + /// Helper class that encapsulates all CommandIDs uses across VS Package. + /// + internal sealed partial class PackageIds + { + public const int GroupOpenInAppCodeWin = 0x1030; + public const int CmdIdOpenInAppCodeWin = 0x0100; + public const int GroupOpenInAppItemNode = 0x1040; + public const int CmdIdOpenInAppItemNode = 0x0110; + public const int GroupOpenInAppFolderNode = 0x1050; + public const int CmdIdOpenInAppFolderNode = 0x0120; + public const int GroupOpenInAppProjNode = 0x1060; + public const int CmdIdOpenInAppProjNode = 0x0130; + public const int bmpPic1 = 0x0001; + } +} diff --git a/src/OpenInVS2019Professional/VSCommandTable.vsct b/src/OpenInVS2019Professional/VSCommandTable.vsct new file mode 100644 index 00000000..1a93b517 --- /dev/null +++ b/src/OpenInVS2019Professional/VSCommandTable.vsct @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Professional/VSPackage.cs b/src/OpenInVS2019Professional/VSPackage.cs new file mode 100644 index 00000000..b197412a --- /dev/null +++ b/src/OpenInVS2019Professional/VSPackage.cs @@ -0,0 +1,29 @@ +using Microsoft.VisualStudio.Shell; +using OpenInApp.Common.Helpers; +using OpenInVS2019Professional.Commands; +using OpenInVS2019Professional.Options.VS2019Professional; +using System; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +namespace OpenInVS2019Professional +{ + [PackageRegistration(UseManagedResourcesOnly = true)] + [InstalledProductRegistration(productName: "#110", productDetails: "#112", productId: Vsix.Version, IconResourceID = 400)] + [ProvideMenuResource("Menus.ctmenu", 1)] + [Guid(PackageGuids.guidOpenInAppPackageString)] + [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")] + [ProvideOptionPage(typeof(GeneralOptions), Vsix.Name, CommonConstants.CategorySubLevel, 0, 0, true)] + public sealed class VSPackage : Package + { + public static GeneralOptions Options { get; private set; } + + protected override void Initialize() + { + Options = (GeneralOptions)GetDialogPage(typeof(GeneralOptions)); + + new OpenInAppCommand(this).Initialize(); + base.Initialize(); + } + } +} diff --git a/src/OpenInVS2019Professional/app.config b/src/OpenInVS2019Professional/app.config new file mode 100644 index 00000000..41766109 --- /dev/null +++ b/src/OpenInVS2019Professional/app.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/OpenInVS2019Professional/packages.config b/src/OpenInVS2019Professional/packages.config new file mode 100644 index 00000000..1d2c18d5 --- /dev/null +++ b/src/OpenInVS2019Professional/packages.config @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/OpenInVS2019Professional/source.extension.Designer.cs b/src/OpenInVS2019Professional/source.extension.Designer.cs new file mode 100644 index 00000000..69d9e20b --- /dev/null +++ b/src/OpenInVS2019Professional/source.extension.Designer.cs @@ -0,0 +1,101 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace OpenInVS2019Professional { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class source_extension { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal source_extension() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpenInXxx.source.extension", typeof(source_extension).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Open in Altova XMLSpy. + /// + public static string _110 { + get { + return ResourceManager.GetString("110", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open a file in Altova XMLSpy XML editor directly from Solution Explorer within Visual Studio.. + /// + public static string _112 { + get { + return ResourceManager.GetString("112", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap ExtensionIcon_32x32 { + get { + object obj = ResourceManager.GetObject("ExtensionIcon_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap ExtensionIcon_32x321 { + get { + object obj = ResourceManager.GetObject("ExtensionIcon_32x321", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/src/OpenInVS2019Professional/source.extension.cs b/src/OpenInVS2019Professional/source.extension.cs new file mode 100644 index 00000000..f4486609 --- /dev/null +++ b/src/OpenInVS2019Professional/source.extension.cs @@ -0,0 +1,18 @@ +// ------------------------------------------------------------------------------ +// +// This file was generated by Extensibility Tools v1.10.211 +// +// ------------------------------------------------------------------------------ +namespace OpenInVS2019Professional +{ + static class Vsix + { + public const string Id = "4F2AA665-83D6-4646-9F40-2211748FBABD"; + public const string Name = "Open in Visual Studio 2019 Professional"; + public const string Description = @"Open multiple files simultaneously in Visual Studio 2019 Professional Edition directly from Solution Explorer or Code Editor window."; + public const string Language = "en-US"; + public const string Version = "1.1.51"; + public const string Author = "GregTrevellick"; + public const string Tags = "open, open in, open in VS2019, VS2019, open in Visual Studio 2019, Visual Studio 2019, professional"; + } +} diff --git a/src/OpenInVS2019Professional/source.extension.ico b/src/OpenInVS2019Professional/source.extension.ico new file mode 100644 index 00000000..0ccd5437 Binary files /dev/null and b/src/OpenInVS2019Professional/source.extension.ico differ diff --git a/src/OpenInVS2019Professional/source.extension.resx b/src/OpenInVS2019Professional/source.extension.resx new file mode 100644 index 00000000..f833f46b --- /dev/null +++ b/src/OpenInVS2019Professional/source.extension.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Open in Visual Studio 2019 Professional + + + Open multiple files simultaneously in Visual Studio 2019 Professional Edition directly from Solution Explorer or Code Editor window. + + + + source.extension.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/src/OpenInVS2019Professional/source.extension.vsixmanifest b/src/OpenInVS2019Professional/source.extension.vsixmanifest new file mode 100644 index 00000000..209f13f4 --- /dev/null +++ b/src/OpenInVS2019Professional/source.extension.vsixmanifest @@ -0,0 +1,25 @@ + + + + + Open in Visual Studio 2019 Professional + Open multiple files simultaneously in Visual Studio 2019 Professional Edition directly from Solution Explorer or Code Editor window. + https://github.com/GregTrevellick/OpenInApp.Launcher + LICENSE.txt + https://github.com/GregTrevellick/OpenInApp.Launcher/blob/master/CHANGELOG.md + Resources\VsixExtensionIcon_90x90.png + Resources\VsixExtensionPreview_175x175.png + open, open in, open in VS2019, VS2019, open in Visual Studio 2019, Visual Studio 2019, professional + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/VisualStudioMarketPlaceAssets/Gulpfile.js b/src/VisualStudioMarketPlaceAssets/Gulpfile.js index f543f8b6..d2f00d8c 100644 --- a/src/VisualStudioMarketPlaceAssets/Gulpfile.js +++ b/src/VisualStudioMarketPlaceAssets/Gulpfile.js @@ -27,6 +27,9 @@ gulp.task('OpenInVS2015', function () { return OIAConcat('OpenInVS2015', 'Visual gulp.task('OpenInVS2017Community', function () { return OIAConcat('OpenInVS2017Community', 'Visual Studio 2017 Community Edition') }); gulp.task('OpenInVS2017Enterprise', function () { return OIAConcat('OpenInVS2017Enterprise', 'Visual Studio 2017 Enterprise Edition') }); gulp.task('OpenInVS2017Professional', function () { return OIAConcat('OpenInVS2017Professional', 'Visual Studio 2017 Professional Edition') }); +gulp.task('OpenInVS2019Community', function () { return OIAConcat('OpenInVS2019Community', 'Visual Studio 2019 Community Edition') }); +gulp.task('OpenInVS2019Enterprise', function () { return OIAConcat('OpenInVS2019Enterprise', 'Visual Studio 2019 Enterprise Edition') }); +gulp.task('OpenInVS2019Professional', function () { return OIAConcat('OpenInVS2019Professional', 'Visual Studio 2019 Professional Edition') }); gulp.task('OpenInWinDirStat', function () { return OIAConcat('OpenInWinDirStat', 'WinDirStat') }); gulp.task('OpenInXamarinStudio', function () { return OIAConcat('OpenInXamarinStudio', 'Xamarin Studio') }); @@ -54,6 +57,9 @@ gulp.task('default', , 'OpenInVS2017Community' , 'OpenInVS2017Enterprise' , 'OpenInVS2017Professional' + , 'OpenInVS2019Community' + , 'OpenInVS2019Enterprise' + , 'OpenInVS2019Professional' , 'OpenInWinDirStat' , 'OpenInXamarinStudio']); @@ -140,7 +146,10 @@ function GetAppType(appNam) { appNam === 'OpenInVS2015' || appNam === 'OpenInVS2017Community' || appNam === 'OpenInVS2017Enterprise' || - appNam === 'OpenInVS2017Professional') { + appNam === 'OpenInVS2017Professional' || + appNam === 'OpenInVS2019Community' || + appNam === 'OpenInVS2019Enterprise' || + appNam === 'OpenInVS2019Professional') { appType = 'FilesAndFolders_gif' } diff --git a/src/VisualStudioMarketPlaceAssets/OpenInVS2019Community/README.md b/src/VisualStudioMarketPlaceAssets/OpenInVS2019Community/README.md new file mode 100644 index 00000000..f08b131b --- /dev/null +++ b/src/VisualStudioMarketPlaceAssets/OpenInVS2019Community/README.md @@ -0,0 +1,67 @@ +Open multiple files and/or folders simultaneously in [Visual Studio 2019 Community Edition][ThirdPartyAppHomePage] directly from [Visual Studio's][VisualStudioURL] Code Editor window and / or Solution Explorer. + + + - *If you like this ***FREE*** tool please take a few seconds out to give a star rating below and/or [help others][CharityWareURL]*. + +Similar "Open In" VS extensions can be found [here](https://marketplace.visualstudio.com/search?term=trevellick&target=VS&sortBy=Relevance). + +[![][ThirdPartyAppOfficialLogo]][ThirdPartyAppHomePage] + +![](ThirdPartyScreenShot.gif) + +## Features + +- Open multiple files and/or folders simultaneously in [Visual Studio 2019 Community Edition][ThirdPartyAppHomePage]. + +- Within the code editor window + + ![](ReadMeScreenShot_CodeEditorWindow.png) + +- From solution explorer at item level + + ![](ReadMeScreenShot_ItemNode.png) + +- From solution explorer at folder level + + ![](ReadMeScreenShot_FolderNode.png) + +- From solution explorer at project level + + ![](ReadMeScreenShot_ProjNode.png) + + +- Warning if attempting to open one or more file types whose extension is not typically associated with [Visual Studio 2019 Community Edition][ThirdPartyAppHomePage]. The list of typical file extensions is configurable in Tools > Options. + + ![](../Generic_ReadMeScreenShot_WarningNonTypical.png) + +- Option to supress the warning message if attempting to open a file whose extension is not typically associated with [Visual Studio 2019 Community Edition][ThirdPartyAppHomePage]. + + ![](../Generic_ReadMeScreenShot_OptionsGeneral.png) + + +- Warning if attempting to open a large quantity of artefacts. The quantity is configurable in Tools > Options. + + ![](../Generic_ReadMeScreenShot_WarningLargeQuantity.png) + +## Use Cases + +The [Visual Studio IDE][VisualStudioURL] has an outstanding and feature-rich editor for a wide range of file types, even in the free "Community" editions, which can be overridden to open a third-party application. + +That said, there may be times when you wish to edit a file in an alternative editor/application without overriding the default [Visual Studio][VisualStudioURL] editor, for example:- + +- You only occasionally wish to use a specific alternative editor. + +- You have overriden the default [Visual Studio][VisualStudioURL] editor to a particular application, but need easy IDE access to a second particular editor. + +- Certain files (e.g. gigantic size files, or files with complex content) may be better suited in an alternative editor. + +- Pair programming scenarios where each developer has different preferred editor. + +- You are more familiar with a certain editor's features, or simply have a favourite editor. + +[Why?][WhyURL] + + +[ThirdPartyAppOfficialLogo]: ThirdPartyLogo.png +[VisualStudioURL]: https://www.visualstudio.com/ +[CharityWareURL]: https://github.com/GregTrevellick/MiscellaneousArtefacts/wiki/Charity-Ware diff --git a/src/VisualStudioMarketPlaceAssets/OpenInVS2019Enterprise/README.md b/src/VisualStudioMarketPlaceAssets/OpenInVS2019Enterprise/README.md new file mode 100644 index 00000000..775a7c5a --- /dev/null +++ b/src/VisualStudioMarketPlaceAssets/OpenInVS2019Enterprise/README.md @@ -0,0 +1,67 @@ +Open multiple files and/or folders simultaneously in [Visual Studio 2019 Enterprise Edition][ThirdPartyAppHomePage] directly from [Visual Studio's][VisualStudioURL] Code Editor window and / or Solution Explorer. + + + - *If you like this ***FREE*** tool please take a few seconds out to give a star rating below and/or [help others][CharityWareURL]*. + +Similar "Open In" VS extensions can be found [here](https://marketplace.visualstudio.com/search?term=trevellick&target=VS&sortBy=Relevance). + +[![][ThirdPartyAppOfficialLogo]][ThirdPartyAppHomePage] + +![](ThirdPartyScreenShot.gif) + +## Features + +- Open multiple files and/or folders simultaneously in [Visual Studio 2019 Enterprise Edition][ThirdPartyAppHomePage]. + +- Within the code editor window + + ![](ReadMeScreenShot_CodeEditorWindow.png) + +- From solution explorer at item level + + ![](ReadMeScreenShot_ItemNode.png) + +- From solution explorer at folder level + + ![](ReadMeScreenShot_FolderNode.png) + +- From solution explorer at project level + + ![](ReadMeScreenShot_ProjNode.png) + + +- Warning if attempting to open one or more file types whose extension is not typically associated with [Visual Studio 2019 Enterprise Edition][ThirdPartyAppHomePage]. The list of typical file extensions is configurable in Tools > Options. + + ![](../Generic_ReadMeScreenShot_WarningNonTypical.png) + +- Option to supress the warning message if attempting to open a file whose extension is not typically associated with [Visual Studio 2019 Enterprise Edition][ThirdPartyAppHomePage]. + + ![](../Generic_ReadMeScreenShot_OptionsGeneral.png) + + +- Warning if attempting to open a large quantity of artefacts. The quantity is configurable in Tools > Options. + + ![](../Generic_ReadMeScreenShot_WarningLargeQuantity.png) + +## Use Cases + +The [Visual Studio IDE][VisualStudioURL] has an outstanding and feature-rich editor for a wide range of file types, even in the free "Community" editions, which can be overridden to open a third-party application. + +That said, there may be times when you wish to edit a file in an alternative editor/application without overriding the default [Visual Studio][VisualStudioURL] editor, for example:- + +- You only occasionally wish to use a specific alternative editor. + +- You have overriden the default [Visual Studio][VisualStudioURL] editor to a particular application, but need easy IDE access to a second particular editor. + +- Certain files (e.g. gigantic size files, or files with complex content) may be better suited in an alternative editor. + +- Pair programming scenarios where each developer has different preferred editor. + +- You are more familiar with a certain editor's features, or simply have a favourite editor. + +[Why?][WhyURL] + + +[ThirdPartyAppOfficialLogo]: ThirdPartyLogo.png +[VisualStudioURL]: https://www.visualstudio.com/ +[CharityWareURL]: https://github.com/GregTrevellick/MiscellaneousArtefacts/wiki/Charity-Ware diff --git a/src/VisualStudioMarketPlaceAssets/OpenInVS2019Professional/README.md b/src/VisualStudioMarketPlaceAssets/OpenInVS2019Professional/README.md new file mode 100644 index 00000000..40d048b5 --- /dev/null +++ b/src/VisualStudioMarketPlaceAssets/OpenInVS2019Professional/README.md @@ -0,0 +1,67 @@ +Open multiple files and/or folders simultaneously in [Visual Studio 2019 Professional Edition][ThirdPartyAppHomePage] directly from [Visual Studio's][VisualStudioURL] Code Editor window and / or Solution Explorer. + + + - *If you like this ***FREE*** tool please take a few seconds out to give a star rating below and/or [help others][CharityWareURL]*. + +Similar "Open In" VS extensions can be found [here](https://marketplace.visualstudio.com/search?term=trevellick&target=VS&sortBy=Relevance). + +[![][ThirdPartyAppOfficialLogo]][ThirdPartyAppHomePage] + +![](ThirdPartyScreenShot.gif) + +## Features + +- Open multiple files and/or folders simultaneously in [Visual Studio 2019 Professional Edition][ThirdPartyAppHomePage]. + +- Within the code editor window + + ![](ReadMeScreenShot_CodeEditorWindow.png) + +- From solution explorer at item level + + ![](ReadMeScreenShot_ItemNode.png) + +- From solution explorer at folder level + + ![](ReadMeScreenShot_FolderNode.png) + +- From solution explorer at project level + + ![](ReadMeScreenShot_ProjNode.png) + + +- Warning if attempting to open one or more file types whose extension is not typically associated with [Visual Studio 2019 Professional Edition][ThirdPartyAppHomePage]. The list of typical file extensions is configurable in Tools > Options. + + ![](../Generic_ReadMeScreenShot_WarningNonTypical.png) + +- Option to supress the warning message if attempting to open a file whose extension is not typically associated with [Visual Studio 2019 Professional Edition][ThirdPartyAppHomePage]. + + ![](../Generic_ReadMeScreenShot_OptionsGeneral.png) + + +- Warning if attempting to open a large quantity of artefacts. The quantity is configurable in Tools > Options. + + ![](../Generic_ReadMeScreenShot_WarningLargeQuantity.png) + +## Use Cases + +The [Visual Studio IDE][VisualStudioURL] has an outstanding and feature-rich editor for a wide range of file types, even in the free "Community" editions, which can be overridden to open a third-party application. + +That said, there may be times when you wish to edit a file in an alternative editor/application without overriding the default [Visual Studio][VisualStudioURL] editor, for example:- + +- You only occasionally wish to use a specific alternative editor. + +- You have overriden the default [Visual Studio][VisualStudioURL] editor to a particular application, but need easy IDE access to a second particular editor. + +- Certain files (e.g. gigantic size files, or files with complex content) may be better suited in an alternative editor. + +- Pair programming scenarios where each developer has different preferred editor. + +- You are more familiar with a certain editor's features, or simply have a favourite editor. + +[Why?][WhyURL] + + +[ThirdPartyAppOfficialLogo]: ThirdPartyLogo.png +[VisualStudioURL]: https://www.visualstudio.com/ +[CharityWareURL]: https://github.com/GregTrevellick/MiscellaneousArtefacts/wiki/Charity-Ware diff --git a/src/VisualStudioMarketPlaceAssets/VisualStudioMarketPlaceAssets.csproj b/src/VisualStudioMarketPlaceAssets/VisualStudioMarketPlaceAssets.csproj index 5acc32e4..b8fe3e95 100644 --- a/src/VisualStudioMarketPlaceAssets/VisualStudioMarketPlaceAssets.csproj +++ b/src/VisualStudioMarketPlaceAssets/VisualStudioMarketPlaceAssets.csproj @@ -80,6 +80,9 @@ + + +