Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorMichael Hutchinson <mhutchinson@novell.com>2010-05-19 08:36:41 +0400
committerMichael Hutchinson <mhutchinson@novell.com>2010-05-19 08:36:41 +0400
commit6e7cdc6cf102c98bd724c06a175374f1a34a73b2 (patch)
treed1f01667e18fcf837b5e2b29e993f7823210b37c /main
parent963efbcd4c40d52b1659f41358a4a72d35e4c533 (diff)
* src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplate.cs:
* src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateCompletionData.cs: * src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Content/CompletionTextEditorExtension.cs: Make code template insertion API less confusing. * src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs: Track code template API. * src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorView.cs: Track code template API and toolbox API. * src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TextToolboxNode.cs: * src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ITextToolboxNode.cs: * src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TemplateToolboxNode.cs: Give text toolbox nodes more control over how they insert text into the document. * src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/DocumentReferenceManager.cs: Make prefix generation and directive insertion APIs more flexible. * src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/PageInfo.cs: Make it possible to inject directives to an existing info. * src/addins/AspNet/MonoDevelop.AspNet/Makefile.am: * src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.csproj: * src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/PageDirectiveVisitor.cs: Removed unneeded class. * src/addins/AspNet/MonoDevelop.AspNet/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. svn path=/trunk/monodevelop/; revision=157524
Diffstat (limited to 'main')
-rw-r--r--main/src/addins/AspNet/MonoDevelop.AspNet/ChangeLog20
-rw-r--r--main/src/addins/AspNet/MonoDevelop.AspNet/Makefile.am1
-rw-r--r--main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/DocumentReferenceManager.cs72
-rw-r--r--main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/PageDirectiveVisitor.cs65
-rw-r--r--main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.Parser/PageInfo.cs29
-rw-r--r--main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet.csproj1
-rw-r--r--main/src/addins/AspNet/MonoDevelop.AspNet/MonoDevelop.AspNet/AspNetToolboxNode.cs70
-rw-r--r--main/src/addins/MonoDevelop.DesignerSupport/ChangeLog8
-rw-r--r--main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/ITextToolboxNode.cs9
-rw-r--r--main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TemplateToolboxNode.cs21
-rw-r--r--main/src/addins/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.Toolbox/TextToolboxNode.cs20
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/ChangeLog8
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs4
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorView.cs27
-rw-r--r--main/src/core/MonoDevelop.Ide/ChangeLog7
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplate.cs17
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateCompletionData.cs9
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Content/CompletionTextEditorExtension.cs2
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 ();