diff options
18 files changed, 221 insertions, 169 deletions
diff --git a/main/src/addins/AspNet/MonoDevelop.AspNet/ChangeLog b/main/src/addins/AspNet/MonoDevelop.AspNet/ChangeLog index 9f5f00ea53..1dc9089a0e 100644 --- a/main/src/addins/AspNet/MonoDevelop.AspNet/ChangeLog +++ b/main/src/addins/AspNet/MonoDevelop.AspNet/ChangeLog @@ -1,3 +1,23 @@ +2010-05-19 Michael Hutchinson <mhutchinson@novell.com> + + * MonoDevelop.AspNet.Parser/DocumentReferenceManager.cs: Make + prefix generation and directive insertion APIs more + flexible. + + * MonoDevelop.AspNet.Parser/PageInfo.cs: Make it possible to + inject directives to an existing info. + + * Makefile.am: + * MonoDevelop.AspNet.csproj: + * MonoDevelop.AspNet.Parser/PageDirectiveVisitor.cs: Removed + unneeded class. + + * MonoDevelop.AspNet/AspNetToolboxNode.cs: Use new + ItextToolboxItem and DocumentReferenceManager APIs to insert + new directives into the DOM only when the item is actually + inserted into the editor. Fixes Bug 543721 - Auto-added + control directives sometimes fail. + 2010-05-18 Michael Hutchinson <mhutchinson@novell.com> * MonoDevelop.AspNet.Parser/PageInfo.cs: diff --git a/main/src/addins/AspNet/MonoDevelop.AspNet/Makefile.am b/main/src/addins/AspNet/MonoDevelop.AspNet/Makefile.am index 38c61075a0..68d8fcf355 100644 --- a/main/src/addins/AspNet/MonoDevelop.AspNet/Makefile.am +++ b/main/src/addins/AspNet/MonoDevelop.AspNet/Makefile.am @@ -85,7 +85,6 @@ FILES = \ MonoDevelop.AspNet.Parser/DocumentReferenceManager.cs \ MonoDevelop.AspNet.Parser/LocatedParserException.cs \ MonoDevelop.AspNet.Parser/MemberListVisitor.cs \ - MonoDevelop.AspNet.Parser/PageDirectiveVisitor.cs \ MonoDevelop.AspNet.Parser/PageInfo.cs \ MonoDevelop.AspNet.Parser/Regexes.cs \ MonoDevelop.AspNet.Parser/SuggestedHandlerCompletionData.cs \ diff --git a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/DocumentReferenceManager.cs b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/DocumentReferenceManager.cs index 9c8cd0ee3c..88228196f2 100644 --- a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/DocumentReferenceManager.cs +++ b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/DocumentReferenceManager.cs @@ -195,7 +195,7 @@ namespace MonoDevelop.AspNet.Parser return string.Empty; foreach (var rd in RegisteredTags) { - AssemblyRegisterDirective ard = rd as AssemblyRegisterDirective; + var ard = rd as AssemblyRegisterDirective; if (ard != null && ard.Namespace == control.Namespace) return ard.TagPrefix; } @@ -209,15 +209,13 @@ namespace MonoDevelop.AspNet.Parser return RegisteredTags.Where (t => string.Equals (t.TagPrefix, prefix, StringComparison.OrdinalIgnoreCase)); } - #region "Refactoring" operations -- things that modify the file - - public string AddAssemblyReferenceToDocument (IType control, string assemblyName) - { - return AddAssemblyReferenceToDocument (control, assemblyName, null); - } - - public string AddAssemblyReferenceToDocument (IType control, string assemblyName, string desiredPrefix) + /// <summary> + /// Gets a tag prefix, also returning the directive that would have to be added if necessary. + /// </summary> + public string GetTagPrefixWithNewDirective (IType control, string assemblyName, string desiredPrefix, + out RegisterDirective directiveNeededToAdd) { + directiveNeededToAdd = null; string existingPrefix = GetTagPrefix (control); if (existingPrefix != null) return existingPrefix; @@ -229,15 +227,13 @@ namespace MonoDevelop.AspNet.Parser var an = MonoDevelop.Core.Assemblies.SystemAssemblyService.ParseAssemblyName (assemblyName); - string directive = string.Format ("{0}<%@ Register TagPrefix=\"{1}\" Namespace=\"{2}\" Assembly=\"{3}\" %>", - Environment.NewLine, prefix, control.Namespace, an.Name); - - //inset a directive into the document - InsertDirective (directive); + directiveNeededToAdd = new AssemblyRegisterDirective (prefix, control.Namespace, an.Name); return prefix; } + #region "Refactoring" operations -- things that modify the file + public void AddAssemblyReferenceToProject (string assemblyName, string assemblyLocation) { //build an reference to the assembly @@ -317,25 +313,53 @@ namespace MonoDevelop.AspNet.Parser return p != null? p.Value as string : null; } - void InsertDirective (string directive) + public void AddRegisterDirective (RegisterDirective directive, TextEditor editor, bool preserveCaretPosition) { - DirectiveNode node = GetPageDirective (); + var node = GetRegisterInsertionPointNode (); if (node == null) return; - var textFile = MonoDevelop.DesignerSupport.OpenDocumentFileProvider.Instance.GetEditableTextFile (Doc.FileName); - if (textFile == null) - textFile = new TextFile (Doc.FileName); + Doc.Info.RegisteredTags.Add (directive); + + var line = Math.Max (node.Location.EndLine, node.Location.BeginLine); + var pos = editor.GetPositionFromLineColumn (line, editor.GetLineLength (line) + 1); + if (pos < 0) + return; + + editor.BeginAtomicUndo (); + var oldCaret = editor.CursorPosition; - int pos = textFile.GetPositionFromLineColumn (node.Location.EndLine, node.Location.EndColumn); - textFile.InsertText (pos, directive); + var inserted = editor.InsertText (pos, editor.NewLine + directive.ToString ()); + if (preserveCaretPosition) { + editor.CursorPosition = (pos < oldCaret)? oldCaret + inserted : oldCaret; + } + editor.EndAtomicUndo (); } - DirectiveNode GetPageDirective () + DirectiveNode GetRegisterInsertionPointNode () { - var v = new PageDirectiveVisitor (); + var v = new RegisterDirectiveInsertionPointVisitor (); Doc.RootNode.AcceptVisit (v); - return v.DirectiveNode; + return v.Node; + } + + class RegisterDirectiveInsertionPointVisitor: Visitor + { + public DirectiveNode Node { get; private set; } + + public override void Visit (DirectiveNode node) + { + switch (node.Name.ToLowerInvariant ()) { + case "page": case "control": case "master": case "register": + Node = node; + return; + } + } + + public override void Visit (TagNode node) + { + QuickExit = true; + } } #endregion diff --git a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/PageDirectiveVisitor.cs b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/PageDirectiveVisitor.cs deleted file mode 100644 index 558132d4db..0000000000 --- a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/PageDirectiveVisitor.cs +++ /dev/null @@ -1,65 +0,0 @@ -// -// PageDirectiveVisitor.cs -// -// Author: -// Michael Hutchinson <mhutchinson@novell.com> -// -// Copyright (C) 2008 Novell, Inc (http://www.novell.com) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -using System; -using MonoDevelop.AspNet.Parser.Dom; - -namespace MonoDevelop.AspNet.Parser -{ - - - public class PageDirectiveVisitor : Visitor - { - DirectiveNode node; - - public DirectiveNode DirectiveNode { - get { return node; } - } - - public override void Visit (DirectiveNode node) - { - switch (node.Name.ToLowerInvariant ()) { - case "page": - case "control": - case "webservice": - case "webhandler": - case "application": - case "master": - this.node = node; - QuickExit = true; - return; - } - } - - public override void Visit (TagNode node) - { - //as soon as tags are declared, doctypes and the page directive must been set - QuickExit = true; - } - } -} diff --git a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/PageInfo.cs b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/PageInfo.cs index c818dc5b55..65bbc20735 100644 --- a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/PageInfo.cs +++ b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/PageInfo.cs @@ -55,10 +55,10 @@ namespace MonoDevelop.AspNet.Parser public string MasterPageTypeName { get; private set; } public string MasterPageTypeVPath { get; private set; } public WebSubtype Subtype { get; private set; } - public IEnumerable<RegisterDirective> RegisteredTags { get { return registeredTags; } } - public IEnumerable<string> Imports { get { return imports; } } - public IEnumerable<string> Implements { get { return imports; } } - public IEnumerable<AssemblyDirective> Assemblies { get { return assemblies; } } + public IList<RegisterDirective> RegisteredTags { get { return registeredTags; } } + public IList<string> Imports { get { return imports; } } + public IList<string> Implements { get { return imports; } } + public IList<AssemblyDirective> Assemblies { get { return assemblies; } } public IEnumerable<Error> Populate (RootNode node, List<Error> errors) { @@ -189,7 +189,10 @@ namespace MonoDevelop.AspNet.Parser public abstract class RegisterDirective { - private DirectiveNode node; + public RegisterDirective (string tagPrefix) + { + this.TagPrefix = tagPrefix; + } public RegisterDirective (DirectiveNode node) { @@ -213,6 +216,12 @@ namespace MonoDevelop.AspNet.Parser public class AssemblyRegisterDirective : RegisterDirective { + public AssemblyRegisterDirective (string tagPrefix, string @namespace, string assembly) : base (tagPrefix) + { + this.Namespace = @namespace; + this.Assembly = assembly; + } + public AssemblyRegisterDirective (DirectiveNode node) : base (node) { @@ -225,7 +234,7 @@ namespace MonoDevelop.AspNet.Parser public override string ToString () { - return String.Format ("<%@ Register {0}=\"{1}\" {2}=\"{3}\" {4}=\"{5}\" %>", "TagPrefix", TagPrefix, "Namespace", Namespace, "Assembly", Assembly); + return String.Format ("<%@ Register TagPrefix=\"{0}\" Namespace=\"{1}\" Assembly=\"{2}\" %>", TagPrefix, Namespace, Assembly); } public override bool IsValid () @@ -237,7 +246,13 @@ namespace MonoDevelop.AspNet.Parser } public class ControlRegisterDirective : RegisterDirective - { + { + public ControlRegisterDirective (string tagPrefix, string tagName, string src) : base (tagPrefix) + { + this.TagName = tagName; + this.Src = src; + } + public ControlRegisterDirective (DirectiveNode node) : base (node) { diff --git a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.csproj b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.csproj index 07f94bbd7c..ee69241726 100644 --- a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.csproj +++ b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.csproj @@ -270,7 +270,6 @@ <Compile Include="MonoDevelop.AspNet\AspNetToolboxNode.cs" /> <Compile Include="MonoDevelop.AspNet\AspNetParserService.cs" /> <Compile Include="MonoDevelop.AspNet\AspNetToolboxProvider.cs" /> - <Compile Include="MonoDevelop.AspNet.Parser\PageDirectiveVisitor.cs" /> <Compile Include="MonoDevelop.AspNet.StateEngine\AspNetExpressionState.cs" /> <Compile Include="MonoDevelop.AspNet.StateEngine\AspNetDom.cs" /> <Compile Include="MonoDevelop.AspNet.StateEngine\AspNetDirectiveState.cs" /> diff --git a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet/AspNetToolboxNode.cs b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet/AspNetToolboxNode.cs index 6ab3d739c2..7d4503887b 100644 --- a/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet/AspNetToolboxNode.cs +++ b/main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet/AspNetToolboxNode.cs @@ -91,56 +91,66 @@ namespace MonoDevelop.AspNet void RegisterReference (MonoDevelop.Projects.Project project) { - MonoDevelop.Projects.DotNetProject dnp = (MonoDevelop.Projects.DotNetProject) project; - MonoDevelop.Projects.ProjectReference pr = base.Type.GetProjectReference (); + var dnp = (MonoDevelop.Projects.DotNetProject) project; + var pr = base.Type.GetProjectReference (); //add the reference if it doesn't match an existing one bool match = false; - foreach (MonoDevelop.Projects.ProjectReference p in dnp.References) + foreach (var p in dnp.References) if (p.Equals (pr)) match = true; if (!match) dnp.References.Add (pr); } - - public string GetTextForFile (string path, MonoDevelop.Projects.Project project) + + public void InsertAtCaret (MonoDevelop.Ide.Gui.Document document) + { + var tag = GetTextWithDirective (document, true); + document.TextEditor.InsertText (document.TextEditor.CursorPosition, tag); + } + + string GetTextWithDirective (MonoDevelop.Ide.Gui.Document document, bool insertDirective) { string tag = Text; - if (!tag.Contains ("{0}")) + if (!tag.Contains ("{0}")) return tag; if (base.Type.AssemblyName.StartsWith ("System.Web.UI.WebControls")) return string.Format (tag, "asp"); //register the assembly and look up the class - RegisterReference (project); + //FIXME: only do this on the insert, not the preview - or remove it afterwards + RegisterReference (document.Project); - var database = MonoDevelop.Projects.Dom.Parser.ProjectDomService.GetProjectDom (project); + var database = MonoDevelop.Projects.Dom.Parser.ProjectDomService.GetProjectDom (document.Project); var cls = database.GetType (Type.TypeName); if (cls == null) return tag; - //look up the control prefix - string mime = DesktopService.GetMimeTypeForUri (path); - var doc = MonoDevelop.Projects.Dom.Parser.ProjectDomService.Parse (project, path, mime) - as MonoDevelop.AspNet.Parser.AspNetParsedDocument; - + var doc = document.ParsedDocument as MonoDevelop.AspNet.Parser.AspNetParsedDocument; if (doc == null) return tag; var assemName = SystemAssemblyService.ParseAssemblyName (Type.AssemblyName); var refMan = new DocumentReferenceManager () { - Project = project as AspNetAppProject, + Project = document.Project as AspNetAppProject, Doc = doc, }; - string prefix = refMan.AddAssemblyReferenceToDocument (cls, assemName.Name); + RegisterDirective directive; + string prefix = refMan.GetTagPrefixWithNewDirective (cls, assemName.Name, null, out directive); + + if (prefix == null) + return tag; + + tag = string.Format (tag, prefix); + + if (directive != null && insertDirective) + refMan.AddRegisterDirective (directive, document.TextEditor, true); - if (prefix != null) - return string.Format (tag, prefix); return tag; } @@ -149,11 +159,20 @@ namespace MonoDevelop.AspNet get { return aspNetDomain; } } - public bool IsCompatibleWith (string fileName, Project project)
+ public bool IsCompatibleWith (MonoDevelop.Ide.Gui.Document document)
{ + switch (AspNetAppProject.DetermineWebSubtype (document.FileName)) { + case WebSubtype.WebForm: + case WebSubtype.MasterPage: + case WebSubtype.WebControl: + break; + default: + return false; + } + var clrVersion = ClrVersion.Net_2_0; - var aspProj = project as AspNetAppProject; - if (project != null && aspProj.TargetFramework.ClrVersion != ClrVersion.Default) + var aspProj = document.Project as AspNetAppProject; + if (aspProj != null && aspProj.TargetFramework.ClrVersion != ClrVersion.Default) clrVersion = aspProj.TargetFramework.ClrVersion; foreach (var tbfa in ItemFilters) { @@ -178,11 +197,12 @@ namespace MonoDevelop.AspNet if (tbfa.FilterType == ToolboxItemFilterType.Prevent && filterVersion == clrVersion) return false; } -
- if (fileName.EndsWith (".aspx") || fileName.EndsWith (".ascx") || fileName.EndsWith (".master")) - return true; - else - return false;
+ return true; + } + + public string GetDragPreview (MonoDevelop.Ide.Gui.Document document) + { + return GetTextWithDirective (document, false); } } } diff --git a/main/src/addins/MonoDevelop.DesignerSupport/ChangeLog b/main/src/addins/MonoDevelop.DesignerSupport/ChangeLog index 7b6ed1699e..ae263c9cca 100644 --- a/main/src/addins/MonoDevelop.DesignerSupport/ChangeLog +++ b/main/src/addins/MonoDevelop.DesignerSupport/ChangeLog @@ -1,3 +1,11 @@ +2010-05-19 Michael Hutchinson <mhutchinson@novell.com> + + * MonoDevelop.DesignerSupport.Toolbox/TextToolboxNode.cs: + * MonoDevelop.DesignerSupport.Toolbox/ITextToolboxNode.cs: + * MonoDevelop.DesignerSupport.Toolbox/TemplateToolboxNode.cs: + Give text toolbox nodes more control over how they insert + text into the document. + 2010-05-11 Michael Hutchinson <mhutchinson@novell.com> * Makefile.am: diff --git a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ITextToolboxNode.cs b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ITextToolboxNode.cs index 5539ecccc6..5f5f6ca1e6 100644 --- a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ITextToolboxNode.cs +++ b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ITextToolboxNode.cs @@ -27,15 +27,14 @@ // using System; +using MonoDevelop.Ide.Gui; namespace MonoDevelop.DesignerSupport.Toolbox { - - public interface ITextToolboxNode { - string GetTextForFile (string fileName, MonoDevelop.Projects.Project project); - - bool IsCompatibleWith (string fileName, MonoDevelop.Projects.Project project); + string GetDragPreview (Document document); + bool IsCompatibleWith (Document document); + void InsertAtCaret (Document document); } } diff --git a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TemplateToolboxNode.cs b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TemplateToolboxNode.cs index f500496706..749316b976 100644 --- a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TemplateToolboxNode.cs +++ b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TemplateToolboxNode.cs @@ -28,15 +28,28 @@ using System; using System.ComponentModel; using MonoDevelop.Core; using MonoDevelop.Ide.CodeTemplates; +using MonoDevelop.Ide.Gui; namespace MonoDevelop.DesignerSupport.Toolbox { [Serializable] - public class TemplateToolboxNode : ItemToolboxNode + public class TemplateToolboxNode : ItemToolboxNode, ITextToolboxNode { - public CodeTemplate Template { - get; - set; + public CodeTemplate Template { get; set; } + + public string GetDragPreview (Document document) + { + return Template.Shortcut; + } + + public bool IsCompatibleWith (Document document) + { + return true; + } + + public void InsertAtCaret (Document document) + { + Template.Insert (document); } public TemplateToolboxNode (CodeTemplate template) diff --git a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TextToolboxNode.cs b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TextToolboxNode.cs index dc63ab8eec..ddcbf51b4a 100644 --- a/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TextToolboxNode.cs +++ b/main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TextToolboxNode.cs @@ -31,6 +31,7 @@ using System;
using System.ComponentModel;
using MonoDevelop.Core;
+using MonoDevelop.Ide.Gui;
namespace MonoDevelop.DesignerSupport.Toolbox { @@ -72,19 +73,24 @@ namespace MonoDevelop.DesignerSupport.Toolbox set { text = value; } }
- public virtual string GetTextForFile (string path, MonoDevelop.Projects.Project project)
- {
- return text;
- }
-
[Browsable(false)]
public override string ItemDomain { get { return domain; } } - public bool IsCompatibleWith (string fileName, MonoDevelop.Projects.Project project)
+ public bool IsCompatibleWith (Document document)
{
return true;
- } + }
+
+ public string GetDragPreview (Document document)
+ {
+ return text;
+ }
+
+ public void InsertAtCaret (Document document)
+ {
+ document.TextEditor.InsertText (document.TextEditor.CursorPosition, text);
+ }
} } diff --git a/main/src/addins/MonoDevelop.SourceEditor2/ChangeLog b/main/src/addins/MonoDevelop.SourceEditor2/ChangeLog index 34ce19eaf2..569a648e0a 100644 --- a/main/src/addins/MonoDevelop.SourceEditor2/ChangeLog +++ b/main/src/addins/MonoDevelop.SourceEditor2/ChangeLog @@ -1,3 +1,11 @@ +2010-05-19 Michael Hutchinson <mhutchinson@novell.com> + + * MonoDevelop.SourceEditor/ExtensibleTextEditor.cs: Track code + template API. + + * MonoDevelop.SourceEditor/SourceEditorView.cs: Track code + template API and toolbox API. + 2010-05-18 Mike Krüger <mkrueger@novell.com> * MonoDevelop.SourceEditor/DropDownBox.cs: diff --git a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs index 677354af61..80178275be 100644 --- a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs +++ b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs @@ -636,10 +636,10 @@ namespace MonoDevelop.SourceEditor } } - public void InsertTemplate (CodeTemplate template, MonoDevelop.Ide.Gui.Document document) + internal void InsertTemplate (CodeTemplate template, MonoDevelop.Ide.Gui.Document document) { Document.BeginAtomicUndo (); - CodeTemplate.TemplateResult result = template.InsertTemplate (document); + var result = template.InsertTemplateContents (document); TextLinkEditMode tle = new TextLinkEditMode (this, result.InsertPosition, result.TextLinks); diff --git a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorView.cs b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorView.cs index 39d1f7f3a4..d96d26588f 100644 --- a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorView.cs +++ b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorView.cs @@ -55,7 +55,7 @@ namespace MonoDevelop.SourceEditor public class SourceEditorView : AbstractViewContent, IExtensibleTextEditor, IBookmarkBuffer, IClipboardHandler, ICompletionWidget, ISplittable, IFoldable, IToolboxDynamicProvider, IEncodedTextContent, ICustomFilteringToolboxConsumer, IZoomable, ITextEditorResolver, Mono.TextEditor.ITextEditorDataProvider, - ICodeTemplateWidget, ITemplateWidget, ISupportsProjectReload, IPrintable + ICodeTemplateHandler, ICodeTemplateContextProvider, ISupportsProjectReload, IPrintable { SourceEditorWidget widget; bool isDisposed = false; @@ -1564,16 +1564,11 @@ namespace MonoDevelop.SourceEditor void IToolboxConsumer.ConsumeItem (ItemToolboxNode item) { - if (item is TemplateToolboxNode) { - InsertTemplate (((TemplateToolboxNode)item).Template, new MonoDevelop.Ide.Gui.Document (base.WorkbenchWindow)); + var tn = item as ITextToolboxNode; + if (tn != null) { + tn.InsertAtCaret (base.WorkbenchWindow.Document); TextEditor.GrabFocus (); - return; } - string text = GetText (item); - if (string.IsNullOrEmpty (text)) - return; - TextEditor.InsertAtCaret (text); - TextEditor.GrabFocus (); } #region dnd @@ -1581,7 +1576,8 @@ namespace MonoDevelop.SourceEditor ItemToolboxNode dragItem; void IToolboxConsumer.DragItem (ItemToolboxNode item, Gtk.Widget source, Gdk.DragContext ctx) { - string text = GetText (item); + //FIXME: use the preview text + string text = GetDragPreviewText (item); if (string.IsNullOrEmpty (text)) return; dragItem = item; @@ -1609,19 +1605,14 @@ namespace MonoDevelop.SourceEditor } #endregion - string GetText (ItemToolboxNode item) + string GetDragPreviewText (ItemToolboxNode item) { - TemplateToolboxNode templateToolboxNode = item as TemplateToolboxNode; - if (templateToolboxNode != null) - return templateToolboxNode.Template.Shortcut; - ITextToolboxNode tn = item as ITextToolboxNode; if (tn == null) { LoggingService.LogWarning ("Cannot use non-ITextToolboxNode toolbox items in the text editor."); return null; } - string filename = this.IsUntitled ? UntitledName : ContentName; - return tn.GetTextForFile (filename, this.Project); + return tn.GetDragPreview (base.WorkbenchWindow.Document); } System.ComponentModel.ToolboxItemFilterAttribute[] IToolboxConsumer.ToolboxFilterAttributes { @@ -1640,7 +1631,7 @@ namespace MonoDevelop.SourceEditor //int i = filename.LastIndexOf ('.'); //string ext = i < 0? null : filename.Substring (i + 1); - return textNode.IsCompatibleWith (filename, this.Project); + return textNode.IsCompatibleWith (base.WorkbenchWindow.Document); } diff --git a/main/src/core/MonoDevelop.Ide/ChangeLog b/main/src/core/MonoDevelop.Ide/ChangeLog index 8483cc6bd5..ab5419efcf 100644 --- a/main/src/core/MonoDevelop.Ide/ChangeLog +++ b/main/src/core/MonoDevelop.Ide/ChangeLog @@ -1,3 +1,10 @@ +2010-05-19 Michael Hutchinson <mhutchinson@novell.com> + + * MonoDevelop.Ide.CodeTemplates/CodeTemplate.cs: + * MonoDevelop.Ide.CodeTemplates/CodeTemplateCompletionData.cs: + * MonoDevelop.Ide.Gui.Content/CompletionTextEditorExtension.cs: + Make code template insertion API less confusing. + 2010-05-19 Lluis Sanchez Gual <lluis@novell.com> * MonoDevelop.Ide.Gui.Components/TransactedTreeBuilder.cs: In diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplate.cs index d2ec677110..306472251a 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplate.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplate.cs @@ -52,7 +52,7 @@ namespace MonoDevelop.Ide.CodeTemplates InExpression } - public interface ITemplateWidget + public interface ICodeTemplateContextProvider { CodeTemplateContext GetCodeTemplateContext (); } @@ -354,7 +354,20 @@ namespace MonoDevelop.Ide.CodeTemplates return result.ToString (); } - public TemplateResult InsertTemplate (MonoDevelop.Ide.Gui.Document document) + public void Insert (MonoDevelop.Ide.Gui.Document document) + { + var handler = document.GetContent<ICodeTemplateHandler> (); + if (handler != null) { + handler.InsertTemplate (this, document); + } else { + InsertTemplateContents (document); + } + } + + /// <summary> + /// Don't use this unless you're implementing ICodeTemplateWidget. Use Insert instead. + /// </summary> + public TemplateResult InsertTemplateContents (MonoDevelop.Ide.Gui.Document document) { ProjectDom dom = document.Dom; ParsedDocument doc = document.ParsedDocument ?? MonoDevelop.Projects.Dom.Parser.ProjectDomService.GetParsedDocument (dom, document.FileName); diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateCompletionData.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateCompletionData.cs index 315057bc64..bb6721d0c1 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateCompletionData.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateCompletionData.cs @@ -32,7 +32,7 @@ using MonoDevelop.Core; namespace MonoDevelop.Ide.CodeTemplates { - public interface ICodeTemplateWidget + public interface ICodeTemplateHandler { void InsertTemplate (CodeTemplate template, Document document); } @@ -54,12 +54,7 @@ namespace MonoDevelop.Ide.CodeTemplates public override void InsertCompletionText (CompletionListWindow window) { - if (window.CompletionWidget is ICodeTemplateWidget) { - ((ICodeTemplateWidget)window.CompletionWidget).InsertTemplate (template, doc); - } else { - template.InsertTemplate (doc); - } + template.Insert (doc); } - } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Content/CompletionTextEditorExtension.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Content/CompletionTextEditorExtension.cs index 63335765c1..0d36a9a86e 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Content/CompletionTextEditorExtension.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Content/CompletionTextEditorExtension.cs @@ -337,7 +337,7 @@ namespace MonoDevelop.Ide.Gui.Content { CompletionDataList list = new CompletionDataList (); list.CompletionSelectionMode = CompletionSelectionMode.OwnTextField; - ITemplateWidget templateWidget = Document.GetContent<ITemplateWidget> (); + var templateWidget = Document.GetContent<ICodeTemplateContextProvider> (); CodeTemplateContext ctx = CodeTemplateContext.Standard; if (templateWidget != null) ctx = templateWidget.GetCodeTemplateContext (); |