Revision: 8435
Author:
v...@rsdn.ru
Date: Tue Nov 17 10:35:06 2009
Log: Working on Integration: Implementing Windows Form designer.
http://code.google.com/p/nemerle/source/detail?r=8435
Added:
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/CodeDom/FormChanges.n
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Helpers
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Helpers/NemerleProjectSourcesButchEditHelper.cs
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Helpers/NemerleSourceButchEditHelper.cs
Modified:
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Async/AsyncRequest/MergeCodeCompileUnitAsyncRequest.n
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/CodeDom/FormCodeDomGenerator.n
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/CodeDom/NemerleCodeParserBase.n
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Hints/HintHelper.n
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Compiler.Utils.csproj
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.MakeCompletionList.n
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/BackgroundWorks/Engine-MergeCodeCompileUnit.n
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/BackgroundWorks/Engine-UpdateCompileUnit.n
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/Engine.Properties.n
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Utils.n
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/ErrorHelper.cs
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Nemerle.VisualStudio.csproj
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleDependentFileNode.cs
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleEditorFactory.cs
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleFileNode.cs
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleFileNodeCodeDomProvider.cs
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleFileNodeProperties.cs
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleProjectNode.cs
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/ProjectInfo.cs
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Utils.cs
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/WPFProviders/NemerleEventBindingProvider.cs
/nemerle/trunk/ncc/parsing/AST.n
=======================================
--- /dev/null
+++
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/CodeDom/FormChanges.n
Tue Nov 17 10:35:06 2009
@@ -0,0 +1,20 @@
+using System;
+using System.CodeDom;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Nemerle.Collections;
+using Nemerle.Compiler.Parsetree;
+
+namespace Nemerle.Compiler.Utils
+{
+ [Record]
+ public class FormChanges
+ {
+ public NewInitializeComponentStatements : CodeStatementCollection {
get; private set; }
+ public InitializeComponent : ClassMember.Function {
get; private set; }
+ public InsertedFields : array[CodeMemberField] {
get; private set; }
+ public DelitedFields : array[ClassMember.Field] {
get; private set; }
+ }
+}
=======================================
--- /dev/null
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Helpers/NemerleProjectSourcesButchEditHelper.cs
Tue Nov 17 10:35:06 2009
@@ -0,0 +1,111 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Nemerle.VisualStudio.Project;
+using Nemerle.Compiler;
+using Microsoft.VisualStudio.Project;
+using Nemerle.Compiler.Parsetree;
+
+namespace Nemerle.VisualStudio.Helpers
+{
+ class NemerleProjectSourcesButchEditHelper : IDisposable
+ {
+ readonly ProjectInfo _projectInfo;
+ readonly Dictionary<int, NemerleSourceButchEditHelper> _fileIndexMap =
new Dictionary<int, NemerleSourceButchEditHelper>();
+ readonly string _description;
+ readonly string _ident = " ";
+
+ public NemerleProjectSourcesButchEditHelper(ProjectInfo projectInfo,
string description)
+ {
+ _projectInfo = projectInfo;
+ _description = description;
+ }
+
+ #region IDisposable Members
+
+ public void Dispose()
+ {
+ foreach (var item in _fileIndexMap.Values)
+ item.Dispose();
+ }
+
+ #endregion
+
+ NemerleSourceButchEditHelper GetHelper(int fileIndex)
+ {
+ NemerleSourceButchEditHelper helper;
+
+ if (!_fileIndexMap.TryGetValue(fileIndex, out helper))
+ {
+ var source = _projectInfo.GetEditableSource(fileIndex,
WindowFrameShowAction.DoNotShow);
+ helper = new NemerleSourceButchEditHelper(source, null, true,
_description);
+ _fileIndexMap.Add(fileIndex, helper);
+ }
+
+ return helper;
+ }
+
+ public void Add(Location loc, string text)
+ {
+ GetHelper(loc.FileIndex).Add(loc, text);
+ }
+
+ public void ApplyEdits()
+ {
+ foreach (var item in _fileIndexMap.Values)
+ item.ApplyEdits();
+ }
+
+ static bool IsAllCharsIsSpaces(string text)
+ {
+ for (int i = 0; i < text.Length; i++)
+ {
+ var ch = text[i];
+
+ if (ch != ' ' && ch != '\t')
+ return false;
+ }
+
+ return true;
+ }
+
+ //TODO: Добавить методы обновляющие содержимое тела метода, добавляющие
и удаляющие поля
+ static string ReplaceNonSpaceWithSpace(string text)
+ {
+ if (IsAllCharsIsSpaces(text))
+ return text;
+
+ var ary = text.ToCharArray();
+
+ for (int i = 0; i < ary.Length; i++)
+ {
+ var ch = ary[i];
+ if (ch != ' ' && ch != '\t')
+ ary[i] = ' ';
+ }
+
+ return new string(ary);
+ }
+
+ public void ReplaseMethodBody(ClassMember.Function function, string text)
+ {
+ var memLoc = function.Location;
+ var helper = GetHelper(memLoc.FileIndex);
+ var source = helper.Source;
+ var firstLine = source.GetLine(memLoc.Line);
+ var prefixSpaces = firstLine.Substring(0, memLoc.Column - 1);
+ var nl = Environment.NewLine;
+ prefixSpaces = ReplaceNonSpaceWithSpace(prefixSpaces);
+ var bodyPrefix = prefixSpaces + _ident;
+ const StringComparison op = StringComparison.Ordinal;
+ var text2 = text.StartsWith("\r", op) || text.StartsWith("\n", op)
+ ? text : nl + text;
+ var text3 = text2.TrimEnd('\r', '\n', ' ', '\t');
+ var text4 = text3.Replace("\n", "\n" + bodyPrefix);
+ var text5 = text4 + nl + prefixSpaces;
+
+ Add(function.BodyInnerLocation, text5);
+ }
+ }
+}
=======================================
--- /dev/null
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Helpers/NemerleSourceButchEditHelper.cs
Tue Nov 17 10:35:06 2009
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Microsoft.VisualStudio.Package;
+using Nemerle.VisualStudio.LanguageService;
+using Microsoft.VisualStudio.TextManager.Interop;
+using Nemerle.Compiler;
+using System.Diagnostics;
+
+namespace Nemerle.VisualStudio.Helpers
+{
+ class NemerleSourceButchEditHelper : EditArray
+ {
+ readonly int _fileIndex;
+
+ public NemerleSourceButchEditHelper(
+ NemerleSource source,
+ IVsTextView view,
+ bool merge,
+ string description) : base(source, view, merge, description)
+ {
+ _fileIndex = source.FileIndex;
+ }
+
+ public new NemerleSource Source
+ {
+ get { return (NemerleSource)base.Source; }
+ }
+
+ public void Add(Location loc, string text)
+ {
+ ErrorHelper.ThrowIfFalse(loc.FileIndex == _fileIndex, "loc.FileIndex");
+
+ base.Add(new EditSpan(loc.ToTextSpan(), text ?? ""));
+ }
+
+ public void Add(TextPoint point, string text)
+ {
+ base.Add(new EditSpan(point.ToTextSpan(), text ?? ""));
+ }
+
+ public void Add(TextPoint startPoint, TextPoint endPoint, string text)
+ {
+ base.Add(new EditSpan(Utils.ToTextSpan(startPoint, endPoint),
text ?? ""));
+ }
+ }
+}
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Async/AsyncRequest/MergeCodeCompileUnitAsyncRequest.n
Wed Nov 11 12:09:20 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Async/AsyncRequest/MergeCodeCompileUnitAsyncRequest.n
Tue Nov 17 10:35:06 2009
@@ -20,6 +20,6 @@
public CodeCompileUnit : CodeCompileUnit { get; private set; }
- public MergeInfo : array[Location * string] { get; internal set; }
+ public MergeInfo : FormChanges { get; internal set; }
}
}
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/CodeDom/FormCodeDomGenerator.n
Wed Nov 11 12:09:20 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/CodeDom/FormCodeDomGenerator.n
Tue Nov 17 10:35:06 2009
@@ -50,6 +50,15 @@
codeDomGenerator.GenerateStatements(statements);
writer.ToString()
}
+
+ public static ToString(field : CodeMemberField) : string
+ {
+ def codeDomGenerator = FormCodeDomGenerator();
+ def writer = StringWriter();
+ codeDomGenerator.Output = writer;
+ codeDomGenerator.GenerateField(field);
+ writer.ToString()
+ }
/*
mutable _output : TextWriter; // changed before immediate processing
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/CodeDom/NemerleCodeParserBase.n
Wed Nov 11 12:09:20 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/CodeDom/NemerleCodeParserBase.n
Tue Nov 17 10:35:06 2009
@@ -334,6 +334,9 @@
foreach (part is TopDeclaration.Class in typeBuilder.AstParts)
pracessPart(part);
+ classDecl.UserData["Name"] = cls.Name;
+ classDecl.UserData["Member"] = cls;
+
classDecl
}
=======================================
--- /nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Hints/HintHelper.n
Tue Nov 10 12:44:15 2009
+++ /nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Hints/HintHelper.n
Tue Nov 17 10:35:06 2009
@@ -106,7 +106,7 @@
def name = p.Name;
match (if (doc == null) null else doc.Params.Find((k, _) => k
== name))
{
- | Some((_, txt)) => $"<hint value='name'>$txt</hint>"
+ | Some((_, txt)) => $"<hint value='$name'>$txt</hint>"
| _ => name
}
}
@@ -309,7 +309,7 @@
def name = p.Name;
match (if (doc == null) null else doc.Params.Find((k, _) => k ==
name))
{
- | Some((_, txt)) => $"$(ext())<hint value='name'>$txt</hint>"
+ | Some((_, txt)) => $"$(ext())<hint value='$name'>$txt</hint>"
| _ => ext() + name
}
}
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Compiler.Utils.csproj
Wed Nov 11 12:09:20 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Compiler.Utils.csproj
Tue Nov 17 10:35:06 2009
@@ -310,6 +310,7 @@
<Compile
Include="Async\AsyncRequest\MergeCodeCompileUnitAsyncRequest.n" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="CodeDom\FormChanges.n" />
<Compile
Include="Nemerle.Completion2\Engine\BackgroundWorks\Engine-MergeCodeCompileUnit.n"
/>
</ItemGroup>
<Import Project="$(Nemerle)\Nemerle.MSBuild.targets" />
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.MakeCompletionList.n
Mon Sep 7 08:55:16 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/Project.MakeCompletionList.n
Tue Nov 17 10:35:06 2009
@@ -101,7 +101,8 @@
def add(keyword)
{ completionList.Add(CompletionElem(GlyphType.Snippet :> int,
keyword, "keyword", null)); }
-
_expressionKeywords.FilterLazy(_.StartsWithIgnoreCase(result.NamePrefix)).Iter(add);
+ foreach (kw in
_expressionKeywords.FilterLazy(_.StartsWithIgnoreCase(result.NamePrefix)))
+ add(kw);
}
//TODO: Поправить комплейшон для конструкторов.
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/BackgroundWorks/Engine-MergeCodeCompileUnit.n
Wed Nov 11 12:09:20 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/BackgroundWorks/Engine-MergeCodeCompileUnit.n
Tue Nov 17 10:35:06 2009
@@ -26,7 +26,7 @@
request
}
- public MergeCodeCompileUnit(codeCompileUnit : CodeCompileUnit) :
array[Location * string]
+ public MergeCodeCompileUnit(codeCompileUnit : CodeCompileUnit) :
FormChanges
{
def request = BeginMergeCodeCompileUnit(codeCompileUnit);
_ = request.AsyncWaitHandle.WaitOne();
@@ -85,16 +85,13 @@
}
}
- private MakeMargeInfoCodeCompileUnit(codeCompileUnit :
CodeCompileUnit) : array[Location * string]
- {
- def result = List();
- //def codeDomGenerator = FormCodeDomGenerator();
-
+ private MakeMargeInfoCodeCompileUnit(codeCompileUnit :
CodeCompileUnit) : FormChanges
+ {
assert(codeCompileUnit.Namespaces.Count >= 1);
def ns = codeCompileUnit.Namespaces[0];
assert(ns.Types.Count >= 1);
def ty = ns.Types[0];
- def cls = ty.UserData["Member"] :> ClassMember;
+ def cls = ty.UserData["Member"] :> TopDeclaration.Class;
//assert(cls != null);
def methods = ty.Members.OfType.[CodeMemberMethod]().ToArray();
@@ -102,18 +99,41 @@
def found = methods.Find(m => m.Name == "InitializeComponent"
&& m.ReturnType.BaseType == "System.Void"
&& m.ReturnType.TypeArguments.Count == 0
&& m.Parameters.Count == 0);
- match (found)
- {
- | Some(method) =>
- def sourseInitializeComponent = method.UserData["Member"] :>
ClassMember;
- def loc = sourseInitializeComponent.BodyInnerLocation;
- def text = FormCodeDomGenerator.ToString(method.Statements);
- result.Add((loc, text));
-
- | _ => assert(false);
+
+ def makeFormChanges(method, domCls, cls) : FormChanges
+ {
+ def domFields =
domCls.Members.OfType.[CodeMemberField]().ToArray();
+ def fields = cls.TypeBuilder.AstParts.SelectMany(
+ p => p.GetMembers().OfType.[ClassMember.Field]()).ToArray();
+
+ def isInserted(domFld : CodeMemberField) : bool
+ {
+ def fld = domFld.UserData["Member"] :> ClassMember.Field;
+ fld == null
+ }
+
+ def insertedFields = domFields.FilterToArray(isInserted);
+
+ //Trace.WriteLine("Inserted
fields:\n--------------------------------------");
+ //foreach (df in insertedFields)
+ // Trace.WriteLine(FormCodeDomGenerator.ToString(df));
+
+ def delitedFields = fields.Exclude(domFields, (df, f) => df.Name
== f.Name).ToArray();
+
+ //Trace.WriteLine("Delited
fields:\n--------------------------------------");
+ //foreach (f in delitedFields)
+ // Trace.WriteLine(f);
+
+ def sourseInitializeComponent = method.UserData["Member"] :>
ClassMember.Function;
+
+ FormChanges(method.Statements, sourseInitializeComponent,
insertedFields, delitedFields)
}
- result.ToArray()
+ match (found)
+ {
+ | Some(method) => makeFormChanges(method, ty, cls);
+ | _ => assert(false);
+ }
}
} // end class Engine
} // end of Nemerle.Completion2 namespace
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/BackgroundWorks/Engine-UpdateCompileUnit.n
Wed Oct 28 21:02:28 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/BackgroundWorks/Engine-UpdateCompileUnit.n
Tue Nov 17 10:35:06 2009
@@ -68,9 +68,11 @@
resetedMemberParsed = m;
assert2(resetedMember == null || resetedMember : object
== m.Builder);
resetedMember = m.Builder :> MethodBuilderEx;
- // Не делаем релокешон если локешон метода не меняется!
- def newLoc = Completion.Relocate(innerLoc, info);
resetedMember.ResetCodeCache();
+ // Не делаем релокешон если локешон метода не меняется!
+ def newLoc =
+ try { Completion.Relocate(innerLoc, info) }
+ catch { _ is Completion.RelocationFailedException =>
Location.Default };
AddMethodAtFirstCheckQueue(resetedMember); // Add
request for typing of relocated method body
newLoc != innerLoc
}
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/Engine.Properties.n
Mon Oct 26 02:38:15 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Nemerle.Completion2/Engine/Engine.Properties.n
Tue Nov 17 10:35:06 2009
@@ -55,7 +55,7 @@
[Accessor] static _expressionDefaultKeywords : array[CompletionElem];
static _expressionKeywords : array[string]
=
array["mutable", "typeof", "def", "array", "true", "false", "null", "throw",
- "#if", "#region"];
+ "#if", "#region", "match"];
#pragma warning disable 618 // Obsolete
public Project : Project
=======================================
--- /nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Utils.n Fri Nov 6
11:41:29 2009
+++ /nemerle/trunk/VsIntegration/Nemerle.Compiler.Utils/Utils.n Tue Nov 17
10:35:06 2009
@@ -682,5 +682,15 @@
| RefTo.None => ()
}
}
+
+ public Exclude[T1, T2](this seq1 : Seq[T1], seq2 : Seq[T2], cmp : T1 *
T2 -> bool) : SCG.IEnumerable[T1]
+ {
+ def res = SCG.List();
+
+ foreach (e when !seq2.Exists(cmp(e, _)) in seq1)
+ res.Add(e);
+
+ res
+ }
} // End of Utils module
} // End of namespace
=======================================
--- /nemerle/trunk/VsIntegration/Nemerle.VisualStudio/ErrorHelper.cs Mon
Oct 19 04:51:16 2009
+++ /nemerle/trunk/VsIntegration/Nemerle.VisualStudio/ErrorHelper.cs Tue
Nov 17 10:35:06 2009
@@ -72,6 +72,12 @@
{
ThrowIsNull(value, paramName, null);
}
+
+ public static void ThrowIfFalse(bool condition, string paramName)
+ {
+ if (!condition)
+ throw new ArgumentException(paramName);
+ }
/// <summary>
/// Throws ArgumentNullException when value is null.
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Nemerle.VisualStudio.csproj
Fri Oct 30 13:07:06 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Nemerle.VisualStudio.csproj
Tue Nov 17 10:35:06 2009
@@ -83,6 +83,9 @@
<Reference Include="PresentationFramework">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
+ <Reference Include="PresentationFramework.Aero">
+ <RequiredTargetFramework>3.0</RequiredTargetFramework>
+ </Reference>
<Reference Include="System.Configuration" />
<Reference Include="UIAutomationProvider">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
@@ -431,6 +434,8 @@
<ZipProject
Include="Templates\Projects\WPF\WPFApplication\Settings.settings" />
<ZipProject
Include="Templates\Projects\WPF\WPFApplication\Window1.xaml.n" />
<ZipProject
Include="Templates\Projects\WPF\WPFApplication\WPFApplication.nproj" />
+ <Compile Include="Helpers\NemerleProjectSourcesButchEditHelper.cs" />
+ <Compile Include="Helpers\NemerleSourceButchEditHelper.cs" />
<Compile Include="WPFProviders\NemerleEventBindingProvider.cs" />
<Compile Include="WPFProviders\NemerleRuntimeNameFactory.cs" />
<Compile Include="WPFProviders\NemerleRuntimeNameProvider.cs" />
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleDependentFileNode.cs
Tue Sep 30 02:12:26 2008
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleDependentFileNode.cs
Tue Nov 17 10:35:06 2009
@@ -3,6 +3,8 @@
using System.Text;
using Microsoft.VisualStudio.Project;
using Microsoft.VisualStudio.Shell;
+using Microsoft.Windows.Design.Host;
+using Nemerle.VisualStudio.WPFProviders;
namespace Nemerle.VisualStudio.Project
{
@@ -22,6 +24,9 @@
}
#endregion
+
+ public System.ComponentModel.Design.Serialization.IDesignerLoaderService
Designer
+ { get; internal set; }
// Called since the FileNode.ImageIndex returns -1 by default.
//
@@ -50,5 +55,48 @@
}
#endregion
+
+ #region Members
+
+ private DesignerContext _designerContext;
+
+ protected internal DesignerContext DesignerContext
+ {
+ get
+ {
+ if (_designerContext == null)
+ {
+ //Set the EventBindingProvider for this XAML file so the designer
will call it
+ //when event handlers need to be generated
+ _designerContext = new DesignerContext { EventBindingProvider = new
NemerleEventBindingProvider(this) };
+ }
+
+ return _designerContext;
+ }
+ }
+
+ internal OleServiceProvider.ServiceCreatorCallback ServiceCreator
+ {
+ get { return new
OleServiceProvider.ServiceCreatorCallback(this.CreateServices); }
+ }
+
+ private object CreateServices(Type serviceType)
+ {
+ object service = null;
+
+ if (typeof(EnvDTE.ProjectItem) == serviceType)
+ service = GetAutomationObject();
+ else if (typeof(DesignerContext) == serviceType)
+ service = this.DesignerContext;
+
+ return service;
+ }
+
+ #endregion
+
+ protected override NodeProperties CreatePropertiesObject()
+ {
+ return new NemerleFileNodeProperties(this);
+ }
}
}
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleEditorFactory.cs
Tue Nov 10 12:44:15 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleEditorFactory.cs
Tue Nov 17 10:35:06 2009
@@ -259,10 +259,10 @@
IntPtr CreateFormView(
IVsHierarchy hierarchy,
- uint itemid,
+ uint itemid,
IVsTextLines textLines,
ref string editorCaption,
- ref Guid cmdUI)
+ ref Guid cmdUI)
{
// Request the Designer Service.
//
@@ -276,12 +276,32 @@
bool loaderInitalized = false;
+ string name;
+ hierarchy.GetCanonicalName(itemid, out name);
+ var prj = ProjectInfo.FindProject(hierarchy);
+ var childName = System.IO.Path.ChangeExtension(name, ".Designer.n");
+ //var cur = (NemerleFileNode)prj.ProjectNode.FindChild(name);
+ var child =
(NemerleDependentFileNode)prj.ProjectNode.FindChild(childName);
+ if (child != null)
+ {
+ var designer =
(System.ComponentModel.Design.Serialization.IDesignerLoaderService)designerLoader;
+ child.Designer = designer;
+ }
+
+ //Nemerle.VisualStudio.LanguageService.Nemerle
+ //var langSrvs =
(Nemerle.VisualStudio.LanguageService.NemerleLanguageService)GetService(typeof(Nemerle.VisualStudio.LanguageService.NemerleLanguageService));
+ //var source = langSrvs.GetSource(textLines);
+
try
{
// Initialize designer loader.
- //
- designerLoader.Initialize(
- _serviceProvider.GetService(typeof(IOleServiceProvider)), hierarchy,
(int)itemid, textLines);
+ //Guid g = Guid.Empty;
+ //IntPtr hn;
+ //uint x;
+ //var hr = hierarchy. GetNestedHierarchy(itemid, ref g, out hn, out x);
+
+ var service = _serviceProvider.GetService(typeof(IOleServiceProvider));
+ designerLoader.Initialize(service, hierarchy, (int)itemid, textLines);
loaderInitalized = true;
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleFileNode.cs
Mon Aug 31 14:24:47 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleFileNode.cs
Tue Nov 17 10:35:06 2009
@@ -17,51 +17,51 @@
using Nemerle.VisualStudio.Package;
using IOleServiceProvider =
Microsoft.VisualStudio.OLE.Interop.IServiceProvider;
-using VsCommands =
Microsoft.VisualStudio.VSConstants.VSStd97CmdID;
-using VsMenus = Microsoft.VisualStudio.Shell.VsMenus;
+using VsCommands = Microsoft.VisualStudio.VSConstants.VSStd97CmdID;
+using VsMenus = Microsoft.VisualStudio.Shell.VsMenus;
using OleConstants = Microsoft.VisualStudio.OLE.Interop.Constants;
using VsCommands2K = Microsoft.VisualStudio.VSConstants.VSStd2KCmdID;
namespace Nemerle.VisualStudio.Project
{
- class NemerleFileNode : FileNode, IProjectSourceNode
+ class NemerleFileNode : FileNode, IProjectSourceNode
{
#region ctors
- internal NemerleFileNode(ProjectNode root, ProjectElement e)
- : this(root, e, false) { }
-
- /// <summary>
- /// Initializes a new instance of the <see
cref="NemerleFileNode"/> class.
- /// </summary>
- /// <param name="root">The root <see cref="NemerleProjectNode"/>
that contains this node.</param>
- /// <param name="element">The element that contains MSBuild
properties.</param>
- /// <param name="isNonMemberItem">Flag that indicates if the file
is not part of the project.</param>
-
[SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly",
MessageId = "NonMember")]
- public NemerleFileNode(ProjectNode root, ProjectElement element,
bool isNonMemberItem)
- : base(root, element)
- {
- IsNonMemberItem = isNonMemberItem;
-
- _selectionChangedListener =
- new SelectionElementValueChangedListener(
- new
ServiceProvider((IOleServiceProvider)root.GetService(typeof(IOleServiceProvider))),
root);
-
- _selectionChangedListener.Init();
-
- //((FileNodeProperties)NodeProperties).OnCustomToolChanged
+= OnCustomToolChanged;
-
//((FileNodeProperties)NodeProperties).OnCustomToolNameSpaceChanged +=
OnCustomToolNameSpaceChanged;
-
- // HasDesigner property is not virtual, so we have to set it
up in the ctor.
- InferHasDesignerFromSubType();
- }
+ internal NemerleFileNode(ProjectNode root, ProjectElement e)
+ : this(root, e, false) { }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="NemerleFileNode"/>
class.
+ /// </summary>
+ /// <param name="root">The root <see cref="NemerleProjectNode"/> that
contains this node.</param>
+ /// <param name="element">The element that contains MSBuild
properties.</param>
+ /// <param name="isNonMemberItem">Flag that indicates if the file is not
part of the project.</param>
+
[SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly",
MessageId = "NonMember")]
+ public NemerleFileNode(ProjectNode root, ProjectElement element, bool
isNonMemberItem)
+ : base(root, element)
+ {
+ IsNonMemberItem = isNonMemberItem;
+
+ _selectionChangedListener =
+ new SelectionElementValueChangedListener(
+ new
ServiceProvider((IOleServiceProvider)root.GetService(typeof(IOleServiceProvider))),
root);
+
+ _selectionChangedListener.Init();
+
+ //((FileNodeProperties)NodeProperties).OnCustomToolChanged +=
OnCustomToolChanged;
+ //((FileNodeProperties)NodeProperties).OnCustomToolNameSpaceChanged +=
OnCustomToolNameSpaceChanged;
+
+ // HasDesigner property is not virtual, so we have to set it up in the
ctor.
+ InferHasDesignerFromSubType();
+ }
#endregion
#region Fields
SelectionElementValueChangedListener _selectionChangedListener;
- NemerleOAFileItem _automationObject;
+ NemerleOAFileItem _automationObject;
#endregion
@@ -76,20 +76,20 @@
set { ItemNode.SetMetadata(ProjectFileConstants.SubType, value); }
}
- private OAVSProjectItem _vsProjectItem;
- protected internal VSProjectItem VSProjectItem
+ private OAVSProjectItem _vsProjectItem;
+ protected internal VSProjectItem VSProjectItem
{
get { return _vsProjectItem ?? (_vsProjectItem = new
OAVSProjectItem(this)); }
}
- private NemerleFileNodeCodeDomProvider _codeDomProvider;
- protected internal NemerleFileNodeCodeDomProvider CodeDomProvider
+ private NemerleFileNodeCodeDomProvider _codeDomProvider;
+ protected internal NemerleFileNodeCodeDomProvider CodeDomProvider
{
get { return _codeDomProvider ?? (_codeDomProvider = new
NemerleFileNodeCodeDomProvider(this)); }
}
- private DesignerContext _designerContext;
- protected internal DesignerContext DesignerContext
+ private DesignerContext _designerContext;
+ protected internal DesignerContext DesignerContext
{
get
{
@@ -97,6 +97,10 @@
{
NemerleFileNode nFile = Parent.FindChild(Url.Replace(".xaml", ".n"))
as NemerleFileNode;
+ if (nFile == null)
+ nFile = Parent.FindChild(Path.ChangeExtension(Url, ".Designer.n"))
as NemerleFileNode;
+
+
//Set the EventBindingProvider for this XAML file so the designer
will call it
//when event handlers need to be generated
_designerContext = new DesignerContext { EventBindingProvider = new
NemerleEventBindingProvider(nFile) };
@@ -108,172 +112,172 @@
#endregion
- #region IProjectSourceNode members
-
- private bool _isNonMemberItem;
- /// <summary>
- /// Flag that indicates if this node is not a member of the
project.
- /// </summary>
- /// <value>true if the item is not a member of the project build,
false otherwise.</value>
- public bool IsNonMemberItem
- {
- get { return _isNonMemberItem; }
- private set { _isNonMemberItem = value; }
- }
-
- /// <summary>
- /// Exclude the item from the project system.
- /// </summary>
- /// <returns>Returns success or failure code.</returns>
-
[SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
- int IProjectSourceNode.ExcludeFromProject()
- {
- if (ProjectMgr == null || ProjectMgr.IsClosed)
- return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED;
-
- if (IsNonMemberItem)
- return VSConstants.S_OK; // do nothing, just ignore it.
-
- ((NemerlePackage) ProjectMgr.Package).SetWaitCursor();
- // Ask Document tracker listeners if we can remove the
item.
- { // just to limit the scope.
- string documentToRemove = GetMkDocument();
- string[] filesToBeDeleted = new[] { documentToRemove };
- VSQUERYREMOVEFILEFLAGS[] queryRemoveFlags =
GetQueryRemoveFileFlags(filesToBeDeleted);
- if
(!ProjectMgr.Tracker.CanRemoveItems(filesToBeDeleted, queryRemoveFlags))
- return (int)OleConstants.OLECMDERR_E_CANCELED;
-
- // Close the document if it has a manager.
- DocumentManager manager = GetDocumentManager();
- if (manager != null)
- {
- if
(manager.Close(__FRAMECLOSE.FRAMECLOSE_PromptSave) == VSConstants.E_ABORT)
- return VSConstants.OLE_E_PROMPTSAVECANCELLED;
- }
-
- if (!ProjectMgr.QueryEditProjectFile(false))
- throw
Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED);
- }
-
- // close the document window if open.
- CloseDocumentWindow(this);
-
- NemerleProjectNode projectNode = ProjectMgr as
NemerleProjectNode;
-
- if (projectNode != null && projectNode.ShowAllFilesEnabled
&& File.Exists(Url))
- {
- string url = Url; // need to store before removing the
node.
- ItemNode.RemoveFromProjectFile();
- ProjectMgr.Tracker.OnItemRemoved(url,
VSREMOVEFILEFLAGS.VSREMOVEFILEFLAGS_NoFlags);
-
SetProperty((int)__VSHPROPID.VSHPROPID_IsNonMemberItem, true); // Set it as
non member item
- ItemNode = new ProjectElement(ProjectMgr, null, true);
// now we have to set a new ItemNode to indicate that this is virtual node.
- ItemNode.Rename(url);
- ItemNode.SetMetadata(ProjectFileConstants.Name, url);
-
- //ProjectMgr.OnItemDeleted();
-
- ReDraw(UIHierarchyElement.Icon); // We have to redraw
the icon of the node as it is now not a member of the project and should be
drawn using a different icon.
- ReDraw(UIHierarchyElement.SccState); // update the SCC
state icon.
- }
- else if (Parent != null) // the project node has no
parentNode
- {
- // Remove from the Hierarchy
- OnItemDeleted();
- Parent.RemoveChild(this);
- ItemNode.RemoveFromProjectFile();
- }
-
- ResetProperties();
-
- HierarchyHelpers.RefreshPropertyBrowser(this);
-
- return VSConstants.S_OK;
- }
-
- /// <summary>
- /// Include the item into the project system.
- /// </summary>
- /// <returns>Returns success or failure code.</returns>
-
[SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
- int IProjectSourceNode.IncludeInProject()
- {
- NemerleProjectNode projectNode = ProjectMgr as
NemerleProjectNode;
- if (projectNode == null || projectNode.IsClosed)
- return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED;
-
- if (!IsNonMemberItem)
- return VSConstants.S_OK;
-
- ((NemerlePackage)ProjectMgr.Package).SetWaitCursor();
-
- // Check out the project file.
- if (!projectNode.QueryEditProjectFile(false))
- throw
Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED);
-
- HierarchyHelpers.EnsureParentFolderIncluded(this);
-
- SetProperty((int)__VSHPROPID.VSHPROPID_IsNonMemberItem, false);
-
- ItemNode = projectNode.CreateMsBuildFileProjectElement(Url);
- ProjectMgr.Tracker.OnItemAdded(Url,
VSADDFILEFLAGS.VSADDFILEFLAGS_NoFlags);
-
- //projectNode.OnItemAdded(Parent, this);
-
- ReDraw(UIHierarchyElement.Icon); // We have to redraw the icon
of the node as it is now a member of the project and should be drawn using
a different icon.
- ReDraw(UIHierarchyElement.SccState); // update the SCC state
icon.
-
- ResetProperties();
-
- HierarchyHelpers.RefreshPropertyBrowser(this);
-
- return VSConstants.S_OK;
- }
-
- /// <summary>
- /// Resets the Node properties for file node item.
- /// </summary>
- protected void ResetProperties()
- {
- bool changed = false;
-
- if (IsNonMemberItem)
- {
- if (!(_currentNodeProperties is
NemerleFileNodeNonMemberProperties))
- {
- _currentNodeProperties = new
NemerleFileNodeNonMemberProperties(this);
- changed = true;
- }
- }
- else
- {
- if (!(_currentNodeProperties is NemerleFileNodeProperties))
- {
- _currentNodeProperties = new
NemerleFileNodeProperties(this);
- changed = true;
- }
- }
-
- if (changed)
- OnPropertyChanged(this,
(int)__VSHPROPID.VSHPROPID_BrowseObject, 0);
- }
-
- /// <summary>
- /// Include the item into the project system recursively.
- /// </summary>
- /// <param name="recursive">Flag that indicates if the inclusion
should be recursive or not.</param>
- /// <returns>Returns success or failure code.</returns>
-
[SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
- int IProjectSourceNode.IncludeInProject(bool recursive)
- {
- // recursive doesn't make any sense in case of a file item. so
just include this item.
- return ((IProjectSourceNode)this).IncludeInProject();
- }
-
- #endregion
-
- #region Overridden Properties
-
- protected internal override DocumentManager GetDocumentManager()
+ #region IProjectSourceNode members
+
+ private bool _isNonMemberItem;
+ /// <summary>
+ /// Flag that indicates if this node is not a member of the project.
+ /// </summary>
+ /// <value>true if the item is not a member of the project build, false
otherwise.</value>
+ public bool IsNonMemberItem
+ {
+ get { return _isNonMemberItem; }
+ private set { _isNonMemberItem = value; }
+ }
+
+ /// <summary>
+ /// Exclude the item from the project system.
+ /// </summary>
+ /// <returns>Returns success or failure code.</returns>
+
[SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
+ int IProjectSourceNode.ExcludeFromProject()
+ {
+ if (ProjectMgr == null || ProjectMgr.IsClosed)
+ return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED;
+
+ if (IsNonMemberItem)
+ return VSConstants.S_OK; // do nothing, just ignore it.
+
+ ((NemerlePackage)ProjectMgr.Package).SetWaitCursor();
+ // Ask Document tracker listeners if we can remove the item.
+ { // just to limit the scope.
+ string documentToRemove = GetMkDocument();
+ string[] filesToBeDeleted = new[] { documentToRemove };
+ VSQUERYREMOVEFILEFLAGS[] queryRemoveFlags =
GetQueryRemoveFileFlags(filesToBeDeleted);
+ if (!ProjectMgr.Tracker.CanRemoveItems(filesToBeDeleted,
queryRemoveFlags))
+ return (int)OleConstants.OLECMDERR_E_CANCELED;
+
+ // Close the document if it has a manager.
+ DocumentManager manager = GetDocumentManager();
+ if (manager != null)
+ {
+ if (manager.Close(__FRAMECLOSE.FRAMECLOSE_PromptSave) ==
VSConstants.E_ABORT)
+ return VSConstants.OLE_E_PROMPTSAVECANCELLED;
+ }
+
+ if (!ProjectMgr.QueryEditProjectFile(false))
+ throw
Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED);
+ }
+
+ // close the document window if open.
+ CloseDocumentWindow(this);
+
+ NemerleProjectNode projectNode = ProjectMgr as NemerleProjectNode;
+
+ if (projectNode != null && projectNode.ShowAllFilesEnabled &&
File.Exists(Url))
+ {
+ string url = Url; // need to store before removing the node.
+ ItemNode.RemoveFromProjectFile();
+ ProjectMgr.Tracker.OnItemRemoved(url,
VSREMOVEFILEFLAGS.VSREMOVEFILEFLAGS_NoFlags);
+ SetProperty((int)__VSHPROPID.VSHPROPID_IsNonMemberItem, true); // Set
it as non member item
+ ItemNode = new ProjectElement(ProjectMgr, null, true); // now we have
to set a new ItemNode to indicate that this is virtual node.
+ ItemNode.Rename(url);
+ ItemNode.SetMetadata(ProjectFileConstants.Name, url);
+
+ //ProjectMgr.OnItemDeleted();
+
+ ReDraw(UIHierarchyElement.Icon); // We have to redraw the icon of the
node as it is now not a member of the project and should be drawn using a
different icon.
+ ReDraw(UIHierarchyElement.SccState); // update the SCC state icon.
+ }
+ else if (Parent != null) // the project node has no parentNode
+ {
+ // Remove from the Hierarchy
+ OnItemDeleted();
+ Parent.RemoveChild(this);
+ ItemNode.RemoveFromProjectFile();
+ }
+
+ ResetProperties();
+
+ HierarchyHelpers.RefreshPropertyBrowser(this);
+
+ return VSConstants.S_OK;
+ }
+
+ /// <summary>
+ /// Include the item into the project system.
+ /// </summary>
+ /// <returns>Returns success or failure code.</returns>
+
[SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
+ int IProjectSourceNode.IncludeInProject()
+ {
+ NemerleProjectNode projectNode = ProjectMgr as NemerleProjectNode;
+ if (projectNode == null || projectNode.IsClosed)
+ return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED;
+
+ if (!IsNonMemberItem)
+ return VSConstants.S_OK;
+
+ ((NemerlePackage)ProjectMgr.Package).SetWaitCursor();
+
+ // Check out the project file.
+ if (!projectNode.QueryEditProjectFile(false))
+ throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED);
+
+ HierarchyHelpers.EnsureParentFolderIncluded(this);
+
+ SetProperty((int)__VSHPROPID.VSHPROPID_IsNonMemberItem, false);
+
+ ItemNode = projectNode.CreateMsBuildFileProjectElement(Url);
+ ProjectMgr.Tracker.OnItemAdded(Url,
VSADDFILEFLAGS.VSADDFILEFLAGS_NoFlags);
+
+ //projectNode.OnItemAdded(Parent, this);
+
+ ReDraw(UIHierarchyElement.Icon); // We have to redraw the icon of the
node as it is now a member of the project and should be drawn using a
different icon.
+ ReDraw(UIHierarchyElement.SccState); // update the SCC state icon.
+
+ ResetProperties();
+
+ HierarchyHelpers.RefreshPropertyBrowser(this);
+
+ return VSConstants.S_OK;
+ }
+
+ /// <summary>
+ /// Resets the Node properties for file node item.
+ /// </summary>
+ protected void ResetProperties()
+ {
+ bool changed = false;
+
+ if (IsNonMemberItem)
+ {
+ if (!(_currentNodeProperties is NemerleFileNodeNonMemberProperties))
+ {
+ _currentNodeProperties = new NemerleFileNodeNonMemberProperties(this);
+ changed = true;
+ }
+ }
+ else
+ {
+ if (!(_currentNodeProperties is NemerleFileNodeProperties))
+ {
+ _currentNodeProperties = new NemerleFileNodeProperties(this);
+ changed = true;
+ }
+ }
+
+ if (changed)
+ OnPropertyChanged(this, (int)__VSHPROPID.VSHPROPID_BrowseObject, 0);
+ }
+
+ /// <summary>
+ /// Include the item into the project system recursively.
+ /// </summary>
+ /// <param name="recursive">Flag that indicates if the inclusion should
be recursive or not.</param>
+ /// <returns>Returns success or failure code.</returns>
+
[SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
+ int IProjectSourceNode.IncludeInProject(bool recursive)
+ {
+ // recursive doesn't make any sense in case of a file item. so just
include this item.
+ return ((IProjectSourceNode)this).IncludeInProject();
+ }
+
+ #endregion
+
+ #region Overridden Properties
+
+ protected internal override DocumentManager GetDocumentManager()
{
return new NemerleFileDocumentManager(this);
}
@@ -292,41 +296,41 @@
}
}
- private NodeProperties _currentNodeProperties;
- /// <summary>
- /// Defines the properties attached to this node.
- /// </summary>
- /// <value>Defines the properties attached to this node.</value>
- public override NodeProperties NodeProperties
- {
- // This should be removed once we have setter in
NodeProperties property in HierarchyNode (MPF).
- get
- {
- if (_currentNodeProperties == null)
- _currentNodeProperties = CreatePropertiesObject();
- return _currentNodeProperties;
- }
- }
-
-
- /// <summary>
- /// Gets an index into the default <b>ImageList</b> of the icon to
show for this file.
- /// </summary>
- /// <value>An index into the default <b>ImageList</b> of the icon
to show for this file.</value>
- public override int ImageIndex
- {
- get
- {
- if (IsNonMemberItem)
- return (int)ProjectNode.ImageName.ExcludedFile;
-
- if (!File.Exists(Url))
- return (int)ProjectNode.ImageName.MissingFile;
-
- return base.ImageIndex;
- }
- }
-
+ private NodeProperties _currentNodeProperties;
+ /// <summary>
+ /// Defines the properties attached to this node.
+ /// </summary>
+ /// <value>Defines the properties attached to this node.</value>
+ public override NodeProperties NodeProperties
+ {
+ // This should be removed once we have setter in NodeProperties
property in HierarchyNode (MPF).
+ get
+ {
+ if (_currentNodeProperties == null)
+ _currentNodeProperties = CreatePropertiesObject();
+ return _currentNodeProperties;
+ }
+ }
+
+
+ /// <summary>
+ /// Gets an index into the default <b>ImageList</b> of the icon to show
for this file.
+ /// </summary>
+ /// <value>An index into the default <b>ImageList</b> of the icon to
show for this file.</value>
+ public override int ImageIndex
+ {
+ get
+ {
+ if (IsNonMemberItem)
+ return (int)ProjectNode.ImageName.ExcludedFile;
+
+ if (!File.Exists(Url))
+ return (int)ProjectNode.ImageName.MissingFile;
+
+ return base.ImageIndex;
+ }
+ }
+
#endregion
#region overridden methods
@@ -341,7 +345,7 @@
public override object GetAutomationObject()
{
- if(_automationObject == null)
+ if (_automationObject == null)
{
_automationObject = new
NemerleOAFileItem((OAProject)ProjectMgr.GetAutomationObject(), this);
}
@@ -355,10 +359,10 @@
{
if (FileName.EndsWith(NemerleConstants.FileExtension,
StringComparison.InvariantCultureIgnoreCase))
{
- int imageIndex = HasDesigner?
- NemerleConstants.ImageListIndex.NemerleForm:
+ int imageIndex = HasDesigner ?
+ NemerleConstants.ImageListIndex.NemerleForm :
NemerleConstants.ImageListIndex.NemerleSource;
- return
+ return
PackageUtilities.GetIntPointerFromImage(NemerleProjectNode.NemerleImageList.Images[imageIndex]);
}
@@ -386,20 +390,20 @@
{
Debug.Assert(ProjectMgr != null, "The NemerleFileNode has no project
manager");
- if (ProjectMgr == null)
+ if (ProjectMgr == null)
throw new InvalidOperationException();
- if (guidCmdGroup == VsMenus.guidStandardCommandSet2K)
- {
- switch ((VsCommands2K)cmd)
- {
- case VsCommands2K.INCLUDEINPROJECT:
- return
((IProjectSourceNode)this).IncludeInProject();
-
- case VsCommands2K.EXCLUDEFROMPROJECT:
- return
((IProjectSourceNode)this).ExcludeFromProject();
- }
- }
+ if (guidCmdGroup == VsMenus.guidStandardCommandSet2K)
+ {
+ switch ((VsCommands2K)cmd)
+ {
+ case VsCommands2K.INCLUDEINPROJECT:
+ return ((IProjectSourceNode)this).IncludeInProject();
+
+ case VsCommands2K.EXCLUDEFROMPROJECT:
+ return ((IProjectSourceNode)this).ExcludeFromProject();
+ }
+ }
if (guidCmdGroup == MenuCmd.guidNemerleProjectCmdSet && cmd ==
(uint)
MenuCmd.SetAsMain.ID)
{
@@ -419,10 +423,10 @@
protected override int QueryStatusOnNode(
Guid guidCmdGroup, uint cmd, IntPtr pCmdText, ref QueryStatusResult
result)
{
- int returnCode;
- if (HierarchyHelpers.QueryStatusOnProjectSourceNode(this,
guidCmdGroup, cmd, ref result, out returnCode))
- return returnCode;
-
+ int returnCode;
+ if (HierarchyHelpers.QueryStatusOnProjectSourceNode(this, guidCmdGroup,
cmd, ref result, out returnCode))
+ return returnCode;
+
if (guidCmdGroup == VsMenus.guidStandardCommandSet97)
{
switch ((VsCommands)cmd)
@@ -445,64 +449,64 @@
result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED;
return VSConstants.S_OK;
}
-
- return base.QueryStatusOnNode(guidCmdGroup, cmd, pCmdText, ref
result);
+
+ return base.QueryStatusOnNode(guidCmdGroup, cmd, pCmdText, ref result);
}
protected override NodeProperties CreatePropertiesObject()
{
- if (IsNonMemberItem)
- return new NemerleFileNodeNonMemberProperties(this);
+ if (IsNonMemberItem)
+ return new NemerleFileNodeNonMemberProperties(this);
return new NemerleFileNodeProperties(this);
}
- /// <summary>
- /// Sets the node property.
- /// </summary>
- /// <param name="propid">Property id.</param>
- /// <param name="value">Property value.</param>
- /// <returns>Returns success or failure code.</returns>
- public override int SetProperty(int propid, object value)
- {
- if ((__VSHPROPID) propid ==
__VSHPROPID.VSHPROPID_IsNonMemberItem)
- {
- ErrorHelper.ThrowIsNull(value, "value");
-
- IsNonMemberItem = bool.Parse(value.ToString());
- ExcludeNodeFromScc = IsNonMemberItem;
-
- return VSConstants.S_OK;
- }
-
- return base.SetProperty(propid, value);
- }
-
- /// <summary>
- /// Gets the node property.
- /// </summary>
- /// <param name="propId">Property id.</param>
- /// <returns>The property value.</returns>
- public override object GetProperty(int propId)
- {
- if ((__VSHPROPID)propId ==
__VSHPROPID.VSHPROPID_IsNonMemberItem)
- return IsNonMemberItem;
-
- return base.GetProperty(propId);
- }
-
- /// <summary>
- /// Provides the node name for inline editing of caption.
- /// Overriden to diable this fuctionality for non member fodler
node.
- /// </summary>
- /// <returns>Caption of the file node if the node is a member
item, null otherwise.</returns>
- public override string GetEditLabel()
- {
- if (IsNonMemberItem)
- return null;
-
- return base.GetEditLabel();
- }
+ /// <summary>
+ /// Sets the node property.
+ /// </summary>
+ /// <param name="propid">Property id.</param>
+ /// <param name="value">Property value.</param>
+ /// <returns>Returns success or failure code.</returns>
+ public override int SetProperty(int propid, object value)
+ {
+ if ((__VSHPROPID)propid == __VSHPROPID.VSHPROPID_IsNonMemberItem)
+ {
+ ErrorHelper.ThrowIsNull(value, "value");
+
+ IsNonMemberItem = bool.Parse(value.ToString());
+ ExcludeNodeFromScc = IsNonMemberItem;
+
+ return VSConstants.S_OK;
+ }
+
+ return base.SetProperty(propid, value);
+ }
+
+ /// <summary>
+ /// Gets the node property.
+ /// </summary>
+ /// <param name="propId">Property id.</param>
+ /// <returns>The property value.</returns>
+ public override object GetProperty(int propId)
+ {
+ if ((__VSHPROPID)propId == __VSHPROPID.VSHPROPID_IsNonMemberItem)
+ return IsNonMemberItem;
+
+ return base.GetProperty(propId);
+ }
+
+ /// <summary>
+ /// Provides the node name for inline editing of caption.
+ /// Overriden to diable this fuctionality for non member fodler node.
+ /// </summary>
+ /// <returns>Caption of the file node if the node is a member item, null
otherwise.</returns>
+ public override string GetEditLabel()
+ {
+ if (IsNonMemberItem)
+ return null;
+
+ return base.GetEditLabel();
+ }
#endregion
@@ -525,17 +529,38 @@
protected string GetRelativePath()
{
- string relativePath =
Path.GetFileName(ItemNode.GetMetadata(ProjectFileConstants.Include));
- HierarchyNode parent = Parent;
+ string relativePath =
Path.GetFileName(ItemNode.GetMetadata(ProjectFileConstants.Include));
+ HierarchyNode parent = Parent;
while (parent != null && !(parent is ProjectNode))
{
relativePath = Path.Combine(parent.Caption, relativePath);
- parent = parent.Parent;
+ parent = parent.Parent;
}
return relativePath;
}
+
+ #endregion
+
+ #region Members
+
+ internal OleServiceProvider.ServiceCreatorCallback ServiceCreator
+ {
+ get { return new
OleServiceProvider.ServiceCreatorCallback(this.CreateServices); }
+ }
+
+ private object CreateServices(Type serviceType)
+ {
+ object service = null;
+
+ if (typeof(EnvDTE.ProjectItem) == serviceType)
+ service = GetAutomationObject();
+ else if (typeof(DesignerContext) == serviceType)
+ service = this.DesignerContext;
+
+ return service;
+ }
#endregion
}
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleFileNodeCodeDomProvider.cs
Wed Nov 11 12:09:20 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleFileNodeCodeDomProvider.cs
Tue Nov 17 10:35:06 2009
@@ -2,7 +2,7 @@
using System.IO;
using System.CodeDom;
using System.CodeDom.Compiler;
-
+using System.Linq;
using System.Runtime.InteropServices;
using Microsoft.VisualStudio;
@@ -13,9 +13,11 @@
using Nemerle.Compiler;
using NCU = Nemerle.Compiler.Utils;
+using CodeGenerator = Nemerle.Compiler.Utils.FormCodeDomGenerator;
using Nemerle.VisualStudio.LanguageService;
using System.Diagnostics;
+using Nemerle.VisualStudio.Helpers;
namespace Nemerle.VisualStudio.Project
{
@@ -194,7 +196,7 @@
public override CodeCompileUnit Parse(TextReader codeStream)
{
- var code = codeStream.ReadToEnd();
+ //var code = codeStream.ReadToEnd();
// AKhropov - in fact codeStream is ignored for now
string mainFilePath = PathOfMainFile();
@@ -203,8 +205,15 @@
if (projectInfo != null)
{
var designerIndex = Location.GetFileIndex(PathOfDesignerFile());
-
- return
projectInfo.Engine.CreateCodeCompileUnit(projectInfo.GetSource(mainFilePath),
designerIndex);
+ var source = projectInfo.GetSource(mainFilePath);
+ var nSource = source as NemerleSource;
+ if (nSource != null)
+ {
+ //var xx =
Site.GetService(typeof(Microsoft.VisualStudio.Shell.Design.Serialization.DesignerDocDataService));
+ //var xx =
source.Service.GetService(typeof(Microsoft.VisualStudio.Shell.Design.Serialization.DesignerDocDataService));
+ //var xx =
_fileNode.GetService(typeof(System.ComponentModel.Design.Serialization.IDesignerLoaderHost));
+ }
+ return projectInfo.Engine.CreateCodeCompileUnit(source, designerIndex);
// TODO : can _project change for _fileNode?
//return _codeDomParser.CreateCodeCompileUnit(
// projectInfo.Project, mainFilePath,
@@ -230,8 +239,29 @@
var changes =
projectInfo.Engine.MergeCodeCompileUnit(codeCompileUnit);
- foreach (var item in changes)
- Trace.WriteLine(item);
+ using (var helper = new
NemerleProjectSourcesButchEditHelper(projectInfo, "form designer update"))
+ {
+ var text =
CodeGenerator.ToString(changes.NewInitializeComponentStatements);
+ // обновляем исходники...
+ helper.ReplaseMethodBody(changes.InitializeComponent, text);
+
+ helper.ApplyEdits();
+ }
+
+
+
+ //var baseFileIndex =
changes.InitializeComponent.NameLocation.FileIndex;
+
+ //var fileInexes = new[] { baseFileIndex }
+ // .Concat(changes.DelitedFields.Select(f =>
f.Location.FileIndex)).Distinct()
+ // .ToArray();
+
+ //var sourcesMap = fileInexes.ToDictionary(x => x, x =>
+ // projectInfo.GetEditableSource(x, WindowFrameShowAction.DoNotShow));
+
+ //var editArraysMap = sourcesMap.ToDictionary(x => x.Key,
+ // x => new NemerleSourceButchEditHelper(x.Value, null, true, ""));
+
//if (IsFormSubType)
//{
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleFileNodeProperties.cs
Tue Nov 10 12:44:15 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleFileNodeProperties.cs
Tue Nov 17 10:35:06 2009
@@ -19,7 +19,12 @@
public new string Extension
{
- get { return Path.GetExtension(Node.Url); }
+ get
+ {
+ //throw new NotImplementedException();
+ //return ".Designer.n";
+ return Path.GetExtension(Node.Url);
+ }
}
[Browsable(false)]
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleProjectNode.cs
Tue Nov 10 12:44:15 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/NemerleProjectNode.cs
Tue Nov 17 10:35:06 2009
@@ -220,6 +220,7 @@
}
private DesignerContext _designerContext;
+
protected internal DesignerContext DesignerContext
{
get
@@ -227,8 +228,20 @@
//Set the RuntimeNameProvider so the XAML designer will call it
when items are added to
//a design surface. Since the provider does not depend on an item
context, we provide it at
//the project level.
- return _designerContext ??
- (_designerContext = new DesignerContext() { RuntimeNameProvider
= new NemerleRuntimeNameProvider() });
+
+ if (_designerContext != null)
+ return _designerContext;
+
+
+ _designerContext =
+ new DesignerContext()
+ {
+ RuntimeNameProvider = new NemerleRuntimeNameProvider(),
+ //EventBindingProvider = new NemerleEventBindingProvider()
+
+ };
+
+ return _designerContext;
}
}
@@ -797,20 +810,25 @@
string include = item.GetMetadata(ProjectFileConstants.Include);
- newNode.OleServiceProvider.AddService(typeof(EnvDTE.Project),
ProjectMgr.GetAutomationObject(), false);
- newNode.OleServiceProvider.AddService(typeof(EnvDTE.ProjectItem),
newNode.GetAutomationObject(), false);
- newNode.OleServiceProvider.AddService(typeof(VSLangProj.VSProject),
this.VSProject, false);
-
- //VladD2: Ýòîò êîä (äîáàâëåíèÿ CodeDomProvider-à) äèêî òîðìîçèë, òàê
êàê äëÿ êàæäîãî
- // ôàéëà ïðîåêòà ñîçäàâàëñÿ îäòåäëüíûé ýêçåïëÿð ïðîâàéäåðà.
Ïðîâàéäåð çà êàêèì-òî ÷åðîòîì
- // óíàñëåäîâàí îò ManagerClass è êàæäûé ðàç èíèöèàëèçèðóåò
êîìïèëÿòîð (ãðóçèò âñå òèïû).
- //TODO: Ïåðåïèñàòü CodeDomProvider òàê ÷òîáû îí èñïîëüçîâàë ñèñòåìó
òèïîâ ïðîåêòà, íå ñîçäàâàë
- // åùå êó÷è ManagerClass. Òàê æå îðãàíèçîâàòü îòëîæåííóþ
èíèöèàëèçàóèþ, òàê ÷òîáû îíà ïðîèñõäèëà
- // òîëüêî êîãäà CodeDomProvider çàïðàøèâàåòñÿ ñòóäèåé.
+ var provider = newNode.OleServiceProvider;
+
+ provider.AddService(typeof(EnvDTE.Project),
ProjectMgr.GetAutomationObject(), false);
+ provider.AddService(typeof(EnvDTE.ProjectItem), newNode.ServiceCreator,
false);
+ provider.AddService(typeof(VSLangProj.VSProject), this.VSProject,
false);
+
+ if (!string.IsNullOrEmpty(include) &&
Path.GetExtension(include).Equals(".xaml",
StringComparison.OrdinalIgnoreCase))
+ {
+ //Create a DesignerContext for the XAML designer for this file
+ newNode.OleServiceProvider.AddService(typeof(DesignerContext),
newNode.ServiceCreator, false);
+ }
+
+ if (newNode.IsFormSubType)
+ {
+ newNode.OleServiceProvider.AddService(typeof(DesignerContext),
newNode.ServiceCreator, false);
+ }
if (IsCodeFile(include) && item.ItemName == "Compile")
- newNode.OleServiceProvider.AddService(typeof(SVSMDCodeDomProvider),
- new NemerleVSMDProvider(newNode), false);
+ provider.AddService(typeof(SVSMDCodeDomProvider), new
NemerleVSMDProvider(newNode), false);
return newNode;
}
@@ -827,9 +845,11 @@
NemerleDependentFileNode newNode = new
NemerleDependentFileNode(this, item);
string include = item.GetMetadata(ProjectFileConstants.Include);
- newNode.OleServiceProvider.AddService(typeof(EnvDTE.Project),
ProjectMgr.GetAutomationObject(), false);
- newNode.OleServiceProvider.AddService(typeof(EnvDTE.ProjectItem),
newNode.GetAutomationObject(), false);
- newNode.OleServiceProvider.AddService(typeof(VSLangProj.VSProject),
this.VSProject, false);
+ var provider = newNode.OleServiceProvider;
+
+ provider.AddService(typeof(EnvDTE.Project),
ProjectMgr.GetAutomationObject(), false);
+ provider.AddService(typeof(EnvDTE.ProjectItem),
newNode.GetAutomationObject(), false);
+ provider.AddService(typeof(VSLangProj.VSProject), this.VSProject,
false);
if (IsCodeFile(include) && item.ItemName == "Compile")
newNode.OleServiceProvider.AddService(typeof(SVSMDCodeDomProvider),
@@ -1213,5 +1233,52 @@
}
#endregion
- }
-}
+
+ #region Methods
+
+ //TODO: VladD2: Ðåàëèçîâàòü êîä-äîì-ïðîâàéäåð äëÿ ïðîåêòà.
+
+ //private
Microsoft.VisualStudio.Designer.Interfaces.IVSMDCodeDomProvider
_codeDomProvider;
+ //
+ ///// <summary>
+ ///// Retreive the CodeDOM provider
+ ///// </summary>
+ //protected internal
Microsoft.VisualStudio.Designer.Interfaces.IVSMDCodeDomProvider
CodeDomProvider
+ //{
+ // get
+ // {
+ // if (_codeDomProvider == null)
+ // _codeDomProvider = new VSMDPythonProvider(this.VSProject);
+ // return _codeDomProvider;
+ // }
+ //}
+
+ internal OleServiceProvider.ServiceCreatorCallback ServiceCreator
+ {
+ get { return new
OleServiceProvider.ServiceCreatorCallback(this.CreateServices); }
+ }
+
+ /// <summary>
+ /// Creates the services exposed by this project.
+ /// </summary>
+ private object CreateServices(Type serviceType)
+ {
+ object service = null;
+ //if (typeof(SVSMDCodeDomProvider) == serviceType)
+ // service = this.CodeDomProvider;
+ //else if (typeof(System.CodeDom.Compiler.CodeDomProvider) ==
serviceType)
+ // service = this.CodeDomProvider.CodeDomProvider;
+ //else
+ if (typeof(DesignerContext) == serviceType)
+ service = this.DesignerContext;
+ else if (typeof(VSLangProj.VSProject) == serviceType)
+ service = this.VSProject;
+ else if (typeof(EnvDTE.Project) == serviceType)
+ service = this.GetAutomationObject();
+
+ return service;
+ }
+
+ #endregion
+ }
+}
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/ProjectInfo.cs
Wed Oct 28 21:02:28 2009
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Project/ProjectInfo.cs
Tue Nov 17 10:35:06 2009
@@ -241,6 +241,75 @@
_sourceMap.Remove(source.FileIndex);
_sources.Remove(source);
}
+
+
+
+ public NemerleSource GetEditableSource(int fileIndex,
WindowFrameShowAction action)
+ {
+ ISource source;
+
+ if (!_sourceMap.TryGetValue(fileIndex, out source))
+ throw new ApplicationException("File not in project");
+
+ var nemerleSource = source as NemerleSource;
+
+ if (nemerleSource != null)
+ return nemerleSource;
+
+ return OpenEditableSource(fileIndex, action);
+ }
+
+ NemerleSource OpenEditableSource(int fileIndex, WindowFrameShowAction
action)
+ {
+ IVsWindowFrame frame = OpenWindowFrame(fileIndex, action);
+
+ if (frame == null)
+ throw new ApplicationException("frame (IVsWindowFrame) is null");
+
+ object docData;
+ frame.GetProperty((int)__VSFPROPID.VSFPROPID_DocData, out docData);
+
+ // Get the VsTextBuffer
+ var buffer = docData as VsTextBuffer;
+
+ if (buffer == null)
+ {
+ var bufferProvider = docData as IVsTextBufferProvider;
+
+ if (bufferProvider != null)
+ {
+ IVsTextLines lines;
+ ErrorHandler.ThrowOnFailure(bufferProvider.GetTextBuffer(out lines));
+
+ var source = LanguageService.CreateSource(lines);
+
+ return (NemerleSource)source;
+ }
+ }
+ else
+ {
+ var lines = (IVsTextLines)buffer;
+ var source = LanguageService.CreateSource(lines);
+ return (NemerleSource)source;
+ }
+
+
+ throw new ApplicationException("can't retrive IVsTextLines from
IVsWindowFrame");
+ }
+
+ IVsWindowFrame OpenWindowFrame(int fileIndex, WindowFrameShowAction
action)
+ {
+ var path = Location.GetFileName(fileIndex);
+ var node = (FileNode)_projectNode.FindChild(path);
+ var manager = (FileDocumentManager)node.GetDocumentManager();
+
+ IVsWindowFrame frame;
+ // Open the document in rdt.
+ ErrorHandler.ThrowOnFailure(manager.Open(false, false,
VSConstants.LOGVIEWID_Code,
+ out frame, action));
+
+ return frame;
+ }
public ISource GetSource(int fileIndex)
{
=======================================
--- /nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Utils.cs Mon Oct 26
02:38:15 2009
+++ /nemerle/trunk/VsIntegration/Nemerle.VisualStudio/Utils.cs Tue Nov 17
10:35:06 2009
@@ -203,6 +203,30 @@
return span;
}
+
+ public static TextSpan ToTextSpan(this TextPoint point)
+ {
+ TextSpan span = new TextSpan();
+
+ span.iStartLine = point.Line - 1;
+ span.iStartIndex = point.Column - 1;
+ span.iEndLine = point.Line - 1;
+ span.iEndIndex = point.Column - 1;
+
+ return span;
+ }
+
+ public static TextSpan ToTextSpan(TextPoint startPoint, TextPoint
endPoint)
+ {
+ TextSpan span = new TextSpan();
+
+ span.iStartLine = startPoint.Line - 1;
+ span.iStartIndex = startPoint.Column - 1;
+ span.iEndLine = endPoint.Line - 1;
+ span.iEndIndex = endPoint.Column - 1;
+
+ return span;
+ }
public static int GetGlyph(TopDeclaration decl)
{
=======================================
---
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/WPFProviders/NemerleEventBindingProvider.cs
Tue Apr 8 20:31:06 2008
+++
/nemerle/trunk/VsIntegration/Nemerle.VisualStudio/WPFProviders/NemerleEventBindingProvider.cs
Tue Nov 17 10:35:06 2009
@@ -15,6 +15,7 @@
using Microsoft.Windows.Design.Host;
using Nemerle.VisualStudio.Project;
+using Microsoft.VisualStudio.Project;
namespace Nemerle.VisualStudio.WPFProviders
{
@@ -28,9 +29,9 @@
public class NemerleEventBindingProvider : EventBindingProvider
{
private IVsProject3 _project;
- private NemerleFileNode _nFile;
-
- internal NemerleEventBindingProvider(NemerleFileNode nFile)
+ private FileNode _nFile;
+
+ internal NemerleEventBindingProvider(FileNode nFile)
{
_nFile = nFile;
_project = nFile.ProjectMgr;
@@ -38,6 +39,7 @@
public override bool AddEventHandler(EventDescription eventDescription,
string objectName, string methodName)
{
+ //FixMe: VladD2: Какая-то питоновская чушь! Надо разобраться и
переписать.
const string Init = "__init__";
//This is not the most optimal solution for WPF since we will call
FindLogicalNode for each event handler,
@@ -273,8 +275,8 @@
/// <returns>The CodeDomDocDataAdapter for the .n file that corresponds
to the active xaml file</returns>
CodeDomDocDataAdapter GetDocDataAdapterForNemerleFile()
{
- var codeDom = (new ServiceProvider(_nFile.OleServiceProvider,
true)).GetService(typeof(SVSMDCodeDomProvider)) as IVSMDCodeDomProvider;
- var data = new DocData((_project as
NemerleProjectNode).ProjectMgr.Site, _nFile.Url);
+ var codeDom = (IVSMDCodeDomProvider)(new
ServiceProvider(_nFile.OleServiceProvider,
true)).GetService(typeof(SVSMDCodeDomProvider));
+ var data = new DocData(((NemerleProjectNode)_project).ProjectMgr.Site,
_nFile.Url);
return new CodeDomDocDataAdapter((_project as
NemerleProjectNode).ProjectMgr.Site, data);
}
=======================================
--- /nemerle/trunk/ncc/parsing/AST.n Mon Oct 26 02:38:15 2009
+++ /nemerle/trunk/ncc/parsing/AST.n Tue Nov 17 10:35:06 2009
@@ -327,6 +327,8 @@
public FromEndAsGenerated() : Location
{ Location(_fileIndex | GeneratedMask, EndLine, EndColumn, EndLine,
EndColumn) }
+
+ public Contains(point : TextPoint) : bool { Contains(point.Line,
point.Column) }
public Contains(testLine : int, testCol : int) : bool
{