From b32b9beb143450867148a5d85165438751553607 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 16 Aug 2005 20:07:45 +0000 Subject: [PATCH] Fixed forms designer to reparse the file when switching to the designer tab. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@375 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../FormDesigner/Project/FormDesigner.csproj | 1 + .../CSharpDesignerGenerator.cs | 23 ++++++--- .../DesignerGenerator/IDesignerGenerator.cs | 1 + .../VBNetDesignerGenerator.cs | 23 ++++++--- .../DesignerGenerator/XmlDesignerGenerator.cs | 5 ++ .../DesignerLoader/DesignerLoaderProvider.cs | 51 +++++++++++++++++++ .../NRefactoryDesignerLoader.cs | 21 +++----- .../FormDesignerSecondaryDisplayBinding.cs | 12 +++-- .../FormDesigner/FormDesignerViewContent.cs | 44 +++++++++------- .../Src/FormDesigner/FormKeyHandler.cs | 5 +- .../Services/DesignerResourceService.cs | 4 +- 11 files changed, 137 insertions(+), 53 deletions(-) create mode 100644 src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/DesignerLoaderProvider.cs diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj b/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj index e0f269631d..2ea666f6d6 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj @@ -106,6 +106,7 @@ Always + diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs index 485fc8f3ad..883ae82d17 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs @@ -62,6 +62,15 @@ namespace ICSharpCode.FormDesigner componentChangeService.ComponentRemoving += new ComponentEventHandler(ComponentRemoved); } + public void Detach() + { + IComponentChangeService componentChangeService = (IComponentChangeService)viewContent.DesignSurface.GetService(typeof(IComponentChangeService)); + componentChangeService.ComponentAdded -= new ComponentEventHandler(ComponentAdded); + componentChangeService.ComponentRename -= new ComponentRenameEventHandler(ComponentRenamed); + componentChangeService.ComponentRemoving -= new ComponentEventHandler(ComponentRemoved); + this.viewContent = null; + } + void ComponentRemoved(object sender, ComponentEventArgs e) { try { @@ -86,7 +95,7 @@ namespace ICSharpCode.FormDesigner } int endOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine)); viewContent.Document.Insert(endOffset, "\t\tprivate " + e.Component.GetType() + " " + e.Component.Site.Name + ";" + Environment.NewLine); - } catch (Exception ex) { + } catch (Exception ex) { MessageService.ShowError(ex); } } @@ -139,12 +148,12 @@ namespace ICSharpCode.FormDesigner { foreach (IMethod method in c.Methods) { if ((method.Name == "InitializeComponents" || method.Name == "InitializeComponent") && method.Parameters.Count == 0) { - return method; + return method; } } return null; } - + protected static string GenerateParams(EventDescriptor edesc, bool paramNames) { System.Type type = edesc.EventType; @@ -164,8 +173,8 @@ namespace ICSharpCode.FormDesigner } param += typeStr; if (paramNames == true) { - param += " "; - param += pInfo.Name; + param += " "; + param += pInfo.Name; } if (i + 1 < mInfo.GetParameters().Length) { param += ", "; @@ -205,8 +214,8 @@ namespace ICSharpCode.FormDesigner string param = GenerateParams(edesc, true); string text = "void " + eventMethodName + "(" + param + ")\n" + - "{\n" + body + - "\n}\n\n"; + "{\n" + body + + "\n}\n\n"; viewContent.Document.Insert(offset, text); viewContent.Document.FormattingStrategy.IndentLines(viewContent.TextEditorControl.ActiveTextAreaControl.TextArea, c.Region.EndLine - 1, c.Region.EndLine + 3); diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs index d85414d263..dbee98df63 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs @@ -48,6 +48,7 @@ namespace ICSharpCode.FormDesigner public interface IDesignerGenerator { void Attach(FormDesignerViewContent viewContent); + void Detach(); void MergeFormChanges(); bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out int position); ICollection GetCompatibleMethods(EventDescriptor edesc); diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/VBNetDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/VBNetDesignerGenerator.cs index 1773698e7b..8060a61f93 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/VBNetDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/VBNetDesignerGenerator.cs @@ -62,6 +62,15 @@ namespace ICSharpCode.FormDesigner componentChangeService.ComponentRemoving += new ComponentEventHandler(ComponentRemoved); } + public void Detach() + { + IComponentChangeService componentChangeService = (IComponentChangeService)viewContent.DesignSurface.GetService(typeof(IComponentChangeService)); + componentChangeService.ComponentAdded -= new ComponentEventHandler(ComponentAdded); + componentChangeService.ComponentRename -= new ComponentRenameEventHandler(ComponentRenamed); + componentChangeService.ComponentRemoving -= new ComponentEventHandler(ComponentRemoved); + this.viewContent = null; + } + void ComponentRemoved(object sender, ComponentEventArgs e) { try { @@ -86,7 +95,7 @@ namespace ICSharpCode.FormDesigner } int endOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine)); viewContent.Document.Insert(endOffset, "\tPrivate " + e.Component.Site.Name + " As " + e.Component.GetType() + Environment.NewLine); - } catch (Exception ex) { + } catch (Exception ex) { MessageService.ShowError(ex); } } @@ -138,12 +147,12 @@ namespace ICSharpCode.FormDesigner { foreach (IMethod method in c.Methods) { if ((method.Name == "InitializeComponents" || method.Name == "InitializeComponent") && method.Parameters.Count == 0) { - return method; + return method; } } return null; } - + protected static string GenerateParams(EventDescriptor edesc, bool paramNames) { System.Type type = edesc.EventType; @@ -163,8 +172,8 @@ namespace ICSharpCode.FormDesigner } param += typeStr; if (paramNames == true) { - param += " "; - param += pInfo.Name; + param += " "; + param += pInfo.Name; } if (i + 1 < mInfo.GetParameters().Length) { param += ", "; @@ -204,8 +213,8 @@ namespace ICSharpCode.FormDesigner string param = GenerateParams(edesc, true); string text = "Sub " + eventMethodName + "(" + param + ")\n" + - body + - "\nEnd Sub\n\n"; + body + + "\nEnd Sub\n\n"; viewContent.Document.Insert(offset, text); viewContent.Document.FormattingStrategy.IndentLines(viewContent.TextEditorControl.ActiveTextAreaControl.TextArea, c.Region.EndLine - 1, c.Region.EndLine + 3); diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/XmlDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/XmlDesignerGenerator.cs index e21b7e503b..ec3bca7eba 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/XmlDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/XmlDesignerGenerator.cs @@ -28,6 +28,11 @@ namespace ICSharpCode.FormDesigner this.viewContent = viewContent; } + public void Detach() + { + this.viewContent = null; + } + public void MergeFormChanges() { StringWriter writer = new StringWriter(); diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/DesignerLoaderProvider.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/DesignerLoaderProvider.cs new file mode 100644 index 0000000000..99f49e7bf9 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/DesignerLoaderProvider.cs @@ -0,0 +1,51 @@ +/* + * Created by SharpDevelop. + * User: Daniel Grunwald + * Date: 16.08.2005 + * Time: 21:40 + */ + +using System; +using System.ComponentModel.Design.Serialization; +using ICSharpCode.TextEditor; +using ICSharpCode.NRefactory.Parser; + +namespace ICSharpCode.FormDesigner +{ + public interface IDesignerLoaderProvider + { + DesignerLoader CreateLoader(); + } + + public class NRefactoryDesignerLoaderProvider : IDesignerLoaderProvider + { + SupportedLanguages language; + TextEditorControl textEditorControl; + + public NRefactoryDesignerLoaderProvider(SupportedLanguages language, TextEditorControl textEditorControl) + { + this.language = language; + this.textEditorControl = textEditorControl; + } + + public DesignerLoader CreateLoader() + { + return new NRefactoryDesignerLoader(language, textEditorControl); + } + } + + public class XmlDesignerLoaderProvider : IDesignerLoaderProvider + { + TextEditorControl textEditorControl; + + public XmlDesignerLoaderProvider(TextEditorControl textEditorControl) + { + this.textEditorControl = textEditorControl; + } + + public DesignerLoader CreateLoader() + { + return new XmlDesignerLoader(textEditorControl); + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs index 8246c5d7b7..9bab71a17b 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs @@ -47,9 +47,6 @@ namespace ICSharpCode.FormDesigner SupportedLanguages language; CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider(); - protected Hashtable resources = null; - bool isReloadNeeded = false; - TextEditorControl textEditorControl; public string TextContent { @@ -84,7 +81,7 @@ namespace ICSharpCode.FormDesigner protected override bool IsReloadNeeded() { - return isReloadNeeded | base.IsReloadNeeded(); + return base.IsReloadNeeded() || TextContent != lastTextContent; } public NRefactoryDesignerLoader(SupportedLanguages language, TextEditorControl textEditorControl) @@ -106,11 +103,14 @@ namespace ICSharpCode.FormDesigner base.OnEndLoad(successful, errors); } + string lastTextContent; + protected override CodeCompileUnit Parse() { LoggingService.Debug("NRefactoryDesignerLoader.Parse()"); - isReloadNeeded = false; - ICSharpCode.NRefactory.Parser.IParser p = ICSharpCode.NRefactory.Parser.ParserFactory.CreateParser(language, new StringReader(TextContent)); + + lastTextContent = TextContent; + ICSharpCode.NRefactory.Parser.IParser p = ICSharpCode.NRefactory.Parser.ParserFactory.CreateParser(language, new StringReader(lastTextContent)); p.Parse(); // Try to fix the type names to fully qualified ones @@ -125,6 +125,7 @@ namespace ICSharpCode.FormDesigner // outputGenerator.GenerateCodeFromMember(visitor.codeCompileUnit.Namespaces[0].Types[0], Console.Out, null); // provider.GenerateCodeFromCompileUnit(visitor.codeCompileUnit, Console.Out, null); + LoggingService.Debug("NRefactoryDesignerLoader.Parse() finished"); return visitor.codeCompileUnit; } @@ -185,6 +186,7 @@ namespace ICSharpCode.FormDesigner protected override void Write(CodeCompileUnit unit) { + LoggingService.Info("DesignerLoader.Write called"); provider.GenerateCodeFromCompileUnit(unit, Console.Out, null); } @@ -206,13 +208,6 @@ namespace ICSharpCode.FormDesigner public override void Dispose() { base.Dispose(); - if (this.resources != null) { - foreach (DesignerResourceService.ResourceStorage storage in this.resources.Values) { - storage.Dispose(); - } - resources.Clear(); - } - resources = null; } } } diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs index 782d0b1e1b..efd38f34cb 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs @@ -129,22 +129,24 @@ namespace ICSharpCode.FormDesigner if (!FormKeyHandler.inserted) { FormKeyHandler.Insert(); } - DesignerLoader loader = new NRefactoryDesignerLoader(SupportedLanguages.CSharp, ((ITextEditorControlProvider)viewContent).TextEditorControl); - IDesignerGenerator generator = new CSharpDesignerGenerator(); + IDesignerLoaderProvider loader; + IDesignerGenerator generator; switch (fileExtension) { case ".cs": - loader = new NRefactoryDesignerLoader(SupportedLanguages.CSharp, ((ITextEditorControlProvider)viewContent).TextEditorControl); + loader = new NRefactoryDesignerLoaderProvider(SupportedLanguages.CSharp, ((ITextEditorControlProvider)viewContent).TextEditorControl); generator = new CSharpDesignerGenerator(); break; case ".vb": - loader = new NRefactoryDesignerLoader(SupportedLanguages.VBNet, ((ITextEditorControlProvider)viewContent).TextEditorControl); + loader = new NRefactoryDesignerLoaderProvider(SupportedLanguages.VBNet, ((ITextEditorControlProvider)viewContent).TextEditorControl); generator = new VBNetDesignerGenerator(); break; case ".xfrm": - loader = new XmlDesignerLoader(((ITextEditorControlProvider)viewContent).TextEditorControl); + loader = new XmlDesignerLoaderProvider(((ITextEditorControlProvider)viewContent).TextEditorControl); generator = new XmlDesignerGenerator(); break; + default: + throw new ApplicationException("Cannot create content for " + fileExtension); } return new ISecondaryViewContent[] { new FormDesignerViewContent(viewContent, loader, generator) }; } diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs index 2fa26d054d..1b8e0e75e7 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs @@ -50,16 +50,16 @@ namespace ICSharpCode.FormDesigner protected bool failedDesignerInitialize; protected IViewContent viewContent; - protected Hashtable resources = null; + protected Hashtable resources = new Hashtable(); - protected ITextEditorControlProvider textAreaControlProvider; + protected ITextEditorControlProvider textAreaControlProvider; - protected string compilationErrors; + protected string compilationErrors; Panel p = new Panel(); DesignSurface designSurface; - DesignerLoader loader; + IDesignerLoaderProvider loader; IDesignerGenerator generator; public override Control Control { @@ -93,10 +93,12 @@ namespace ICSharpCode.FormDesigner public IDesignerHost Host { get { + if (designSurface == null) + return null; return (IDesignerHost)designSurface.GetService(typeof(IDesignerHost)); } } - public FormDesignerViewContent(IViewContent viewContent, DesignerLoader loader, IDesignerGenerator generator) + public FormDesignerViewContent(IViewContent viewContent, IDesignerLoaderProvider loader, IDesignerGenerator generator) { this.loader = loader; this.generator = generator; @@ -106,12 +108,8 @@ namespace ICSharpCode.FormDesigner this.textAreaControlProvider = viewContent as ITextEditorControlProvider; } - bool isInitialized = false; - - void Initialize() + void LoadDesigner() { - if (isInitialized) return; - isInitialized = true; LoggingService.Info("Form Designer: BEGIN INITIALIZE"); DefaultServiceContainer serviceContainer = new DefaultServiceContainer(); @@ -141,9 +139,9 @@ namespace ICSharpCode.FormDesigner designerResourceService.Host = Host; serviceContainer.AddService(typeof(IDesignerHost), Host); - designSurface.BeginLoad(loader); - loader.Flush(); - + DesignerLoader designerLoader = loader.CreateLoader(); + designSurface.BeginLoad(designerLoader); + designerLoader.Flush(); designSurface.Flush(); generator.Attach(this); @@ -154,6 +152,14 @@ namespace ICSharpCode.FormDesigner LoggingService.Info("Form Designer: END INITIALIZE"); } + void UnloadDesigner() + { + generator.Detach(); + p.Controls.Clear(); + designSurface.Dispose(); + designSurface = null; + } + PropertyContainer propertyContainer = new PropertyContainer(); public PropertyContainer PropertyContainer { @@ -175,11 +181,9 @@ namespace ICSharpCode.FormDesigner public void Reload() { - Initialize(); -// TODO: Reload code modifications -// loader.TextContent = Document.TextContent; - try { + LoadDesigner(); + if (designSurface != null && p.Controls.Count == 0) { Control designer = designSurface.View as Control; designer.Dock = DockStyle.Fill; @@ -196,7 +200,9 @@ namespace ICSharpCode.FormDesigner return; } bool isDirty = viewContent.IsDirty; + LoggingService.Info("Merging form changes..."); generator.MergeFormChanges(); + LoggingService.Info("Finished merging form changes"); viewContent.IsDirty = isDirty; } @@ -244,6 +250,7 @@ namespace ICSharpCode.FormDesigner public override void Deselected() { + LoggingService.Info("Deselected form designer, unloading..."); propertyContainer.Clear(); IsFormDesignerVisible = false; foreach(AxSideTab tab in ToolboxProvider.SideTabs) { @@ -257,7 +264,8 @@ namespace ICSharpCode.FormDesigner MergeFormChanges(); textAreaControlProvider.TextEditorControl.Refresh(); } -// DeselectAllComponents(); + UnloadDesigner(); + LoggingService.Info("Unloading form designer finished"); } public override void NotifyBeforeSave() diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormKeyHandler.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormKeyHandler.cs index 964ec66a9c..0f994c767b 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormKeyHandler.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormKeyHandler.cs @@ -130,7 +130,10 @@ namespace ICSharpCode.FormDesigner } if (keyPressed == Keys.Escape) { - formDesigner.HideTabOrder(); + if (formDesigner.IsTabOrderMode) + formDesigner.HideTabOrder(); + else + formDesigner.WorkbenchWindow.SwitchView(0); return true; } diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs index 0d800e7aa8..99ba05871b 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs @@ -126,7 +126,7 @@ namespace ICSharpCode.FormDesigner.Services } return resourceWriter; } catch (Exception e) { - System.Windows.Forms.MessageBox.Show(e.ToString()); + MessageService.ShowError(e); return null; } } @@ -150,7 +150,7 @@ namespace ICSharpCode.FormDesigner.Services } return resourceReader; } catch (Exception e) { - System.Windows.Forms.MessageBox.Show(e.ToString()); + MessageService.ShowError(e); return null; } }