using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using ICSharpCode.Core;
namespace Mesnac.Gui.Workbench
{
using Mesnac.Core.Service;
using Mesnac.PlugIn.Workbench;
///
/// 工作区单例类
///
public static class WorkbenchSingleton
{
private static STAThreadCaller caller;
private static DefaultWorkbench workbench = null;
private static WorkbenchLayout layout = null;
///
/// 工作台初始化完毕事件
///
public static event EventHandler InitFinished;
static WorkbenchSingleton()
{
PropertyService.PropertyChanged += new PropertyChangedEventHandler(PropertyService_PropertyChanged);
ResourceService.LanguageChanged += delegate { workbench.RedrawAllComponents(); };
}
///
/// 初始化工作台
///
public static void InitializeWorkbench()
{
workbench = new DefaultWorkbench();
caller = new STAThreadCaller(workbench);
//创建布局对象,并设置工作台的布局
layout = new WorkbenchLayout(workbench);
workbench.WorkbenchLayout = layout;
//调用工作台的初始化工作空间方法
workbench.InitializeWorkspace();
//触发初始化完毕事件
if (InitFinished != null)
{
InitFinished(null, EventArgs.Empty);
}
}
///
/// 属性变化事件
///
///
///
static void PropertyService_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.OldValue != e.NewValue && workbench != null)
{
if (e.Key == "cultureName")
{
workbench.UpdateRenderer();
}
}
}
#region 线程安全调用器
#region 线程安全调用器类
///
/// 线程安全调用器类
///
private class STAThreadCaller
{
///
/// 定义平台委托类
///
/// 目标对象
/// 方法名称
/// 参数数组
///
delegate object PerformClassDelegate(object target, string methodName, object[] arguments);
private Control ctl;
private PerformClassDelegate performClassDelegate;
#if DEBUG
private string callerStack;
#endif
public STAThreadCaller(Control ctl)
{
this.ctl = ctl;
this.performClassDelegate = new PerformClassDelegate(this.DoPerformCall);
}
public object Call(Delegate method, object[] arguments)
{
if (method == null)
{
throw new ArgumentNullException("空方法");
}
return this.ctl.Invoke(method, arguments);
}
public object Call(object target, string methodName, object[] arguments)
{
if (target == null)
{
throw new ArgumentNullException("空对象");
}
#if DEBUG
this.callerStack = Environment.StackTrace;
#endif
return this.ctl.Invoke(this.performClassDelegate, new object[] { target, methodName, arguments });
}
public void BeginCall(Delegate method, object[] arguments)
{
if (method == null)
{
throw new ArgumentNullException("空方法");
}
#if DEBUG
this.callerStack = Environment.StackTrace;
#endif
this.ctl.BeginInvoke(method, arguments);
}
public void BeginCall(object target, string methodName, object[] arguments)
{
if (target == null)
{
throw new ArgumentNullException("空对象");
}
#if DEBUG
this.callerStack = Environment.StackTrace;
#endif
this.ctl.BeginInvoke(this.performClassDelegate, new object[] { target, methodName, arguments });
}
private object DoPerformCall(object target, string methodName, object[] arguments)
{
MethodInfo methodInfo = null;
if (target is Type)
{
methodInfo = ((Type)target).GetMethod(methodName, BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
}
else
{
methodInfo = target.GetType().GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
}
if (methodInfo == null)
{
throw new System.ArgumentException("未找到该方法:" + methodName);
}
else
{
try
{
if (target is Type)
{
return methodInfo.Invoke(null, arguments);
}
else
{
return methodInfo.Invoke(target, arguments);
}
}
catch (Exception ex)
{
if (ex is TargetInvocationException && ex.InnerException != null)
{
ex = ex.InnerException;
}
MesnacServiceManager.Instance.MessageService.ShowException(ex, "发生异常。");
#if DEBUG
MesnacServiceManager.Instance.LoggingService.Info("线程堆栈跟踪:\n" + this.callerStack);
#endif
}
return null;
}
}
}
#endregion
///
/// 调用方在对控件进行方法调用时,是否必须调用Invoke方法
///
public static bool InvokeRequired
{
get { return (workbench as Form).InvokeRequired; }
}
///
/// 产生一个线程安全的GUI调用
/// 方法会等待操作结果返回。
///
///
///
///
///
public static object SafeThreadCall(object target, string methodName, params object[] arguments)
{
return caller.Call(target, methodName, arguments);
}
///
/// 产生一个线程安全的GUI调用
/// 方法会等待操作结果返回。
///
///
///
///
public static object SafeThreadCall(Delegate method, params object[] arguments)
{
return caller.Call(method, arguments);
}
///
/// 产生一个线程安全的异步GUI调用
///
///
///
///
public static void SafeThreadAsyncCall(object target, string methodName, params object[] arguments)
{
caller.BeginCall(target, methodName, arguments);
}
///
/// 产生一个线程安全的异步GUI调用
///
///
///
public static void SafeThreadAsyncCall(Delegate method, params object[] arguments)
{
caller.BeginCall(method, arguments);
}
#endregion
///
/// 主窗体
///
public static Form MainForm
{
get { return workbench as Form; }
}
///
/// 工作台
///
public static IWorkbench Workbench
{
get { return workbench; }
}
}
}