101 lines
3.1 KiB
C#
101 lines
3.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
|
|
namespace DevComponents.DotNetBar
|
|
{
|
|
public class MultiFormAppContext : ApplicationContext
|
|
{
|
|
private List<WeakReference> _OpenedForms = new List<WeakReference>();
|
|
|
|
public MultiFormAppContext(Form initialForm)
|
|
{
|
|
// Handle the ApplicationExit event to know when the application is exiting.
|
|
Application.ApplicationExit += new EventHandler(this.OnApplicationExit);
|
|
WeakReference reference=new WeakReference(initialForm);
|
|
_OpenedForms.Add(reference);
|
|
initialForm.FormClosed += FormClosed;
|
|
initialForm.Show();
|
|
}
|
|
|
|
public void RegisterOpenForm(Form form)
|
|
{
|
|
bool opened = false;
|
|
foreach (WeakReference item in _OpenedForms)
|
|
{
|
|
object target = item.Target;
|
|
|
|
if (target != null && target.Equals(form))
|
|
{
|
|
opened = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!opened)
|
|
{
|
|
WeakReference reference = new WeakReference(form);
|
|
_OpenedForms.Add(reference);
|
|
form.FormClosed += FormClosed;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Returns read-only list of opened forms.
|
|
/// </summary>
|
|
public List<Form> OpenedForms
|
|
{
|
|
get
|
|
{
|
|
List<Form> list=new List<Form>();
|
|
foreach (WeakReference item in _OpenedForms)
|
|
{
|
|
object target = item.Target;
|
|
if (target != null && target is Form)
|
|
{
|
|
list.Add((Form)target);
|
|
}
|
|
}
|
|
|
|
return list;
|
|
}
|
|
}
|
|
|
|
private void FormClosed(object sender, FormClosedEventArgs e)
|
|
{
|
|
Form form = (Form) sender;
|
|
form.FormClosed -= FormClosed;
|
|
foreach (WeakReference item in _OpenedForms)
|
|
{
|
|
object target = item.Target;
|
|
|
|
if (target != null && target.Equals(form))
|
|
{
|
|
_OpenedForms.Remove(item);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(_OpenedForms.Count==0)
|
|
ExitThread();
|
|
}
|
|
|
|
protected virtual void OnApplicationExit(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private static MultiFormAppContext _CurrentMultiFormAppContext=null;
|
|
/// <summary>
|
|
/// Gets or sets current MultiFormAppContext context. If you are using MultiFormAppContext to start your app then you should also
|
|
/// set that instance of MultiFormAppContext to this property so internally TabFormControl can register any new deattached forms
|
|
/// and prevent application from closing if startup form is closed first.
|
|
/// </summary>
|
|
public static MultiFormAppContext Current
|
|
{
|
|
get { return _CurrentMultiFormAppContext; }
|
|
set { _CurrentMultiFormAppContext = value; }
|
|
}
|
|
}
|
|
}
|