Files
sbox-public/game/addons/tools/Code/CodeEditors/CodeEditor.VSCode.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

79 lines
1.8 KiB
C#

using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.Win32;
namespace Editor.CodeEditors;
[Title( "Visual Studio Code" )]
public class VisualStudioCode : ICodeEditor
{
public void OpenFile( string path, int? line, int? column )
{
var sln = CodeEditor.FindSolutionFromPath( System.IO.Path.GetDirectoryName( path ) );
var rootPath = Path.GetDirectoryName( sln );
Launch( $"-g \"{path}:{line}:{column}\" \"{rootPath}\"" );
}
public void OpenSolution()
{
Launch( $"\"{Project.Current.GetRootPath()}\"" );
}
public void OpenAddon( Project addon )
{
var projectPath = (addon != null) ? addon.GetRootPath() : "";
Launch( $"\"{projectPath}\"" );
}
public bool IsInstalled() => !string.IsNullOrEmpty( GetLocation() );
private static void Launch( string arguments )
{
var startInfo = new System.Diagnostics.ProcessStartInfo
{
FileName = GetLocation(),
Arguments = arguments,
CreateNoWindow = true,
};
System.Diagnostics.Process.Start( startInfo );
}
static string Location;
[System.Diagnostics.CodeAnalysis.SuppressMessage( "Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>" )]
private static string GetLocation()
{
if ( Location != null )
{
return Location;
}
string value = null;
using ( var key = Registry.ClassesRoot.OpenSubKey( @"Applications\\Code.exe\\shell\\open\\command" ) )
{
value = key?.GetValue( "" ) as string;
}
if ( value == null )
{
return null;
}
// Given `"C:\Program Files\Microsoft VS Code\Code.exe" "%1"` grab the first bit
Regex rgx = new Regex( "\"(.*)\" \".*\"", RegexOptions.IgnoreCase );
var matches = rgx.Matches( value );
if ( matches.Count == 0 || matches[0].Groups.Count < 2 )
{
return null;
}
Location = matches[0].Groups[1].Value;
return Location;
}
}