pascalabcnet/VisualPascalABCNET/SSYY/DesignerMain.cs

182 lines
6.4 KiB
C#
Raw Normal View History

2015-05-14 22:35:07 +03:00
using System;
using System.Drawing.Design;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Windows.Forms.Design;
using System.Reflection;
using System.CodeDom;
using System.Collections;
using SampleDesignerHost;
using System.IO;
using VisualPascalABC;
namespace SampleDesignerApplication
{
public class CodeStrings
{
public string PascalABCCode;
public string XMLCode;
public void Reset()
{
PascalABCCode = null;
XMLCode = null;
}
}
public class DesignerMain : Component
{
public SampleDesignerHost.SampleDesignerHost host;
public SampleDesignerLoader loader;
private ServiceContainer hostingServiceContainer;
private ServiceRequests serviceRequests;
//private Form1 pabcform;
private PropertyGrid propertyGrid;
private ToolBoxPane toolbox;
private Panel panelMain;
private KeystrokeMessageFilter filter;
public CodeStrings generatedCode;
public DesignerMain(PropertyGrid props, ToolBoxPane t, Panel p)
{
propertyGrid = props;
toolbox = t;
panelMain = p;
hostingServiceContainer = new ServiceContainer();
generatedCode = new CodeStrings();
hostingServiceContainer.AddService(typeof(CodeStrings), generatedCode);
hostingServiceContainer.AddService(typeof(PropertyGrid), propertyGrid);
hostingServiceContainer.AddService(typeof(ToolBoxPane), toolbox);
}
/// This method is called whenever we create a new designer or
/// load one from existing XML.
private void CreateDesigner(SampleDesignerLoader loader)
{
// Our loader will handle loading the file (or creating a blank one).
host = new SampleDesignerHost.SampleDesignerHost(hostingServiceContainer);
// The limited events tab functionality we have requires a special kind of
// property grid site.
//
propertyGrid.Site = new PropertyGridSite(host as IServiceProvider, this);
propertyGrid.PropertyTabs.AddTabType(typeof(EventsTab));
host.LoadDocument(loader);
this.loader = loader;
// The toolbox needs access to the IToolboxService and the designers.
toolbox.Host = host;
// Initialize our document window.
host.View.Dock = DockStyle.Fill;
host.View.Visible = true;
panelMain.Controls.Add(host.View);
// These are normally unavailable if we've got no host created.
// Otherwise we gets lots of null reference exceptions.
//
//tabControl.Visible = true;
//menuItemSave.Enabled = true;
//menuItemSaveAs.Enabled = true;
//menuItemEdit.Enabled = true;
//menuItemView.Enabled = true;
//menuItemLayout.Enabled = true;
//menuItemDebug.Enabled = true;
// This IMessageFilter is used to intercept and decipher keyboard presses
// that might be instructions for our designer. We have to do it this way
// since we can't have our designer raise KeyPress events.
//
filter = new KeystrokeMessageFilter(host);
Application.AddMessageFilter(filter);
}
/// This is called to destroy our designer (when we load a new one for example).
/// It returns true if our environment has been cleared, false if not (if someone
/// cancels a dispose when prompted to save changes).
private bool DestroyDesigner()
{
if (loader != null)
{
if (loader.PromptDispose())
{
// Again, bad things happen if there's no host loaded and
// certain buttons are pressed in our TabControl or MainMenu.
//
//tabControl.Visible = false;
//menuItemSave.Enabled = false;
//menuItemSaveAs.Enabled = false;
//menuItemEdit.Enabled = false;
//menuItemView.Enabled = false;
//menuItemLayout.Enabled = false;
//menuItemDebug.Enabled = false;
// Get rid of our document window.
panelMain.Controls.Clear();
// No need to filter for designer-intended keyboard strokes now.
Application.RemoveMessageFilter(filter);
filter = null;
// Get rid of that property grid site so it doesn't ask for
// any more services from our soon-to-be-disposed host.
//
propertyGrid.Site = null;
host.Dispose();
loader = null;
host = null;
return true;
}
return false;
}
return true;
}
public void CreateNew()
{
if (DestroyDesigner()) // make sure we're clear for a new designer
{
// A loader created with no parameters creates a blank document.
SampleDesignerLoader designerLoader = new SampleDesignerLoader();
CreateDesigner(designerLoader);
}
}
public void CreateFromXML(string file_name)
{
if (DestroyDesigner()) // make sure we're clear for a new designer
{
SampleDesignerLoader designerLoader = new SampleDesignerLoader(file_name);
CreateDesigner(designerLoader);
designerLoader.dirty = false;
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (host != null)
{
host.Dispose();
}
}
base.Dispose(disposing);
}
public void ExecuteCommand(CommandID id)
{
IServiceContainer sc = host as IServiceContainer;
IMenuCommandService mcs = sc.GetService(typeof(IMenuCommandService)) as IMenuCommandService;
mcs.GlobalInvoke(id);
}
}
}