using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
namespace UI
{
public class Application
{
private static Application instance;
private System.Windows.Application application;
private Thread thread;
public String Name;
public IApplicationCallbacks callbacks;
public List<Window> Windows = new List<Window>();
public ApplicationMenu Menu = new ApplicationMenu();
public MainToolBar ToolBar = new MainToolBar();
private Application() : base()
{
thread = new Thread(() => RunApplication());
thread.SetApartmentState(ApartmentState.STA);
}
public static Application GetInstance()
{
if (instance == null)
{
instance = new Application();
GC.KeepAlive(instance);
}
return instance;
}
public Thread Start()
{
thread.Start();
return thread;
}
private void RunApplication()
{
application = new System.Windows.Application();
if(callbacks != null)
{
callbacks.OnStartup();
}
application.Run();
if(callbacks != null)
{
callbacks.OnExit();
}
}
public void AddWindow(Window window)
{
Windows.Add(window);
}
public void RemoveWindow(Window window)
{
Windows.Remove(window);
if (Windows.Count == 0)
{
application.Shutdown();
}
}
}
public class ResultExec<T>
{
public T Result;
public Func<T> Func;
public void Exec()
{
Result = Func.Invoke();
}
}
public class VoidExec
{
public Action Action;
public void Exec()
{
Action.Invoke();
}
}
public interface IApplicationCallbacks
{
void OnStartup();
void OnOpen();
void OnExit();
}
}