using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Drawing;
using System.Drawing.Design;
using System.Data;
using System.Windows.Forms;
using System.IO;
using Loader;
namespace Host
{
public enum LoaderType
{
BasicDesignerLoader = 1,
CodeDomDesignerLoader = 2,
NoLoader = 3
}
public enum GraphType
{
Curve=16,
Meter=18,
Report=23
}
///
/// Manages numerous HostSurfaces. Any services added to HostSurfaceManager
/// will be accessible to all HostSurfaces
///
public class HostSurfaceManager : DesignSurfaceManager
{
//public BasicHostLoader basicHostLoader = null;
public MesnacHostLoader basicHostLoader = null;
public HostSurfaceManager() : base()
{
this.AddService(typeof(INameCreationService), new NameCreationService());
this.ActiveDesignSurfaceChanged += new ActiveDesignSurfaceChangedEventHandler(HostSurfaceManager_ActiveDesignSurfaceChanged);
}
protected override DesignSurface CreateDesignSurfaceCore(IServiceProvider parentProvider)
{
return new HostSurface(parentProvider);
}
///
/// Gets a new HostSurface and loads it with the appropriate type of
/// root component.
///
private HostControl GetNewHost(Type rootComponentType)
{
HostSurface hostSurface = (HostSurface)this.CreateDesignSurface(this.ServiceContainer);
hostSurface.UseSnapLines();
if (rootComponentType == typeof(Form))
hostSurface.BeginLoad(typeof(Form));
else if (rootComponentType == typeof(UserControl))
hostSurface.BeginLoad(typeof(UserControl));
else if (rootComponentType == typeof(Component))
hostSurface.BeginLoad(typeof(Component));
else
throw new Exception("Undefined Host Type: " + rootComponentType.ToString());
hostSurface.Initialize();
this.ActiveDesignSurface = hostSurface;
return new HostControl(hostSurface);
}
///
/// Gets a new HostSurface and loads it with the appropriate type of
/// root component. Uses the appropriate Loader to load the HostSurface.
///
public HostControl GetNewHost(Type rootComponentType, LoaderType loaderType)
{
if (loaderType == LoaderType.NoLoader)
return GetNewHost(rootComponentType);
HostSurface hostSurface = (HostSurface)this.CreateDesignSurface(this.ServiceContainer);
hostSurface.UseSnapLines();
IDesignerHost host = (IDesignerHost)hostSurface.GetService(typeof(IDesignerHost));
switch (loaderType)
{
case LoaderType.BasicDesignerLoader :
//BasicHostLoader basicHostLoader = new BasicHostLoader(rootComponentType);
MesnacHostLoader basicHostLoader = new MesnacHostLoader(rootComponentType);
hostSurface.BeginLoad(basicHostLoader);
hostSurface.Loader = basicHostLoader;
break;
case LoaderType.CodeDomDesignerLoader:
CodeDomHostLoader codeDomHostLoader = new CodeDomHostLoader();
hostSurface.BeginLoad(codeDomHostLoader);
hostSurface.Loader = codeDomHostLoader;
break;
default:
throw new Exception("Loader is not defined: " + loaderType.ToString());
}
hostSurface.Initialize();
return new HostControl(hostSurface);
}
public HostControl GetNewHost(Type rootComponentType, LoaderType loaderType, string rootName)
{
if (loaderType == LoaderType.NoLoader)
return GetNewHost(rootComponentType);
HostSurface hostSurface = (HostSurface)this.CreateDesignSurface(this.ServiceContainer);
hostSurface.UseSnapLines();
IDesignerHost host = (IDesignerHost)hostSurface.GetService(typeof(IDesignerHost));
switch (loaderType)
{
case LoaderType.BasicDesignerLoader:
//BasicHostLoader basicHostLoader = new BasicHostLoader(rootComponentType);
MesnacHostLoader basicHostLoader = new MesnacHostLoader(rootComponentType, rootName);
hostSurface.BeginLoad(basicHostLoader);
hostSurface.Loader = basicHostLoader;
break;
case LoaderType.CodeDomDesignerLoader:
CodeDomHostLoader codeDomHostLoader = new CodeDomHostLoader();
hostSurface.BeginLoad(codeDomHostLoader);
hostSurface.Loader = codeDomHostLoader;
break;
default:
throw new Exception("Loader is not defined: " + loaderType.ToString());
}
hostSurface.Initialize();
return new HostControl(hostSurface);
}
///
/// Opens an Xml file and loads it up using BasicHostLoader (inherits from
/// BasicDesignerLoader)
///
public HostControl GetNewHost(string fileName)
{
if (fileName == null || !File.Exists(fileName))
MessageBox.Show("文件名不正确: " + fileName);
LoaderType loaderType = LoaderType.NoLoader;
if (fileName.EndsWith("xml"))
loaderType = LoaderType.BasicDesignerLoader;
if (loaderType == LoaderType.NoLoader || loaderType == LoaderType.CodeDomDesignerLoader)
{
throw new Exception("File cannot be opened. Please check the type or extension of the file. Supported format is Xml");
}
HostSurface hostSurface = (HostSurface)this.CreateDesignSurface(this.ServiceContainer);
hostSurface.UseSnapLines();
IDesignerHost host = (IDesignerHost)hostSurface.GetService(typeof(IDesignerHost));
//basicHostLoader = new BasicHostLoader(fileName,false);
basicHostLoader = new MesnacHostLoader(fileName, false);
hostSurface.BeginLoad(basicHostLoader);
hostSurface.Loader = basicHostLoader;
hostSurface.Initialize();
return new HostControl(hostSurface);
}
//运行环境载入项目文件时调用的函数
public HostControl LoadNewHost(string fileName)
{
if (fileName == null || !File.Exists(fileName))
MessageBox.Show("文件名不正确: " + fileName);
LoaderType loaderType = LoaderType.NoLoader;
if (fileName.EndsWith("xml"))
loaderType = LoaderType.BasicDesignerLoader;
if (loaderType == LoaderType.NoLoader || loaderType == LoaderType.CodeDomDesignerLoader)
{
throw new Exception("文件打不开,请确认后缀名是xml!");
}
HostSurface hostSurface = (HostSurface)this.CreateDesignSurface(this.ServiceContainer);
hostSurface.UseSnapLines();
IDesignerHost host = (IDesignerHost)hostSurface.GetService(typeof(IDesignerHost));
//basicHostLoader = new BasicHostLoader(fileName, true);
basicHostLoader = new MesnacHostLoader(fileName, true);
hostSurface.BeginLoad(basicHostLoader);
hostSurface.Loader = basicHostLoader;
hostSurface.Initialize();
return new HostControl(hostSurface);
}
public void AddService(Type type, object serviceInstance)
{
if (this.ServiceContainer.GetService(type) != null)
{
this.ServiceContainer.RemoveService(type);
}
this.ServiceContainer.AddService(type, serviceInstance);
}
///
/// Uses the OutputWindow service and writes out to it.
///
void HostSurfaceManager_ActiveDesignSurfaceChanged(object sender, ActiveDesignSurfaceChangedEventArgs e)
{
//ToolWindows.OutputWindow o = this.GetService(typeof(ToolWindows.OutputWindow)) as ToolWindows.OutputWindow;
//o.RichTextBox.Text += "New host added.\n";
}
}// class
}// namespace