using Microsoft.Win32; using System; using System.IO; using System.Windows; namespace SourceGit { /// /// Application. /// public partial class App : Application { /// /// Getter/Setter for Git preference. /// public static Git.Preference Preference { get { return Git.Preference.Instance; } set { Git.Preference.Instance = value; } } /// /// Check if GIT has been configured. /// public static bool IsGitConfigured { get { return !string.IsNullOrEmpty(Preference.GitExecutable) && File.Exists(Preference.GitExecutable); } } /// /// Error handler. /// public static Action OnError { get; set; } /// /// Raise error message. /// /// public static void RaiseError(string message) { OnError?.Invoke(message); } /// /// Get popup manager by repository /// /// /// public static UI.PopupManager GetPopupManager(Git.Repository repo) { var main = Current.MainWindow as UI.Launcher; if (main == null) return null; if (repo == null) return (main.Tabs[0].Page as UI.Manager).popupManager; for (int i = 1; i < main.Tabs.Count; i++) { var opened = main.Tabs[i]; if (opened.Repo.Path == repo.Path) { return (opened.Page as UI.Dashboard).popupManager; } } return null; } /// /// Startup event. /// /// /// private void OnAppStartup(object sender, StartupEventArgs e) { // Use this app as a sequence editor? var args = e.Args; if (args.Length > 1) { if (args[0] == "--interactive-rebase") { if (args.Length < 3) { Environment.Exit(1); return; } File.WriteAllText(args[2], File.ReadAllText(args[1])); } Environment.Exit(0); return; } // Try auto configure git via registry. if (!IsGitConfigured) { var root = RegistryKey.OpenBaseKey( RegistryHive.LocalMachine, Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32); var git = root.OpenSubKey("SOFTWARE\\GitForWindows"); if (git != null) { Preference.GitExecutable = Path.Combine( git.GetValue("InstallPath") as string, "bin", "git.exe"); } } // Apply themes if (Preference.UIUseLightTheme) { foreach (var rs in Current.Resources.MergedDictionaries) { if (rs.Source != null && rs.Source.OriginalString.StartsWith("pack://application:,,,/Resources/Themes/")) { rs.Source = new Uri("pack://application:,,,/Resources/Themes/Light.xaml", UriKind.Absolute); break; } } } // Show main window Current.MainWindow = new UI.Launcher(); Current.MainWindow.Show(); } /// /// Deactivated event. /// /// /// private void OnAppDeactivated(object sender, EventArgs e) { Git.Preference.Save(); GC.Collect(); } } }