diff --git a/MediaBrowser.Common/UI/BaseApplication.cs b/MediaBrowser.Common/UI/BaseApplication.cs index ea3e3718a0..12e423f60c 100644 --- a/MediaBrowser.Common/UI/BaseApplication.cs +++ b/MediaBrowser.Common/UI/BaseApplication.cs @@ -1,21 +1,34 @@ -using System; -using System.Windows; -using MediaBrowser.Common.Kernel; +using MediaBrowser.Common.Kernel; using MediaBrowser.Common.Logging; using MediaBrowser.Model.Progress; +using Microsoft.Shell; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Windows; namespace MediaBrowser.Common.UI { /// /// Serves as a base Application class for both the UI and Server apps. /// - public abstract class BaseApplication : Application + public abstract class BaseApplication : Application, INotifyPropertyChanged, ISingleInstanceApp { private IKernel Kernel { get; set; } protected abstract IKernel InstantiateKernel(); protected abstract Window InstantiateMainWindow(); + public event PropertyChangedEventHandler PropertyChanged; + + public void OnPropertyChanged(String info) + { + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs(info)); + } + } + protected override void OnStartup(StartupEventArgs e) { // Without this the app will shutdown after the splash screen closes @@ -43,7 +56,10 @@ namespace MediaBrowser.Common.UI splash.Close(); ShutdownMode = System.Windows.ShutdownMode.OnLastWindowClose; - InstantiateMainWindow().ShowDialog(); + + OnKernelLoaded(); + + InstantiateMainWindow().Show(); } catch (Exception ex) { @@ -60,11 +76,51 @@ namespace MediaBrowser.Common.UI } } + protected virtual void OnKernelLoaded() + { + + } + protected override void OnExit(ExitEventArgs e) { base.OnExit(e); Kernel.Dispose(); } + + public bool SignalExternalCommandLineArgs(IList args) + { + OnSecondInstanceLaunched(args); + + return true; + } + + protected virtual void OnSecondInstanceLaunched(IList args) + { + if (this.MainWindow.WindowState == WindowState.Minimized) + { + this.MainWindow.WindowState = WindowState.Maximized; + } + } + + public static void RunApplication(string uniqueKey) + where TApplicationType : BaseApplication, IApplication, new() + { + if (SingleInstance.InitializeAsFirstInstance(uniqueKey)) + { + var application = new TApplicationType(); + application.InitializeComponent(); + + application.Run(); + + // Allow single instance code to perform cleanup operations + SingleInstance.Cleanup(); + } + } + } + + public interface IApplication + { + void InitializeComponent(); } } diff --git a/MediaBrowser.ServerApplication/App.xaml.cs b/MediaBrowser.ServerApplication/App.xaml.cs index 5f1b8d0e06..3f0401e8f3 100644 --- a/MediaBrowser.ServerApplication/App.xaml.cs +++ b/MediaBrowser.ServerApplication/App.xaml.cs @@ -1,44 +1,32 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Windows; -using MediaBrowser.Common.Kernel; +using MediaBrowser.Common.Kernel; using MediaBrowser.Common.UI; using MediaBrowser.Controller; using Microsoft.Shell; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Windows; namespace MediaBrowser.ServerApplication { /// /// Interaction logic for App.xaml /// - public partial class App : BaseApplication, ISingleInstanceApp + public partial class App : BaseApplication, IApplication { - private const string Unique = "MediaBrowser3"; - [STAThread] public static void Main() { - if (SingleInstance.InitializeAsFirstInstance(Unique)) - { - var application = new App(); - application.InitializeComponent(); - - application.Run(); - - // Allow single instance code to perform cleanup operations - SingleInstance.Cleanup(); - } + RunApplication("MediaBrowserServer"); } - #region ISingleInstanceApp Members - public bool SignalExternalCommandLineArgs(IList args) + protected override void OnSecondInstanceLaunched(IList args) { - OpenDashboard(); + base.OnSecondInstanceLaunched(args); - return true; + OpenDashboard(); + InitializeComponent(); } - #endregion public static void OpenDashboard() {