@ -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
{
/// <summary>
/// Serves as a base Application class for both the UI and Server apps.
/// </summary>
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 < string > args )
{
OnSecondInstanceLaunched ( args ) ;
return true ;
}
protected virtual void OnSecondInstanceLaunched ( IList < string > args )
{
if ( this . MainWindow . WindowState = = WindowState . Minimized )
{
this . MainWindow . WindowState = WindowState . Maximized ;
}
}
public static void RunApplication < TApplicationType > ( string uniqueKey )
where TApplicationType : BaseApplication , IApplication , new ( )
{
if ( SingleInstance < TApplicationType > . InitializeAsFirstInstance ( uniqueKey ) )
{
var application = new TApplicationType ( ) ;
application . InitializeComponent ( ) ;
application . Run ( ) ;
// Allow single instance code to perform cleanup operations
SingleInstance < TApplicationType > . Cleanup ( ) ;
}
}
}
public interface IApplication
{
void InitializeComponent ( ) ;
}
}